Está en la página 1de 4

2014/04/05 05:30

1/4

Gua de ejercicios 1

Gua de ejercicios 1
Ejercicio 1
Secuencias de notas a partir de listas. Utilizar las distintas propiedades de las listas de python para hacer secuencias particulares de notas. Para definir una secuencia de notas necesitamos dos listas, una para las alturas y otra para las duraciones. Las notas se dan en valores de nota midi, los cuales pueden ser valores decimales tambin. La nota midi 0 la usamos para denotar un silencio. Las duraciones se dan unidades de negras, es decir 1 negra, 0.5 corchea. El tempo es 60 por default pero se puede cambiar. La consigna es armar una mini pieza, o varios experimentos musicales con estas herramientas. Se entrega un cdigo que tiene que andar y un archivo midi o de sonido segn se desee. Programa de ejemplo. Genera las listas con 5 notas y 5 duraciones, reproduce la secuencia y exporta como midi. from pymam import * notas = [ 69, 74, 78, 74, 69] durs = [0.5, 0.25, 0.5, 0.25, 0.25] score = playsequence(notas,durs) midiwrite(score,"prueba.mid") Para generar secuencias ms complejas podemos aprovechar el manejo de las listas que permite python. # Multiplicar una lista por un numero genera repeticiones notas = [ 69, 70]*5 durs = [0.25, 0.25]*5 playsequence(notas,durs) # Se pueden sumar listas para concatenar notas = [ 69, 70]*4 + [ 81, 82]*4 durs = [ 0.5, 0.5]*4 + [0.25, 0.25]*4 # Vemos el resultado de estas listas print notas print durs # Escuchamos y obtenemos la partitura (score) score = playsequence(notas,durs)
Matemtica Aplicada a la Msica - http://lapso.org/mam/

Last update: 2014/04/03 21:14

guias:1

http://lapso.org/mam/doku.php/guias:1

# Piano roll de la partitura score.plot(doneAction=None) # Generando listas automaticamente # rango de numeros desde el 69 hasta el 81 en pasos de a 3, escala disminuida. notas = range(69,81,3) durs = [0.25]*len(notas) # rango de numeros desde el 69 hasta el 81 en pasos de a 4, escala aumentada. notas = range(69,81,4) durs = [0.25]*len(notas) # espejamos la lista y la concatenamos a la anterior notas = notas + mirror(notas) durs = [0.25]*len(notas) # 10 notas al azar entre 69 y 81 (el 81 no juega) notas = randint( 69 , 81 , 10)

Ejercicio 2
Sntesis de sonido con arrays. Mediante arrays numricos, generar tonos y envolventes para combinarlos y generar nuevos sonidos. Podemos generar envolventes arbitrarias a partir de amplitudes y tiempos. Utilizando el mismo principio que ADSR, podemos generar rampas lineales arbitrarias etre distintas amplitudes a distintos tiempos. Por otro lado podemos generar tonos a partir de sinusoides o ruido. Combinando todo eso podemos generar nuevos timbres. La consigna es armar 5 sonidos de la duracin que sea. Se entrega un cdigo que tiene que andar y archivos de audio. Programa de ejemplo. from pymam import * # Genera un array de tiempos que arranca en 0s y termina en 0.5s a una frecuencia de sampleo de 44100 (dato opcional) dur = 0.5 t = time_array(0,dur,fs = 44100) # Genera un array x con una tabla sinusoidal con frecuencia de 440 hz s = sin(2*pi*440*t) # Generamos una envolvente tipo coseno de un perodo e = 1-cos(2*pi*t/dur)
http://lapso.org/mam/ Printed on 2014/04/05 05:30

2014/04/05 05:30

3/4

Gua de ejercicios 1

# Aplicamos la envolvente multiplicando por la seal x = e*s # Graficamos la seal plot(t,x) # Reproduce el array x soundsc(x,fs = 44100) wavwrite('sonido.wav',x, fs = 44100) Ejemplos para generar todo tipo de seales. # s e x Tono AM = sin(2*pi*440*t) = sin(2*pi*20*t) = e*s

# portadora # moduladora

# Tono Fase Modulada tipo sirena fase = 30*sin(2*pi*5*t) # moduladora x = sin(2*pi*440*t + fase) # portadora # Tono Fase Modulada tipo sintesis FM fase = sin(2*pi*220*t) x = sin(2*pi*440*t+5*fase) # Sintesis aditiva f0 = 220 #hz n_armonicos = 80 #con esto me aseguro que no va a haber aliasing, 80*220 hz = 17600 hz # Onda cuadrada x = zeros(t.shape)

# primero hay que poner en cero el array.

# luego en un bucle agregamos los armonicos impares, por eso el rango empieza en 1 y va de a 2 pasos. for n in range(1,n_armonicos,2): x = x + sin( 2*pi*t*220*n ) / n # Para ver la onda plot(t,x)

# Generador de ruido x = randn(len(t)) soundsc(x) # Reproduccion a 44100 soundsc(x, 22500) # Si bajamos la frecuencia de sampleo, dura mas la seal y queda filtrada. soundsc(x, 1000)
Matemtica Aplicada a la Msica - http://lapso.org/mam/

Last update: 2014/04/03 21:14

guias:1

http://lapso.org/mam/doku.php/guias:1

# Generador de envolventes arbitrarias amps = [0, 0.8, 0.2, 0.5, 0] durs =[0, 0.01, 0.03, 0.2, 0.1] e,t = envolvente(amps,durs) x = e*sin(2*pi*440*t) plot(t,x) soundsc(x) # Generamos eventos aleatorios con envolventes tipo pulsos amps = [0] durs = [0] for i in range(20): amps = amps + [1,1,0,0] durs = durs + [0.01,abs(randn())*0.1,0.01,0.05] e,t=envolvente(amps,durs) x = e*randn(len(t)) plot(t,x) soundsc(x) 2014/04/03 18:32 Pablo Riera

From: http://lapso.org/mam/ - Matemtica Aplicada a la Msica Permanent link: http://lapso.org/mam/doku.php/guias:1 Last update: 2014/04/03 21:14

http://lapso.org/mam/

Printed on 2014/04/05 05:30