A los objetos del reproductor FoxDot se les asignan sintetizadores que toman varios argumentos de palabras clave en un conjunto de corchetes para manipular las secuencias que se están reproduciendo. Probablemente ya hayas visto Dur
y Pan
, pero ¿qué más podemos usar? Hay muchas opciones, que se dividen en dos grupos: atributos y efectos. Los atributos son cosas que afectan qué nota se toca y cuándo y los efectos son cosas que cambian cómo suena el sonido, bueno, ¡suena! Puede ver una lista de todos los posibles términos de palabras clave evaluando el código
print(Player.get_attributes())
('degree', 'oct', 'dur', 'delay', 'blur', 'amplify', 'scale', 'bpm', 'sample', 'sus', 'fmod', 'pan', 'rate', 'amp', 'vib', 'vibdepth', 'slide', 'sus', 'slidedelay', 'slidefrom', 'bend', 'benddelay', 'coarse', 'striate', 'pshift', 'hpf', 'hpr', 'lpf', 'lpr', 'swell', 'bpf', 'bpr', 'bits', 'amp', 'crush', 'dist', 'chop', 'tremolo', 'echo', 'decay', 'spin', 'cut', 'room', 'mix', 'formant', 'shape')
Tenga en cuenta que un SuperCollider SynthDef
puede tomar argumentos de palabras clave especÃficos que no están en la lista anterior. Puedes establecer los valores para un atributo o efecto de un reproductor especificándolos como un argumento de palabra clave dentro de una llamada de SynthDef:
p1 >> pluck([0, 1, 2, 3], dur=1/2, sus=2)
Estos son los valores de las palabras clave que FoxDot utiliza para decidir qué nota o muestra se reproducirá en cada momento. Sin ningún orden en particular: degree, oct, dur, scale, amp, amplify, bpm, sample, and delay.
Vamos a repasar cada uno de estos en profundidad con algún código de ejemplo ahora.
Esto a veces se denomina "tono" y se refiere al Ãndice de la escala que debemos utilizar para crear una nota - asà que para tocar la primera nota de una escala, se utiliza el valor de grado 0. No es necesario especificar este por nombre ya que es siempre el primer argumento utilizado. Aquà hay un código de ejemplo que reproduce las primeras cuatro notas de la escala por defecto (Do mayor).
p1 >> pluck([0, 1, 2, 3])
Esta es la octava en la que desea tocar una nota. Por defecto es 5, de modo que la nota que se toca al iniciar un objeto de jugador "en blanco" es la C media. Una octava es (normalmente) 12 semitonos, por lo que la quinta octava comienza en el 60º semitono. Añadimos este valor a nuestra afinación (que obtenemos al usar el grado para obtener el valor final de la nota. Un número más pequeño toca una nota más baja y un número más grande toca una nota más alta:
p1 >> pluck(oct=[4, 5, 6])
Es la duración de una nota. Las duraciones no pueden ser negativas y deben contener al menos un número distinto de cero. Una duración puede ser de cualquier tipo siempre y cuando pueda ser representada por un valor de coma flotante. Las siguientes son todas las duraciones válidas:
# Valor individual para todas las notas
p1 >> pluck([0, 1, 2, 3], dur=1/2)
# Una lista de duraciones puede ser números enteros, fracciones o valores de coma flotante.
p1 >> pluck([0, 1, 2, 3], dur=[1,1/2,0.5])
p1 >> pluck([0, 1, 2, 3], dur=[0.1,0.3,0.43,0.17])
Puede "saltar" una nota poniendo la duración a cero o "silenciándola" utilizando un objeto de rest
reposo con la duración entre paréntesis:
# Salta cada tercera nota
p1 >> pluck([0, 1, 2, 3], dur=[1, 1, 0])
# Descansa cada tercera nota por 2 tiempos
p1 >> pluck([0, 1, 2, 3], dur=[1, 1, resto(2)])
Como su nombre indica, esto establece la escala del objeto del jugador. Debe ser una lista, un Patrón o un objeto Escala (que es una subclase de Patrón). Para ver una lista de escalas, puede evaluar el siguiente código:
print(Scale.names())
['aeolian', 'chinese', 'chromatic', 'custom', 'default', 'diminished', 'dorian', 'dorian2', 'egyptian', 'freq', 'harmonicMajor', 'harmonicMinor', 'indian', 'justMajor', 'justMinor', 'locrian', 'locrianMajor', 'lydian', 'lydianMinor', 'major', 'majorPentatonic', 'melodicMajor', 'melodicMinor', 'minor', 'minorPentatonic', 'mixolydian', 'phrygian', 'prometheus', 'romanianMinor', 'yu', 'zhi']
Por defecto, FoxDot utiliza la escala "mayor". Para cambiar esto a la escala menor, por ejemplo, puede utilizar el argumento de la palabra clave de la escala y la escala Scale.minor asÃ:
# reproducir con la escala por defecto
p1 >> pluck([0, 2, 4, 6, 7])
# cambiar a menor
p1 >> pluck([0, 2, 4, 6, 7], scale=Scale.minor)
Si desea cambiar la escala para todos los reproductores, puede establecer el valor Escala.predeterminada:
# Iniciar un reproductor en la escala por defecto (Major)
p1 >> pluck([0, 2, 4, 6, 7])
# Cambia la escala por defecto a Dorian
Escala.default = Escala.dorian
#Puede especificar la escala por defecto como una cadena
Escala.default = "dorian"
Es la amplitud de una nota, o su volumen/volumen. Los valores normalmente oscilan entre 0 y 1, pero puede ajustar valores más grandes para que una nota sea aún más fuerte, pero tenga cuidado de no hacer demasiado ruido o podrÃa dañarse los oÃdos o los altavoces.
p1 >> pluck([0, 1, 2], dur=[1, 1/2, 1/2], amp=[1, 0.5, 1/3])
Podemos crear patrones bastante rÃtmicos usando amplificador usando valores de 0 también:
p1 >> pluck(dur=1/4, amp=[1, 1/2, 1/2, 1, 0, 1, 0, 1, 1/2, 1/2, 1, 0, 1, 1/2, 1/4, 1])
¿Pero qué pasa si queremos tocar este ritmo en cualquier otro bar? Una forma podrÃa ser añadir manualmente un montón de 0s a la secuencia o usar un objeto Pattern y usar su método de "stutter" tartamudeo, pero también podemos usar otro argumento de palabra clave diseñado para este propósito; amplificar.
Antes de que un sonido sea disparado por un reproductor, el valor del amplificador se multiplica por amplificar para que puedas usar cosas como TimeVar para ajustar una amplitud a 1 o 0 (es decir, encendido y apagado) durante cierto tiempo:
p1 >> pluck(dur=1/4, amp=[1, 1/2, 1/2, 1, 0, 1, 0, 1, 1/2, 1/2, 1, 0, 1, 1/2, 1/4, 1], amplify=var([1,0],[6,2]))
Esto es útil si desea activar o desactivar varios reproductores al mismo tiempo:
p1 >> pluck(dur=1/4, amp=[1, 1/2, 1/2, 1, 0, 1, 0, 1, 1/2, 1/2, 1, 0, 1, 1/2, 1/4, 1])
p2 >> bass(var([0, 3], 8), dur=1/2)
p1.amplify = p2.amplify = var([1,0],4)
The last line is quite clumsy so you can use a Group object in place (see here for more information):
p1 >> pluck(dur=1/4, amp=[1, 1/2, 1/2, 1, 0, 1, 0, 1, 1/2, 1/2, 1, 0, 1, 1/2, 1/4, 1])
p2 >> bass(var([0, 3], 8), dur=1/2)
Group(p1, p2).amplify = var([1,0],4)
Si desea que un objeto de reproductor se reproduzca a un tempo diferente, puede utilizar el atributo bpm. Estos son los latidos por minuto. El tempo del reloj de programación global se puede establecer cambiando su atributo bpm usando Clock.bpm = 140 por ejemplo (ver aquà para más información).
# Reproduce en el tempo Clock.bpm (por defecto 120)
p1 >> pluck([0, 1, 2, 3])
# Forzar al jugador a usar 100 bpm
p2 >> campana([4, 5, 7], bpm=100)
# Siempre se reproducirá a 100 bpm incluso si se cambia Clock.bpm
Reloj.bpm = 200
Esto sólo se usa con el reproductor de muestra, llamado play. Este SynthDef toma una cadena como su primer argumento (conocido como "play string") en lugar de una lista de valores de afinación y reproduce muestras de audio almacenadas en su portátil basándose en el carácter de la cadena. Cada carácter se asigna a una carpeta de muestras y, de forma predeterminada, reproduce la primera muestra de esa carpeta. Para reproducir una muestra diferente, utilice la palabra clave de muestra:
# samples por defecto
p1 >> play("x-o-")
# Un conjunto diferente de samples
p1 >> play("x-o-", sample=1)
# Puede ser una lista de valores
p1 >> play("x-o-", sample=[0, 1, 2])
Los valores deben ser enteros. Si una carpeta contiene 3 muestras y utiliza el valor 4, el objeto del reproductor volverá al primer archivo de la carpeta y reproducirá ese archivo, por lo que no necesita saber exactamente cuántas muestras hay en una carpeta.
En la música (y especialmente en la música electrónica) el retardo se refiere a menudo a una especie de efecto "eco" en el que un sonido se reproduce de nuevo poco después de que comienza, pero un poco más silencioso. En FoxDot, sin embargo, se refiere literalmente a una cantidad de tiempo, en latidos, para retrasar la reproducción de un sonido. AquÃ, retrasaremos cada tercera nota por medio tiempo:
p1 >> pluck([0, 1, 2, 3], delay=[0, 0, 0.5])
Si quieres tocar la nota y tocarla con un retardo, puedes usar una tupla o un PGroup con el primer valor 0, lo que significa que no hay retardo. El segundo valor indicará cuánto tiempo debe demorarse la segunda nota:
#"stutter" cada tercera nota
p1 >> pluck([0, 1, 2, 3], delay=[0, 0, (0, 0.5)])
# Retrasa una nota para tocar *después* de la siguiente
p1 >> pluck([0, 1, 2, 3], delay=[0, 0, (0, 1.5)])