curso de programación y música documentation
TRANSCRIPT
![Page 1: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/1.jpg)
Curso de programación y músicaDocumentation
Versión 1.0
Johnny Cubides
17 de noviembre de 2018
![Page 2: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/2.jpg)
![Page 3: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/3.jpg)
Contents:
1. Chuck => =^ 31.1. Primera impresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2. Mi primer tono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3. Mi primera melodía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4. Basico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Arduino 192.1. Arduino, !Hola mundo! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.2. Encendido de LEDs externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.3. Pinout Arduino UNO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3. Arduino conectado a Chuck 253.1. Uso de sensor ultrasonido con ChucK y Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.2. Interpretando sensores digitales en ChucK desde Arduino . . . . . . . . . . . . . . . . . . . . . . . 273.3. Interpretando sensores analógicos en ChucK desde Arduino . . . . . . . . . . . . . . . . . . . . . . 353.4. Sonidos en formato wav, sensores análógicos y digitales . . . . . . . . . . . . . . . . . . . . . . . . 39
4. Elementos de ayuda 454.1. Mi propio amplificador de audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454.2. Links de interés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5. Indices and tables 47
I
![Page 4: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/4.jpg)
II
![Page 5: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/5.jpg)
Curso de programación y música Documentation, Versión 1.0
Contents: 1
![Page 6: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/6.jpg)
Curso de programación y música Documentation, Versión 1.0
2 Contents:
![Page 7: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/7.jpg)
CAPÍTULO 1
Chuck => =^
1.1 Primera impresión
Atención: ¿No puedes ver el vídeo? Mantén presionado aquí en video hasta que se habilite la opción de abrirloen la app de YOUTUBE.
Nota: La salida por consola de texto, permite ver que parte del código se está ejecutando si se usa correctamente.
1.1.1 Código del ejemplo
<<<"Hola mundo">>>;
Por hacer: Prueba agregando más lineas de texto en la consola con <<<»poner aquí el texto»>>>; (sin olvidar elpunto y coma).
1.2 Mi primer tono
Atención: ¿No puedes ver el vídeo? Mantén presionado aquí en video hasta que se habilite la opción de abrirloen la app de YOUTUBE.
Nota:
3
![Page 8: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/8.jpg)
Curso de programación y música Documentation, Versión 1.0
SinOsc: Oscilador de señal seno.
SqrOsc: Oscilador de señal cuadrada.
TriOsc: Oscilador de señal triangular.
SawOsc: Oscilador de señal diente de sierra.
Nota:
.gain, va desde 0.0 hasta 1.0
.freq, va desde 0 hasta 20000 Hz (20 kilo hertz).
x :: sencond => now, donde x es el tiempo que durará el sonido.
1.2.1 Código de ejemplo
SinOsc miOscilador => dac;0.5 => miOscilador.gain;300 => miOscilador.freq;2.0 :: second => now;
Por hacer:
Pruebe cambiando tanto el volumen, la frecuencia y la duración.
Pruebe cambiado el tipo de oscilador.
Genere un silencio.
Por hacer: ¿Qué pasaría si pones el código como sigue?
SinOsc miOscilador => dac;0.5 => miOscilador.gain, 300 => miOscilador.freq, 2.0 :: second => now;
1.3 Mi primera melodía
Consejo: Antes de ver el vídeo ten presente la información alojada en los siguientes links:
Duración y figuras musicales.
Octavas y sus números MIDI.
Musescore.
Atención: ¿No puedes ver el vídeo? Mantén presionado aquí en video hasta que se habilite la opción de abrirloen la app de YOUTUBE.
4 Capítulo 1. Chuck => =^
![Page 9: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/9.jpg)
Curso de programación y música Documentation, Versión 1.0
1.3.1 Código del ejemplo:
. . . Próximamente. . . :D
Por hacer: Haz tu propia melodía escogiendo una partitura sencilla.
1.4 Basico
1.4.1 Tipos de datos en ChucK
tipo de dato Descripción Ejemplo Comentarioint Entero 1, 1024 No tiene parte decimalfloat Punto flotante 3.14159, 1.41 Tiene parte decimalstring Textos «Hola», «sound.wav» Textos o comentariosdur Distancia entre tiempos 1::second, ms, 3*day Duracióntime Tiempos ChucK 22050.0 Tiempo en muestrasvoid No tiene tipo
1.4.2 Condiciones Lógicas
Las condiciones lógicas dan lugar a preposiciones que al ser evaluadas dan como resultado un valor verdadero (true)o falso (false).
Operadores relacionales
Símbolo Significado Ejemplo== Es igual a if (x==0)!= No es igual if (x != 0 )< Menor que if (x < y )> Mayor que if (x > y )>= Mayor que o igual a if (x >= y)<= Menor que o igual a if (x <= y)
Estructuras de control de flujo
Dependiendo del resultado de la evaluación de una preposición, el programa tendrá un flujo u otro en su ejecución.
1.4. Basico 5
![Page 10: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/10.jpg)
Curso de programación y música Documentation, Versión 1.0
if
Diagrama de flujo
Si una condición es verdadera, ejecutará lo que se encuentre dentro de los corchetes
if(condicion){//Al ser verdadera la condicion se ejecuta lo que está aquí adentro//cuando termina ésta ejecución continua con el flujo normal del programa.
(continues on next page)
6 Capítulo 1. Chuck => =^
![Page 11: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/11.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
}//Continúa con los demás procesos
Ejemplo
//Habilitar unidad generadora seno y//conectada al conversor digital a análogoSinOsc miOsc => dac;//Volumen a la mitad0.5 => miOsc.gain;//Creación de una duración1.0 :: second => dur tiempo;//Nota a tocar//Cambiar por 60, 6160 => int nota;// Nota es igual a 60if(nota == 60){
<<<"Verdadero, nota es igual a 60">>>;60 => Std.mtof => miOsc.freq, tiempo => now;
}<<<"continúa con los demás procesos">>>;
1.4. Basico 7
![Page 12: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/12.jpg)
Curso de programación y música Documentation, Versión 1.0
else
Diagrama de flujo
Si una condición es falsa, ejecutara lo que está después del else dentro de los corchetes.
if(condicion){//Al ser la condición falsa, el programa evita entrar a éste ambito
(continues on next page)
8 Capítulo 1. Chuck => =^
![Page 13: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/13.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
//señalado por los corchetes}else{
//Al ser falsa la condicion,//el programa ejecutará lo que está dentro de éstos corchetes.
}//Continúa con los demás procesos
Ejemplo
//Habilitar unidad generadora seno y//conectada al conversor digital a análogoSinOsc miOsc => dac;//Volumen a la mitad0.5 => miOsc.gain;//Creación de una duración1.0 :: second => dur tiempo;//Nota a tocar//Cambiar por 60, 6161 => int nota;// Nota es igual a 60if(nota == 60){
<<<"Verdadero, nota es igual a 60">>>;60 => Std.mtof => miOsc.freq, tiempo => now;
}else{<<<"La anterior condición fue falsa">>>;
}<<<"continúa con los demás procesos">>>;
1.4. Basico 9
![Page 14: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/14.jpg)
Curso de programación y música Documentation, Versión 1.0
10 Capítulo 1. Chuck => =^
![Page 15: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/15.jpg)
Curso de programación y música Documentation, Versión 1.0
else if
Diagrama de flujo
1.4. Basico 11
![Page 16: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/16.jpg)
Curso de programación y música Documentation, Versión 1.0
Si la condición anterior es falsa, el programa evaluará la siguiente condición que se encuentra dentro de los paréntesisdespués del else if. Si ésta condición es verdadera, ejecutará lo que está dentro de los corchetes después de dichacondición, finalizada la ejecución, ya no entra a evaluar más condiciones y continúa su flujo normal. Si la condiciónes falsa, continúa evaluando las demás condiciones hasta encontrar una verdadera o hasta llegar al else que indicaríaque ninguna condición fue verdadera.
if(condicion){//Al ser la condición falsa, el programa evita entrar a éste ambito//y prueba evaluar la siguiente condición
}else if(condicion){//Si la condición es verdadera, ejecuta lo que está dentro de//éstos corchetes.
else{//Si ninguna condición fue verdadera, entonces,//el programa ejecutará lo que está dentro de éstos corchetes.
}//Continúa con los demás procesos
Ejemplo
//Habilitar unidad generadora seno y//conectada al conversor digital a análogoSinOsc miOsc => dac;//Volumen a la mitad0.5 => miOsc.gain;//Creación de una duración1.0 :: second => dur tiempo;//Nota a tocar//Cambiar por 60, 61, 62, 6361 => int nota;// Nota es igual a 60if(nota == 60){
<<<"Verdadero, nota es igual a 60">>>;60 => Std.mtof => miOsc.freq, tiempo => now;
}else if(nota == 61){<<<"Verdadero, nota es igual a 61">>>;61 => Std.mtof => miOsc.freq, tiempo => now;
}else if(nota == 62){<<<"Verdadero, nota es igual a 62">>>;62 => Std.mtof => miOsc.freq, tiempo => now;
}else{<<<"Todas las condiciones fueron falsas">>>;
}<<<"continúa con los demás procesos">>>;
12 Capítulo 1. Chuck => =^
![Page 17: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/17.jpg)
Curso de programación y música Documentation, Versión 1.0
1.4.3 Octavas y sus números MIDI
Notas musicales de la escala de Sol
Las notas musicales y sus números MIDI
NOTAS OCTAVA-1 0 1 2 3 4 5 6 7 8 9
Do C 0 12 24 36 48 60 72 84 96 108 120Do# C# 1 13 25 37 49 61 73 85 97 109 121Re D 2 14 26 38 50 62 74 86 98 110 122Re# D# 3 15 27 39 51 63 75 87 99 111 123Mi E 4 16 28 40 52 64 76 88 100 112 124Fa F 5 17 29 41 53 65 77 89 101 113 125Fa# F# 6 18 30 42 54 66 78 90 102 114 126Sol G 7 19 31 43 55 67 79 91 103 115 127Sol# G# 8 20 32 44 56 68 80 92 104 116La A 9 21 33 45 57 69 81 93 105 117La# A# 10 22 34 46 58 70 82 94 106 118Si B 11 23 35 47 59 71 83 95 107 119
Nota: Para poder «tocar» una nota de la escala musical, se requiere el siguiente comando:
x => Std.mtof, donde x es cualquiera de los número mostrados en la tabla anterior.
Para saber la frecuencia de una nota representada con el número midi, puede hacer lo siguiente:
<<<"Frecuencia de la nota Do 4° octava">>>;<<<Std.mtof(60)>>>;
1.4. Basico 13
![Page 18: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/18.jpg)
Curso de programación y música Documentation, Versión 1.0
Tocando una nota en la representación MIDI:
A continuación se muestra como tocar una nota Do de la 4° octava; puede hacer algo similar para las demás notas.
SinOsc miOsc => dac;<<<"Do 4° octava">>>;60 => Std.mtof => miOsc.freq, 0.5 => miOsc.gain, 1 :: second => now;
Código de ejemplo de uso:
Veamos como se toca una escala musical en la 4° octava (Do, Re, Mi, Fa, Sol, La, Si):
// Crear un oscilador seno// y conectarlo a la tarjeta de audioSinOsc miOsc => dac;// Volumen al 50 %0.5 => miOsc.gain;<<<"Do 4° octava">>>;60 => Std.mtof => miOsc.freq, 1 :: second => now;<<<"Re 4° octava">>>;62 => Std.mtof => miOsc.freq, 1 :: second => now;<<<"Mi 4° octava">>>;64 => Std.mtof => miOsc.freq, 1 :: second => now;<<<"Fa 4° octava">>>;65 => Std.mtof => miOsc.freq, 1 :: second => now;<<<"Sol 4° octava">>>;67 => Std.mtof => miOsc.freq, 1 :: second => now;<<<"La 4° octava">>>;69 => Std.mtof => miOsc.freq, 1 :: second => now;<<<"Si 4° octava">>>;71 => Std.mtof => miOsc.freq, 1 :: second => now;
Otra manera de obtener el mismo resultado:
// Crear un oscilador seno// y conectarlo a la tarjeta de audioSinOsc miOsc => dac;// Volumen al 50 %0.5 => miOsc.gain;<<<"Do 4° octava">>>;Std.mtof(60) => miOsc.freq, 1 :: second => now;<<<"Re 4° octava">>>;Std.mtof(62) => miOsc.freq, 1 :: second => now;<<<"Mi 4° octava">>>;Std.mtof(64) => miOsc.freq, 1 :: second => now;<<<"Fa 4° octava">>>;Std.mtof(65) => miOsc.freq, 1 :: second => now;<<<"Sol 4° octava">>>;Std.mtof(67) => miOsc.freq, 1 :: second => now;<<<"La 4° octava">>>;Std.mtof(69) => miOsc.freq, 1 :: second => now;<<<"Si 4° octava">>>;Std.mtof(71) => miOsc.freq, 1 :: second => now;
14 Capítulo 1. Chuck => =^
![Page 19: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/19.jpg)
Curso de programación y música Documentation, Versión 1.0
1.4.4 Duración y figuras musicales
Figuras musicales y sus tiempos
Figuras musicales y sus silencios
Nota: Los silencios duran igual que las notas.
1.4. Basico 15
![Page 20: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/20.jpg)
Curso de programación y música Documentation, Versión 1.0
El compás
La notación del compás está definida con un 𝑛𝑢𝑚𝑒𝑟𝑎𝑑𝑜𝑟𝑑𝑒𝑛𝑜𝑚𝑖𝑛𝑎𝑑𝑜𝑟 donde el numerador indica la cantidad de tiempos que
habrán en cada compás y el denominador indica la figura a usar.
Ejemplos de compás
24 : Habrán 2 tiempos por compás y la figura es la negra por el 4 (1/4).48 : Habrán 4 tiempos por compás y la figura es la corchea por el 8 (1/8).
Creación de duraciones según figuras musicales
Nos referiremos a la duración a la cantidad de tiempo que se desea que una nota sea tocada.
Nota: Para crear una duración se usa la palabra mágica dur;
Si usamos de referencia la figura musical NEGRA, los tiempos serían:
Redonda: Entera | 4T
Blanca: Media | 2T
Negra: Cuarta | 1T
Corchea: Octava | 1/2T
Semicorchea: Dieciseisava | 1/4T
Fusa: Treintaidosava | 1/8T
Semifusa: Sesentacuatroava | 1/16T
16 Capítulo 1. Chuck => =^
![Page 21: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/21.jpg)
Curso de programación y música Documentation, Versión 1.0
Y podríamos crear los tiempos correspondientes:
//Asignación de la duración del compas, por ejemplo, 1 segundo1.0 :: second => dur compas;compas/2 => dur Negra; //Cuarta4*Negra => dur Redonda; //Entera2*Negra => dur Blanca; //MediaNegra/2 => dur Corchea; //OctavaNegra/4 => dur Semicorchea; //DieciseisavaNegra/8 => dur Fusa; //TreintaidosavaNegra/16 => dur Semifusa; //Sesentacuatroava
De manera simplificada:
//Asignación de la duración del compas, por ejemplo, 1 segundo1.0 :: second => dur compas;compas/2 => dur N; //Negra4*N => dur R; //Redonda2*N => dur B; //BlancaN/2 => dur C; //CorcheaN/4 => dur S; //SemicorcheaN/8 => dur F; //FusaN/16 => dur SF; //Semifusa
Ejemplo de uso:
Ejemplo 1
//Asignación de la duración del compas, por ejemplo, 1 segundo1.0 :: second => dur compas;compas/2 => dur Negra; //Cuarta4*Negra => dur Redonda; //Entera2*Negra => dur Blanca; //MediaNegra/2 => dur Corchea; //OctavaNegra/4 => dur Semicorchea; //DieciseisavaNegra/8 => dur Fusa; //TreintaidosavaNegra/16 => dur Semifusa; //Sesentacuatroava
// Creación de oscilador senoSinOsc miOsc => dac;
//Nota Do en 4° octava60 => Std.mtof => miOsc.freq;
<<<"Durará una octava en Do">>>;0.5 => miOsc.gain, Corchea => now;<<<"Durará una octava en silencio">>>;0 => miOsc.gain, Corchea => now;<<<"Durará media en nota Do">>>;0.5 => miOsc.gain, Blanca => now;<<<"Durará media en silencio">>>;0 => miOsc.gain, Blanca => now;<<<"Durará una entera en nota Do">>>;0.5 => miOsc.gain, Redonda => now;<<<"Durará una entera en silencio">>>;0 => miOsc.gain, Redonda => now;
1.4. Basico 17
![Page 22: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/22.jpg)
Curso de programación y música Documentation, Versión 1.0
Ejemplo 2
/** Ésto es solo un comentario, no lo tendrá en cuenta Chuck
* Arbitrariamente se hará la siguiente representación por simplicidad:
* R = Redonda : Entera,
* B = Blanca : Media,
* N = Negra : Cuarta,
* C = Corchea : Octava,
* S = Semicorchea : Dieciseisava,
* F = Fusa : Treintaidosava,
* SF = Semifusa : Sesentacuatroava.
*///Asignación de la duración del compas, por ejemplo, 0.8 segundos0.8 :: second => dur compas;compas/2 => dur N; //Negra4*N => dur R; //Redonda2*N => dur B; //BlancaN/2 => dur C; //CorcheaN/4 => dur S; //SemicorcheaN/8 => dur F; //FusaN/16 => dur SF; //Semifusa
// Creación de oscilador senoSinOsc miOsc => dac;
//Nota Do en 4° octava60 => Std.mtof => miOsc.freq;
<<<"Durará una octava en Do">>>;0.5 => miOsc.gain, C => now;<<<"Durará una octava en silencio">>>;0 => miOsc.gain, C => now;<<<"Durará media en nota Do">>>;0.5 => miOsc.gain, B => now;<<<"Durará media en silencio">>>;0 => miOsc.gain, B => now;<<<"Durará una entera en nota Do">>>;0.5 => miOsc.gain, R => now;<<<"Durará una entera en silencio">>>;0 => miOsc.gain, R => now;
genindex
modindex
search
18 Capítulo 1. Chuck => =^
![Page 23: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/23.jpg)
CAPÍTULO 2
Arduino
2.1 Arduino, !Hola mundo!
Atención: ¿No puedes ver el vídeo? Mantén presionado aquí en video hasta que se habilite la opción de abrirloen la app de YOUTUBE.
Nota:
digitalWrite(pin, estado), estado[1, 0] (HIGH, LOW).
sleep(microsegundos)
2.1.1 Código del blink
void setup() {// put your setup code here, to run once:pinMode(13, OUTPUT);Serial.begin(9600);
}
void loop() {// put your main code here, to run repeatedly:digitalWrite(13, HIGH);delay(1000);Serial.println("Led On");digitalWrite(13, LOW);delay(1000);Serial.println("Led Off");
}
19
![Page 24: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/24.jpg)
Curso de programación y música Documentation, Versión 1.0
Por hacer:
Cambia el tiempo de encendido y de apagado del LED.
Cambia el mensaje que sale por el monitor serial.
2.2 Encendido de LEDs externos
2.2.1 Blink de un LED
Por hacer: Teniendo en cuenta el ejemplo de uso Arduino, !Hola mundo! monte el circuito mostrado a continuacióny encienda y apague el LED con las modificaciones pertinentes del Código del blink:
2.2.2 Blink de dos LEDs
Por hacer: Monte el circuito mostrado a continuación y logre los siguientes objetivos haciendo las modificaciones alcodigo construido por usted anteriormente:
20 Capítulo 2. Arduino
![Page 25: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/25.jpg)
Curso de programación y música Documentation, Versión 1.0
Encienda los dos LEDs a la vez durante medio segundo para luego apagarlo por medio segundo de maneracíclica (repetitiva).
Encienda un LED mientras el otro permanece apagado por medio segundo, a continuación, apague el primerLED para encender el otro LED durante medio segundo, hágalo de manera cíclica.
2.2. Encendido de LEDs externos 21
![Page 26: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/26.jpg)
Curso de programación y música Documentation, Versión 1.0
2.3 Pinout Arduino UNO
2.3.1 Revisión V1
22 Capítulo 2. Arduino
![Page 27: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/27.jpg)
Curso de programación y música Documentation, Versión 1.0
2.3.2 Revisión V3
genindex
modindex
search
2.3. Pinout Arduino UNO 23
![Page 28: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/28.jpg)
Curso de programación y música Documentation, Versión 1.0
24 Capítulo 2. Arduino
![Page 29: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/29.jpg)
CAPÍTULO 3
Arduino conectado a Chuck
3.1 Uso de sensor ultrasonido con ChucK y Arduino
3.1.1 Montaje
Por hacer: Monte el siguiente circuito teniendo en cuenta el Pinout Arduino UNO correctamente.
25
![Page 30: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/30.jpg)
Curso de programación y música Documentation, Versión 1.0
3.1.2 Código Arduino
Por hacer: Guarde el siguiente programa en el Arduino y cierre el Arduino IDE para liberar el hardware dejándolohabilitado para ChucK.
#include <NewPing.h>
//Pin donde se pondrá el disparador del ultrasonido#define TRIGGER_PIN 3//Pin donde se pondrá el eco#define ECHO_PIN 2//Definir máxima distancia en centímetros#define MAX_DISTANCE 100
//Creación de configuración para ultrasonidoNewPing sensor(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup(){//Inicia la comunicación con el computador//Velocidad:
(continues on next page)
26 Capítulo 3. Arduino conectado a Chuck
![Page 31: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/31.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
// lenta: 9600 baudios// alta: 115200 baudiosSerial.begin(9600);
}
// Inicio de programa pincipalvoid loop(){
// Cada 100ms se hace una toma de la distanciadelay(100);//Se envía el valor leído del sensor al computadorSerial.println(sensor.ping_cm());
}
3.1.3 Código ChucK
Por hacer: Ejecute el siguiente programa en ChucK, observe el resultado en la consola de ChucK e interactúe con elsensor ultrasonido acercando y alejando su mano de él.
/** Listando dispositivos seriales
* escoger el indice que representa el
* dispositivo serial.
*/SerialIO.list() @=> string list[];for(int i; i < list.size(); i++){
<<< i, ":", list[i] >>>;}
SinOsc miOsc => dac;0.3 => miOsc.gain;
SerialIO arduinoCom;arduinoCom.open(0, SerialIO.B9600, SerialIO.ASCII);
while(true){arduinoCom.onLine() => now;arduinoCom.getLine() => string line;<<<line>>>;Std.atoi(line)*20+200 => miOsc.freq;
}
3.2 Interpretando sensores digitales en ChucK desde Arduino
El siguiente ejemplo permite conectar diferentes sensores a Arduino digitales y ser interpretados por ChucK. Lacantidad de sensores, dependerá en primera instancia de las capacidades del Arduino.
Los montajes mostrados a continuación pueden hacer uso de los mismo códigos de programación.
Si se requiere extensiones (como aumentar la cantidad de sensores) los cambios en el código relativamente sencillosde hacer.
3.2. Interpretando sensores digitales en ChucK desde Arduino 27
![Page 32: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/32.jpg)
Curso de programación y música Documentation, Versión 1.0
3.2.1 Montajes
Láser y foto-sensor
28 Capítulo 3. Arduino conectado a Chuck
![Page 33: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/33.jpg)
Curso de programación y música Documentation, Versión 1.0
Micrófono digital
3.2. Interpretando sensores digitales en ChucK desde Arduino 29
![Page 34: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/34.jpg)
Curso de programación y música Documentation, Versión 1.0
Interruptores en lógica negativa
30 Capítulo 3. Arduino conectado a Chuck
![Page 35: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/35.jpg)
Curso de programación y música Documentation, Versión 1.0
Interruptores en lógica positiva
3.2.2 Código de ejemplo
Código ChucK
/** @file photo_sensor_and_laser.ck
* @brief Permite capturar dese el puerto serial diferentes lecturas
* de sensores digitales e interpretar desde ChucK.
* @author: Johnny Cubides
* contact: [email protected], [email protected]
* date: Oct 03, 2018
* license: GPL
*///*********** CONFIGURACION PUERTO SERIAL *************<<<"Listando puertos seriales">>>;SerialIO.list() @=> string list[];for(int i; i < list.size(); i++){
<<< i, ":", list[i] >>>;}<<<"Iniciando puerto serial">>>;SerialIO arduinoCom;
(continues on next page)
3.2. Interpretando sensores digitales en ChucK desde Arduino 31
![Page 36: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/36.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
//Seleccionar el puerto serial de interés//con el índice de la lista anteriorarduinoCom.open(0, SerialIO.B9600, SerialIO.ASCII);
1 => int MAX_DIGITAL_SENSOR;SinOsc osc[MAX_DIGITAL_SENSOR];[60 ] @=> int midi[];[0.5] @=> float volumen[];
for(0 => int i; i< MAX_DIGITAL_SENSOR; i++){
osc[i] => dac;midi[i] => Std.mtof => osc[i].freq;0 => osc[i].gain;
}
// Variablesstring line; // Guarda los valores recogidos por el puerto serialint valueSensors; // Guarda el valor de los sensores50::ms => dur myTime; // Cada cuanto se actualizarán los sonidos
fun void readSerial(){
while(true){
arduinoCom.onLine() => now;arduinoCom.getLine() => line;if(line == "D"){
arduinoCom.onLine() => now;arduinoCom.getLine() => line;Std.atoi(line) => valueSensors;
}}
}
fun void playSond(){
while(true){
for(0 => int i; i< MAX_DIGITAL_SENSOR; i++){
volumen[i]*(valueSensors & (1 << i)) => osc[i].gain;}myTime => now;
}}
spork ~ readSerial();spork ~ playSond();
while(true) 1::second => now;
32 Capítulo 3. Arduino conectado a Chuck
![Page 37: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/37.jpg)
Curso de programación y música Documentation, Versión 1.0
Código Arduino
/** @file digital_reads.ino
* @brief Permite hacer diferentes lecturas digitales optimizandolas y
* enviándolas por puerto serial
* @author: Johnny Cubides
* contact: [email protected], [email protected]
* date: Oct 02, 2018
* license: GPL
** Peso dado a cada sensor
* 128
* |64
* ||32
* |||16
* ||||8421
* ||||||||
* 76543210 --> Posición de cada sensor
* ||||||||_ primer sensor
* |||||||__ segundo sensor
* ||||||___ tercer sensor
* |||||____ Cuarto sensor
* ||||_____ Quinto sensor
* |||______ Sexto sensor
* ||_______ Séptimo sensor
* |________ Octavo sensor
** Por cada sensor actico, (un uno lógico), al digital_value se suma un peso.
* Ejemplo:
* pimer sensor activo --> digital_value = 1
* segundo sensor activo --> digital_value = 2
* tercer sensor activo --> digital_value = 4
* los tres sensores activos --> digital_value = 4+2+1 = 7
* Ocho sensores activos --> digital_value = 128+64+32+16+8+4+2+1 = 255
* Nota:
* No hay ninguna combinación que permita obtener el mismo resultado, es así
* que se puede distinguir qué sensor o qué sensores están activos.
*/// Máxima cantidad de sensores digitales a conectar#define MAX_DIGITAL_SENSOR 1 //Poner la cantidad que usted vaya a usar#define BAUDRATE 9600 //9600 o 115200#define DELAY 1 //Tiempo en milisegundos#define INITIAL 0
// Definición de sensores: pin, valor digital, valor digital antiguostruct Digital_Sensor{
int pin_number[MAX_DIGITAL_SENSOR];bool logic[MAX_DIGITAL_SENSOR];int digital_value;int digital_value_old;
};
// Creación de sensores digitales; tenga en cuenta la lógica del sensorstruct Digital_Sensor digital_sensors = {
// Poner el número de pin de los sensores según el orden que usted haya// establecido; la cantidad de pines debe coincidir con el MAX_DIGITAL_SENSOR.
(continues on next page)
3.2. Interpretando sensores digitales en ChucK desde Arduino 33
![Page 38: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/38.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
{2},{1}, //Lógica: 0 -> positiva; 1 -> negativaINITIAL,INITIAL
};
// Enviar lecturas digitalesvoid send_digital_readings(void);
void setup(){
// Configuración de pines como entradas de información de sensoresfor(int i=0; i < MAX_DIGITAL_SENSOR; i++){
pinMode(digital_sensors.pin_number[i], INPUT);}// Velocidad de comunicación con el PCSerial.begin(BAUDRATE);
}
// Ejecución de programa principalvoid loop(){
send_digital_readings();}
void send_digital_readings(void){
// Lectura de sensores digitalesfor (int i = 0; i < MAX_DIGITAL_SENSOR; i++){
digital_sensors.digital_value |= ((int)(digital_sensors.logic[i]^→˓digitalRead(digital_sensors.pin_number[i])))<<i;
}// Envío de lectura digitalif(digital_sensors.digital_value != digital_sensors.digital_value_old){
// Si tiene solo éstas entradas digitales, puede omitir la siguiente línea→˓comentandola
Serial.println("D");// Enviando el valor de los sensores digitalesSerial.println(digital_sensors.digital_value);digital_sensors.digital_value_old = digital_sensors.digital_value;
}// Fin de transmisión de un paquetedigital_sensors.digital_value = 0;delay(DELAY);
}
34 Capítulo 3. Arduino conectado a Chuck
![Page 39: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/39.jpg)
Curso de programación y música Documentation, Versión 1.0
3.3 Interpretando sensores analógicos en ChucK desde Arduino
3.3.1 Montajes
Lectura de Potenciometro
3.3.2 Código de ejemplo
Código ChucK
1 /*2 * @file analogSensors.ck3 * @brief Permite capturar dese el puerto serial diferentes lecturas4 * de sensores analógicos e interpretar desde ChucK.5 * @author: Johnny Cubides6 * contact: [email protected], [email protected] * date: Oct 03, 2018
(continues on next page)
3.3. Interpretando sensores analógicos en ChucK desde Arduino 35
![Page 40: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/40.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
8 * license: GPL9 */
10 //*********** CONFIGURACION PUERTO SERIAL *************11 <<<"Listando puertos seriales">>>;12 SerialIO.list() @=> string list[];13 for(int i; i < list.size(); i++){14 <<< i, ":", list[i] >>>;15 }16 <<<"Iniciando puerto serial">>>;17 SerialIO arduinoCom;18 //Seleccionar el puerto serial de interés19 //con el índice de la lista anterior20 arduinoCom.open(0, SerialIO.B9600, SerialIO.ASCII);21
22 3 => int MAX_ANALOG_SENSOR; //Cantidad de sensores23 3 => int MAX_OSCILATORS; //Cantidad de osciladores simultaneos a usar24
25 //Creación de osciladores26 SinOsc osc_a[MAX_OSCILATORS];27 [60 , 61, 62] @=> int midi_a[]; //Corresponde a la cantidad de osciladores a
→˓controlar28 [0.5, 0.5, 0.5] @=> float volumen_a[]; //Corresponde a la cantidad de osiladores a
→˓controlar29
30 //Iniciación de osciladores31 for(0 => int i; i< MAX_OSCILATORS; i++)32 {33 osc_a[i] => dac;34 midi_a[i] => Std.mtof => osc_a[i].freq;35 0 => osc_a[i].gain;36 }37
38 // Variables39 string line; // Guarda los valores recogidos por el puerto serial40 //el siguiente arreglo debe coincidir con el numbre y la cantidad41 //de identificadores para los sensores42 ["S1", "S2", "S3"]@=> string analogSensors[];43 int valueAnalogSensors[MAX_ANALOG_SENSOR]; // Guarda el valor de los sensores44 50::ms => dur myTime; // Cada cuanto se actualizarán los sonidos45
46 fun void readSerial()47 {48 while(true)49 {50 arduinoCom.onLine() => now;51 arduinoCom.getLine() => line;52 for(0=>int i; i < MAX_ANALOG_SENSOR; i++)53 {54 if(line == analogSensors[i])55 {56 arduinoCom.onLine() => now;57 arduinoCom.getLine() => line;58 Std.atoi(line) => valueAnalogSensors[i];59 break;60 }61 }62 }
(continues on next page)
36 Capítulo 3. Arduino conectado a Chuck
![Page 41: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/41.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
63 }64
65 fun void playSond()66 {67 while(true)68 {69 valueAnalogSensors[0] => osc_a[0].freq;70 0.1 => osc_a[0].gain;71 myTime => now;72 }73 }74
75 spork ~ readSerial();76 spork ~ playSond();77
78 while(true) 1::second => now;79
Código Arduino
1 /*2 * @file analog_reads.ino3 * @brief Permite hacer diferentes lecturas análogas4 * enviándolas por puerto serial5 * @author: Johnny Cubides6 * contact: [email protected], [email protected] * date: Oct 02, 20188 * license: GPL9 */
10 // Máxima cantidad de sensores analógicos a conectar11 #define MAX_SENSORS_ANALOG 2 //Poner la cantidad de sensores que usted vaya a usar12 #define BAUDRATE 9600 //9600 o 11520013 #define DELAY 10 //Tiempo en milisegundos14 #define INITIAL 015
16 // Definición del sensor: nombre, pin, valor análogo17 struct Analog_Sensor{18 String sensor_name;19 int pin_number; //A0, A1, A2...20 int sensitivity; //sensible [0,1,2,3,4,5,6...]insensible21 int analog_value;22 int analog_value_old;23 };24
25 //Punteros26 String *sensor_name;27 int *analog_sensitivity, *analog_value, *analog_value_old;28
29 // Total de sensores máximo 6 para arduino UNO del A0 al A530 struct Analog_Sensor analog_sensors[MAX_SENSORS_ANALOG] = {31 // La cantidad de sensores a declarar debe coincidir con32 // el número indicado en MAX_SENSORS_ANALOG33 {"S1", A0, 0, INITIAL, INITIAL}, //{"identificador", pin_arduino, senbilidad,
→˓valor_inicial, valor_inicial}34 {"S2", A1, 6, INITIAL, INITIAL}, //{"identificador", pin_arduino, senbilidad,
→˓valor_inicial, valor_inicial} (continues on next page)
3.3. Interpretando sensores analógicos en ChucK desde Arduino 37
![Page 42: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/42.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
35 };36
37 // Enviar lecturas analogas38 void send_analog_readings(void);39
40 void setup()41 {42 // Velocidad de comuicación con el PC43 Serial.begin(BAUDRATE);44 }45
46 // Ejecución de programa principal47 void loop()48 {49 send_analog_readings();50 }51
52 void send_analog_readings(void)53 {54 // Lectura de sensores analógicos55 for (int i = 0; i < MAX_SENSORS_ANALOG; i++)56 {57 analog_sensors[i].analog_value = analogRead(analog_sensors[i].pin_number);58 }59 // Envío de lecturas analógcas60 for (int i = 0; i < MAX_SENSORS_ANALOG; i++)61 {62 //única búsqueda y direccionamiento a punteros63 sensor_name = &analog_sensors[i].sensor_name;64 analog_value = &analog_sensors[i].analog_value;65 analog_value_old = &analog_sensors[i].analog_value_old;66 analog_sensitivity = &analog_sensors[i].sensitivity;67 //Para manejo de sensibilidad descomente éste if y comente el siguiente if68 if((*analog_value < *analog_value_old-*analog_sensitivity)||(*analog_value >
→˓*analog_value_old+*analog_sensitivity))69 //Sin manejo de sensibilidad descomente éste if y comente el anterior if70 //if(*analog_value != *analog_value_old)71 {72 Serial.println(*sensor_name);73 Serial.println(*analog_value);74 *analog_value_old = *analog_value;75 }76 }77 // Fin de transmisión de un paquete78 delay(DELAY);79 }
38 Capítulo 3. Arduino conectado a Chuck
![Page 43: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/43.jpg)
Curso de programación y música Documentation, Versión 1.0
3.4 Sonidos en formato wav, sensores análógicos y digitales
3.4.1 Código de ejemplo
Código ChucK
1 /*2 * @file digitalSensors.ck3 * @brief Permite capturar dese el puerto serial diferentes lecturas4 * de sensores digitales e interpretar desde ChucK.5 * @author: Johnny Cubides6 * contact: [email protected], [email protected] * date: Oct 03, 20188 * license: GPL9 */
10 //*********** CONFIGURACION PUERTO SERIAL *****************11 <<<"Listando puertos seriales">>>;12 SerialIO.list() @=> string list[];13 for(int i; i < list.size(); i++){14 <<< i, ":", list[i] >>>;15 }16 <<<"Iniciando puerto serial">>>;17 SerialIO arduinoCom;18 //Seleccionar el puerto serial de interés19 //con el índice de la lista anterior20 arduinoCom.open(0, SerialIO.B9600, SerialIO.ASCII);21
22 Gain master => dac;23
24 //*********** CONFIGURACION INSTRUMENTO NOTAS MIDI *******25 3 => int MAX_DIGITAL_SENSOR;26 SinOsc osc[MAX_DIGITAL_SENSOR];27 //Los siguientes 2 arregos corresponden a la posición decada sensor,28 //en éste ejemplo son tres sensores que tienen asociadas 3 notas con29 //su respectivo volumen.30 [60 , 61, 62] @=> int midi[];31 [0.5, 0.5, 0.5] @=> float volumen[];32
33 for(0 => int i; i< MAX_DIGITAL_SENSOR; i++)34 {35 osc[i] => master;36 midi[i] => Std.mtof => osc[i].freq;37 0 => osc[i].gain;38 }39 50::ms => dur myTime; // Cada cuanto se actualizarán los sonidos40
41 //********** CONFIGURACION DE SONIDOS WAV *****************42 2 => int MAX_PUSH_SENSOR;43 SndBuf wav[MAX_PUSH_SENSOR];44 [45 "kick_1.wav",46 "acoustic_ride_cymbal.wav"47 ] @=> string audios[];48 for(0 => int i; i< MAX_PUSH_SENSOR; i++)49 {50 me.dir()+audios[i] => wav[i].read;
(continues on next page)
3.4. Sonidos en formato wav, sensores análógicos y digitales 39
![Page 44: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/44.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
51 wav[i] => master;52 }53 1000::ms => dur myTimeWav; // Cada cuanto se actualizarán los sonidos54
55 // Variables56 string line; // Guarda los valores recogidos por el puerto serial57 0 => int valueDigital; // Guarda el valor de los sensores digitales58 0 => int valuePush; //Elementos a presionar59
60 fun void readSerial()61 {62
63 <<<"ok">>>;64 while(true)65 {66 arduinoCom.onLine() => now;67 arduinoCom.getLine() => line;68 //<<<line>>>;69 if(line == "D")70 {71 arduinoCom.onLine() => now;72 arduinoCom.getLine() => line;73 while(line == ""){74 arduinoCom.onLine() => now;75 arduinoCom.getLine() => line;76 }77 Std.atoi(line) => valueDigital;78 //<<<line>>>;79 }else if(line == "P")80 {81 arduinoCom.onLine() => now;82 arduinoCom.getLine() => line;83 while(line == ""){84 arduinoCom.onLine() => now;85 arduinoCom.getLine() => line;86 }87 Std.atoi(line) => valuePush;88 //<<<line>>>;89 }90 }91 }92
93 fun void playDigitalSond()94 {95 while(true)96 {97 for(0 => int i; i< MAX_DIGITAL_SENSOR; i++)98 {99 volumen[i]*(valueDigital & (1 << i)) => osc[i].gain;
100 }101 myTime => now;102 }103 }104
105 fun void playWavSond()106 {107 while(true)
(continues on next page)
40 Capítulo 3. Arduino conectado a Chuck
![Page 45: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/45.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
108 {109 for(0 => int i; i< MAX_PUSH_SENSOR; i++)110 {111 if(valuePush & (1 << i))112 0 => wav[i].pos;113 }114 myTimeWav => now;115 }116 }117
118 spork ~ readSerial();119 spork ~ playDigitalSond();120 spork ~ playWavSond();121
122 while(true) 1::second => now;123
Código Arduino
1 /*2 * @file digital_reads.ino3 * @brief Permite hacer diferentes lecturas digitales optimizandolas y4 * enviándolas por puerto serial5 * @author: Johnny Cubides6 * contact: [email protected], [email protected] * date: Oct 02, 20188 * license: GPL9 *
10 * Peso dado a cada sensor11 * 12812 * |6413 * ||3214 * |||1615 * ||||842116 * ||||||||17 * 76543210 --> Posición de cada sensor18 * ||||||||_ primer sensor19 * |||||||__ segundo sensor20 * ||||||___ tercer sensor21 * |||||____ Cuarto sensor22 * ||||_____ Quinto sensor23 * |||______ Sexto sensor24 * ||_______ Séptimo sensor25 * |________ Octavo sensor26 *27 * Por cada sensor actico, (un uno lógico), al digital_value se suma un peso.28 * Ejemplo:29 * pimer sensor activo --> digital_value = 130 * segundo sensor activo --> digital_value = 231 * tercer sensor activo --> digital_value = 432 * los tres sensores activos --> digital_value = 4+2+1 = 733 * Ocho sensores activos --> digital_value = 128+64+32+16+8+4+2+1 = 25534 * Nota:35 * No hay ninguna combinación que permita obtener el mismo resultado, es así36 * que se puede distinguir qué sensor o qué sensores están activos.
(continues on next page)
3.4. Sonidos en formato wav, sensores análógicos y digitales 41
![Page 46: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/46.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
37 */38 // Máxima cantidad de sensores analógicos a conectar39 #define MAX_DIGITAL_SENSOR 3 //Poner la cantidad que usted vaya a usar40 // Máxima cantidad de sensores analógicos a conectar41 #define MAX_ANALOG_SENSORS 2 //Poner la cantidad de sensores que usted vaya a usar42 #define BAUDRATE 9600 //9600 o 11520043 #define DELAY 1 //Tiempo en milisegundos44 #define INITIAL 045
46 //47 struct Analog2Digital_Sensor{48 unsigned int pin_number[MAX_ANALOG_SENSORS]; //A0, A1, A2...49 unsigned int value_analog[MAX_ANALOG_SENSORS];50 bool logic[MAX_ANALOG_SENSORS]; //Lógica del sensor 0->Positiva, 1->Negativa51 unsigned int threshold[MAX_ANALOG_SENSORS];52 unsigned int digital_value; //All array53 unsigned int digital_value_old; // All array54 };55
56 struct Analog2Digital_Sensor analog2digital_sensor = {57 {A0, A1},58 {INITIAL, INITIAL},59 {0, 0}, // 0->lógica positiva, 1-> lógica negativa60 {100, 200}, // umbral[0, 1023]61 INITIAL,62 INITIAL63 };64
65 bool *logic;66 unsigned int *threshold, *digital_value, *digital_value_old, *value_analog;67
68 // Definición de sensores: pin, valor digital, valor digital antiguo69 struct Digital_Sensor{70 int pin_number[MAX_DIGITAL_SENSOR];71 bool logic[MAX_DIGITAL_SENSOR];72 int digital_value;73 int digital_value_old;74 };75
76 // Creación de sensores digitales; tenga en cuenta la lógica del sensor77 struct Digital_Sensor digital_sensors = {78 // Poner el número de pin de los sensores según el orden que usted haya79 // establecido; la cantidad de pines debe coincidir con el MAX_DIGITAL_SENSOR.80 {2, 3, 4}, //ejemplo:{pin_arduino, pin_arduino, pin_number81 {0, 0, 0}, //Lógica de cada pin ↑ : 0 -> positiva; 1 -> negativa, la posición
→˓corresponde al pin_arduino82 INITIAL, //Puede siempre iniciar en 083 INITIAL //Puede siempre iniciar en 084 };85
86
87
88 // Convierte analogo a digital y envía dato89 // el switch, se refiere a que debe ser pulsado para90 // intercambiar estado, si no se hace, permanece en el último estado91 void send_analog_2_digital_push_button(void);92
(continues on next page)
42 Capítulo 3. Arduino conectado a Chuck
![Page 47: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/47.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
93 // Enviar lecturas digitales94 void send_digital_readings(void);95
96 void setup()97 {98 // Configuración de pines como entradas de información de sensores99 for(int i=0; i < MAX_DIGITAL_SENSOR; i++)
100 {101 pinMode(digital_sensors.pin_number[i], INPUT);102 }103 // Velocidad de comunicación con el PC104 Serial.begin(BAUDRATE);105 }106
107 // Ejecución de programa principal108 void loop()109 {110 send_digital_readings();111 send_analog_2_digital_push_button();112 }113
114 void send_digital_readings(void)115 {116 // Lectura de sensores digitales117 for (int i = 0; i < MAX_DIGITAL_SENSOR; i++)118 {119 digital_sensors.digital_value |= ((int)(digital_sensors.logic[i]^
→˓digitalRead(digital_sensors.pin_number[i])))<<i;120 }121 // Envío de lectura digital122 if(digital_sensors.digital_value != digital_sensors.digital_value_old){123 // Si tiene solo éstas entradas digitales, puede omitir la siguiente línea
→˓comentandola124 Serial.println("D");125 // Enviando el valor de los sensores digitales126 Serial.println(digital_sensors.digital_value);127 digital_sensors.digital_value_old = digital_sensors.digital_value;128 }129 // Fin de transmisión de un paquete130 digital_sensors.digital_value = 0;131 delay(DELAY);132 }133
134 void send_analog_2_digital_push_button(void)135 {136 for (int i = 0; i < MAX_ANALOG_SENSORS; i++)137 {138 analog2digital_sensor.value_analog[i] = analogRead(analog2digital_sensor.pin_
→˓number[i]);139 }140 for (int i = 0; i < MAX_ANALOG_SENSORS; i++)141 {142 logic = &analog2digital_sensor.logic[i];143 threshold = &analog2digital_sensor.threshold[i];144 value_analog = &analog2digital_sensor.value_analog[i];145 analog2digital_sensor.digital_value |= ((int)(*logic^((*value_analog >
→˓*threshold)?1:0)))<<i;(continues on next page)
3.4. Sonidos en formato wav, sensores análógicos y digitales 43
![Page 48: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/48.jpg)
Curso de programación y música Documentation, Versión 1.0
(proviene de la página anterior)
146 }147 // Envío de lectura digital148 if(analog2digital_sensor.digital_value != analog2digital_sensor.digital_value_old)
→˓{149 // Si tiene solo éstas entradas digitales, puede omitir la siguiente línea
→˓comentandola150 Serial.println("P");151 // Enviando el valor de los sensores digitales152 Serial.println(analog2digital_sensor.digital_value);153 analog2digital_sensor.digital_value_old = analog2digital_sensor.digital_value;154 }155 // Fin de transmisión de un paquete156 analog2digital_sensor.digital_value = 0;157 delay(DELAY);158 }
genindex
modindex
search
44 Capítulo 3. Arduino conectado a Chuck
![Page 49: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/49.jpg)
CAPÍTULO 4
Elementos de ayuda
4.1 Mi propio amplificador de audio
Atención: ¿No puedes ver el vídeo? Mantén presionado aquí en video hasta que se habilite la opción de abrirloen la app de YOUTUBE.
4.2 Links de interés
4.2.1 Donal en la tierra mágica de la matemática
Las matemáticas en el mundo del arte, arquitectura, escultura, pintura, el número aureo en la naturaleza y más.
Atención: ¿No puedes ver el vídeo? Mantén presionado aquí en video hasta que se habilite la opción de abrirloen la app de YOUTUBE.
Por hacer: ¿De qué manera se puede encontrar el número Aureo?
4.2.2 ChucK
Chuck es un lenguaje de programación que permite sintetizar sonidos y crear música. Links:
chuck_oficial_link.
chuck_oficial_download.
45
![Page 50: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/50.jpg)
Curso de programación y música Documentation, Versión 1.0
4.2.3 Musescore
Con musescore puedes crear, reproducir e imprimir tus partiruras. Éste programa es multiplataforma (Windows, Ma-cOs, GNU Linux), se descarga de manera gratuita.
Puedes descargar musescore desde aquí: musescore_download.
4.2.4 LMMS
Con LMMS puedes producir música digital desde la PC, conectando y desconectado diferentes elementos que sinteti-zan diferentes sonidos, pudesde descargarlo desde aquí: LMMS_download.
4.2.5 Freesound
Freesound es un repositorio de muestras de audio con licencia CC, sin ánimo de lucro, donde puedes guardar, repro-ducir y descargar tales muestras de manera libre y sin costo.
genindex
modindex
search
46 Capítulo 4. Elementos de ayuda
![Page 51: Curso de programación y música Documentation](https://reader035.vdocuments.us/reader035/viewer/2022071214/62cb72314ca4b50f185cc4d3/html5/thumbnails/51.jpg)
CAPÍTULO 5
Indices and tables
genindex
modindex
search
47