Logo

python y supercollider

Variables dependientes del tiempo

Programación a tiempo

Cuando usted está codificando música en vivo, a menudo querrá que las cosas cambien con el tiempo. Una buena manera de demostrar esto es usando secuencias de acordes. Digamos que tenemos la secuencia C-F-C-G, que podemos representar como la lista de Python [0, 3, 0, 4], y queremos tocar los acordes para 8 tiempos cada uno pero con un jugador que esté tocando notas cada cuarto de compás. ¿Cómo lo hacemos? Una solución podría ser usar el método del Patrón tartamudeo que repite valores en un Patrón "n" veces:

print(P[0, 3, 0, 4].stutter(4) + (0, 2, 4))

P[P(0, 2, 4), P(0, 2, 4), P(0, 2, 4), P(0, 2, 4), P(3, 5, 7), P(3, 5, 7), P(3, 5, 7), P(3, 5, 7), P(0, 2, 4), P(0, 2, 4), P(0, 2, 4), P(0, 2, 4), P(4, 6, 8), P(4, 6, 8), P(4, 6, 8), P(4, 6, 8)]

Así que para tocar la secuencia de acordes de arriba con un sonido "pluck" podríamos hacer algo como esto:

p1 >> pluck(P[0, 3, 0, 4].stutter(32), dur=1/4) + (0, 2, 4)

Con 4 notas por compás y 8 tiempos por acorde podemos deducir fácilmente que necesitamos tartamudear cada valor de tono 32 veces. El problema es que tenemos que cambiar ese valor cada vez que cambiamos la duración. Si cambiamos nuestra duración a [1/2, 1/4, 1/4, 1/4] necesitaríamos hacer algunas matemáticas en nuestra cabeza (o usar Python) para calcular cuántas veces tartamudear los valores de la afinación. Para evitar esto podemos usar variables que cambian su valor con el tiempo, así que después de 8 tiempos automáticamente empezamos a tocar un tono diferente. Estas son conocidas como "variables dependientes del tiempo" o "TimeVar" para abreviar.

Un TimeVar tiene una serie de valores entre los que cambia después de un número predefinido de latidos y se crea usando un objeto var con la sintaxis var([lista_de_valores],[lista_de_duraciones]) Ejemplo:

>>> a = var([0,3],4) # Duration can be single value

print(int(Clock.now()), a) # 'a' initially has a value of 0 when 0 beats have elapsed

0, 0

print(int(Clock.now()), a) # After 4 beats, the value changes to 3

4, 3

print(int(Clock.now()), a) # After another 4 beats, the value changes back to 0 8, 0

Así que para resolver nuestro problema original con la reproducción de una secuencia de acordes, podríamos utilizar el siguiente código con cualquier valor de duración y todavía aquí la secuencia de juego de 8 tiempos por acorde:

Así que para resolver nuestro problema original con la reproducción de una secuencia de acordes, podríamos utilizar el siguiente código con cualquier valor de duración y todavía aquí la secuencia de juego de 8 tiempos por acorde:

p1 >> pluck(var([0, 3, 0, 4], 8), dur=[1,1/4,1/4,1/2]) + (0, 2, 4)

Transformando Timevars

Cuando se utiliza una operación matemática en una variable, se devuelve una nueva variable que también cambia su valor con el tiempo:

a = var([0,3], 4)

b = a + 5

print(a, b) # Current time = 0

0, 5

print(a, b) # beat = 4

3, 8

c = PRange(4) + a

print(c) # beat = 8 and 'a' has a value of 0

P[0, 1, 2, 3]

print(c) # beat = 12 and a has a value of 3

P[3, 4, 5, 6]


Cambio continuo

Hasta ahora sólo hemos visto un TimeVar tomar uno de un conjunto de valores predefinidos, pero también hay tipos de TimeVar que gradualmente cambian entre sus valores con el tiempo. Un ejemplo de ello es la linvar. Esto es instanciado de la misma manera que un var pero el valor cambia linealmente entre estados con el tiempo. El ejemplo de abajo mueve el panoramizado de izquierda a derecha a lo largo de 8 tiempos y luego de nuevo hacia atrás.

p1 >> pluck(dur=1/4, pan=linvar([-1,1],8))

Atras
siguiente