$ chuck 1. Simple Sine Wave.ck
Chuck tiene una colección de generadores unitarios que hacen ruido. La primera unidad Generator que exploraremos se llama Sinosc. Esta es una onda sinusoidal simple que emite una sola frecuencia fundamental a 440 Hertz a medio volumen. El sinosc se 'arroja' al objeto DAC usando el operador =>. El objeto DAC o el convertidor de audio digital es la conexión de la computadora con sus altavoces externos o tarjeta de sonido. Piense en el operador => como un cable de parche o enchufe que conecta la salida de audio de la onda sinusoidal al altavoz.
SinOsc s => dac;
s.gain(0.5);
s.freq(440);
Este código solo no producirá sonido. Para producir sonido, tenemos que decirle al programa cuánto tiempo durará el sonido. Chuck aplica unidades de tiempo al objeto ahora. Ahora representa la hora actual más el tiempo adicional 'chucked' hasta ahora. En este ejemplo, solo queremos procesar el sonido por un segundo. Por lo tanto, 'arrojamos' 1 segundo a ahora.
1::second => now;
Ejecutar el programa completo genera un tono suave a 440Hz, medio volumen, por 1 segundo. Intenta jugar con la configuración. Cambie el tono, el volumen o el momento para crear nuevas variaciones del sonido. Consulte la documentación de Chuck y cambie la onda sinusoidal a un diente de sierra o una onda cuadrada. ¿Cómo son estos sonidos diferentes?
¡Hagamos algo de música ahora! Para esta lección tomaremos el Capítulo 1 del Formulario Básico Fundamentos y simplemente organizaremos una secuencia de notas para hacer una melodía simple.
La música, en su forma más básica, es una secuencia de eventos de sonido reproducidos en diferentes tonos, duraciones e intervalos. En este ejemplo, simplemente jugaremos la misma duración a intervalos de 1/4 de segundo. Para cada evento jugaremos un tono simple.
Lograr esto no es difícil. Todo lo que necesitamos hacer es copiar y pegar nuestro código del Capítulo 1 y estructurar una secuencia de 4 notas de eventos de nota. En este punto, podemos cambiar la frecuencia para cada evento de nota y crear un patrón de eventos que casi suenan musicales. Aquí simplemente dividimos la segunda nota por la mitad, multiplicamos la tercera nota por 2 y luego multiplicamos la nota final por 2.5.
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(440);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(220);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(880);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(1100);
// Process program for a duration of 1/4 second
0.25::second => now;
Ejecute el programa varias veces y vea si puede cambiar la secuencia a una secuencia que prefiera. ¿Puedes replicar una de tus canciones favoritas? ¿Cómo convertirías Hertz en notas musicales? ¿La secuenciación de la música como esta se siente incómoda? ¿Qué facilitaría esto?
En el Capítulo 2 creamos con éxito nuestra primera melodía. ¡Esta no fue una hazaña pequeña! Las computadoras son muy buenas para tomar medidas basadas en una secuencia de instrucciones. Dado lo que ya sabemos, cualquier melodía o canción se puede reproducir nota por nota mediante copiar y pegar. Después de un tiempo, crear música de esta manera se vuelve tediosa y poco inspiradora. Tiene que haber una manera más fácil.
Las melodías musicales a menudo se repiten muchas veces sobre una canción en lo que se conoce como frase. Las frases son esencialmente bucles. Los bucles de la capa de música electrónica y de hip hop para crear texturas polirrítmicas donde los bucles interactúan y se reproducen entre sí. Afortunadamente para nosotros hay una estructura de control perfecta en la programación para replicar este comportamiento: el bucle While.
En lugar de copiar y pegar cada nota, las instrucciones se pueden repetir para crear frases musicales. En Chuck, el bucle While se construye con la palabra clave y los soportes rizados para contener la secuencia de instrucciones que se repetirán. En este ejemplo, repetiremos las instrucciones infinitamente o hasta que el programa finalice.
// Loop Repeats while true is true (aka forever!)
while(true) {
//instructions go here
}
¡Por lo general, no escribiríamos programas de computadora con bucles infinitos! Esto es algo que generalmente se evita en la programación porque colgará el programa y evitará que el programa ejecute otras partes o el código y se ejecute para siempre. En Chuck, como pronto descubriremos, hay formas de terminar e iniciar los programas algorítmicamente. En la música es posible que queramos improvisar y dejar que un bucle infinito construya un surco durante un período de tiempo.
Para hacer que el bucle sea más interesante, presentaremos dos nuevas bibliotecas: STD y matemáticas. STD significa Biblioteca estándar y es una colección de métodos de utilidad útiles que se pueden usar en nuestros programas. STD presenta un método llamado 'MTOF' o 'Midi a frecuencia'. En la música de computadora, la escala de 12 notas en el piano se representa como lanzamientos ascendentes entre 0 a 127. Una octava es de 12 notas y hay 10 octavas disponibles. C Middle C en el piano está representado a los 60. ¡No se preocupe si no se ha limitado a ningún conocimiento musical! El uso de cualquiera de los valores entre 0 a 127 nos dará automáticamente un ajuste occidental estándar. Las notas MIDI ciertamente son mucho más fáciles de trabajar y razonan.
MTOF es un método que toma una entrada y devuelve un valor. Introduciremos un valor de nota MIDI, 60 por ejemplo, y MTOF devolverá el valor correspondiente en Hertz. Podemos observar esto escribiendo un pequeño programa que imprime la salida de std.mtof (60). Chuck usa los símbolos <<<>> para imprimir valores de retorno para fines de depuración.
<<< Std.mtof(60) >>>;
261.625565 :(float)
Como puede ver, la composición de canciones en Hertz comienza a ponerse más complicado cuando intentamos incorporar notas musicales occidentales en nuestras melodías. Para facilitar aún más las cosas, vamos a generar algunas notas aleatorias usando la biblioteca de matemáticas. Las matemáticas tienen una función llamada Random2 que toma la entrada de 2 números. Los 2 números representan un rango entre el primer y el segundo número.
Podemos aleatorizar las octavas, las notas que ocurren cada vez 12 notas, al aleatorizar entre un conjunto de números y multiplicarse por 12. Cuando convertimos las notas en frecuencia, ¡Sinosc puede tomar la frecuencia como entrada y hacer un sonido!
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
Al armar todo, podemos envolver nuestro algoritmo dentro del bucle While. Esta es una de las ventajas de trabajar con música con código. A medida que avanzamos hacia programas más complejos, podemos comenzar a crear música que solo se pueda lograr con la programación de computadoras. Esto se conoce como composición algorítmica.
// Sine Wave connected to audio out
SinOsc s => dac;
while(true) {
// Set midi musical note
// with randomly selected octaves
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
// Play for 1/4 of a second
0.25::second => now;
}
Intente cambiar la velocidad de la secuencia. ¿Qué sucede cuando cambia la nota C Middle C a otra nota? ¿Cómo suena 12 o 24 notas? ¿La canción se vuelve más o menos musical si cambia el valor múltiple? ¡Explicado y presione CTRL-C en su teclado cuando haya escuchado lo suficiente!
¡Muy pronto!
¡Muy pronto!
¡Muy pronto!
¡Muy pronto!