curso de programación y música documentation

51
Curso de programación y música Documentation Versión 1.0 Johnny Cubides 17 de noviembre de 2018

Upload: others

Post on 11-Jul-2022

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Curso de programación y música Documentation

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
Page 3: Curso de programación y música Documentation

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

II

Page 5: Curso de programación y música Documentation

Curso de programación y música Documentation, Versión 1.0

Contents: 1

Page 6: Curso de programación y música Documentation

Curso de programación y música Documentation, Versión 1.0

2 Contents:

Page 7: Curso de programación y música Documentation

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CAPÍTULO 5

Indices and tables

genindex

modindex

search

47