Paola Chicano L - Proyecto Final I&P
Título | Pablo Chicano L - Proyecto Final I&P |
---|---|
Tipo de Proyecto | Proyecto de Curso |
Período | 2020-2020 |
Asignatura | Interacción y Performatividad |
Del Curso | Interacción y Performatividad 2020 |
Carreras | Diseño, Diseño Gráfico"Diseño Gráfico" is not in the list (Arquitectura, Diseño, Magíster, Otra) of allowed values for the "Carreras Relacionadas" property., Diseño Industrial"Diseño Industrial" is not in the list (Arquitectura, Diseño, Magíster, Otra) of allowed values for the "Carreras Relacionadas" property. |
Alumno(s) | Pablo Chicano |
Profesor | Renzo Varela |
Secuenciador de sonido de 6 pasos (step sequencer)
Un secuenciador produce, como su nombre lo indica, secuencias de notas las cuales se pueden ir modificando para crear múltiples combinaciones de secuencias. En este caso, al utilizarse un arduino, las notas producidas son sonidos de 8 bit. La idea de este secuenciador al ser un circuito pequeño era hacerlo lo mas portable posible, a modo de ser un juguete lúdico y de bolsillo. El circuito también puede ser ampliado y el código modificado para cambiar las notas utilizadas, el tempo, los juegos de luces, etc... Podria también funcionar en conjunto con otros sistemas como osciladores o clocks si se agregaran los componentes pertinentes (entradas de conexión).
Croquis y maqueta virtual
El objeto es pensado para ser lo más portable posible desde sus mínimas dimensiones, debe tener como emitir sonido por sí mismo y funcionar con pilas o baterías recargables, también debe poseer salidas de audio para poder utilizarlo con audífonos o equipos de música anexos. Se piensa desde esto la mejor posición posible para los elementos, para que no topen entre si y evitar que el calor emane a las baterias.
Funcionamiento
Entrada: Para este circuito se utilizan potenciómetros y las entradas análogas de arduino, a modo de utilizar los valores entregados por estos y mapearlos a escalas de notas musicales de 8 bits. En este caso se utilizan 6 ya que es un sequenciador de 6 pasos.
Salida: La salida utilizada para este proyecto es un piezo, el cual tiene la facultad de emitir sonidos, de igual manera podría usarse una bocina (parlante) o utilizar un jack de audio mono para utilizar equipos de sonido externos.
Código:
Se parten definiendo los tonos en arduino, el cual tiene la facultad de poder generar tonos de 8 bits.
Luego de esto se deben declarar los tonos que se utilizaran para cada potenciómetro, estos serán el rango de nota a nota, por lo cual se deben escoger 12 de los definidos anteriormente.
Se deben definir el piezo, los potenciómetros, los led y por ultimo las variables que guardaran los valores de los potenciómetros (readPot) y la variable k, la cual guardará el valor del loop.
Junto a esto se declara también la variable bpm (beats por minuto), y los float D[] (el cual define si el patrón de notas es de 3/4 o 4/4) y subDivision (define si se utiliza un cuarto de nota, un octavo de nota, etc...).
NDuration da la cantidad de notas por secuencia, en este caso 6.
Durcount guarda la duración de cada secuencia.
value[] es el valor para definir el intervalo discreto de tono al usar el potenciómentro.
note[] guarda las notas de cada secuencia.
En el setup se define el comportamiento de entrada del pin que recibe el switch (poosteriormente usado para activar el circuito), el intervalo de notas, que se calcula dividiendo 60000/(subDivision*Bpm) y cambiando el valor se obtienen distintos intervalos, y el comportamiento de salida de los 6 led.
En el loop, primero, desde la condicional que el switch conectado al pin 3 esté en posición de encendido, se ordena que para el ciclo de cada potenciómetro (guardado en el valor k), se mapea el valor de entrada de los pot (1023) al valor de cada escala segun los intervalos (2500).
Por medio de condicionales if, se realiza una discretización de los intervalos de los pots para poder asignar la nota a cada posición de estos. Esto quiere decir que todos los potenciómetros tienen una escala de 12 notas posibles.
Para reproducir las notas se ocupan los float anteriormente mencionados el cual utiliza el valor guardado en cada secuencia, y la duración de cada secuencia es la duración de cada nota sumada.
Finalmente, se acompaña la secuencia de notas con una secuencia de luces led las cuales van marcando cada secuencia, utilizando una condicional if y un contador para esto, el cual se reinicia cada ciclo.
Video de Referencia
Simulación en tinkercad
Componentes del circuito:
- Arduino Uno
- LED (colores a elección) x 6
- Resistencias 330 ohm x 6
- Resistencia 10k ohm
- Potenciómetro 10k lineal x 6
- Switch ON/OFF
- Piezo / Parlante / plug de audio mono
Step Sequencer 6 step - Pablo Chicano L
Código (comentado)
// Tabla de definicion de tonos #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978 // Declaración de tonos usados en el sequencer // Definición de rango de notas (a elección) int pitch[] = { NOTE_C3, NOTE_GS3, NOTE_CS3, NOTE_AS3, NOTE_A3, NOTE_B3, NOTE_F4, NOTE_DS4, NOTE_E4, NOTE_G3, NOTE_D4, NOTE_FS4}; // Declaración de variables int speaker = 9; //Piezo int k=0; //Variable para guardar el valor del loop int POT1 = A0; //Potenciometro 1 int POT2 = A1; //Potenciometro 2 int POT3 = A2; //Potenciometro 3 int POT4 = A3; //Potenciometro 4 int POT5 = A4; //Potenciometro 5 int POT6 = A5; //Potenciometro 6 int ReadPot1,ReadPot2,ReadPot3,ReadPot4,ReadPot5,ReadPot6; // Variable que guarda el valor de los pot // Variables para calcular el tempo // bpm (beats per minute o beats por minuto) int bpm=180; // Subdivisiones: 1=un cuarto de nota; 0.5=octavo de nota, etc... float subdivision=1; //Aquí se define la secuencia de las duraciones float D[] = {1, 0.5, 0.5, 0.333, 0.333, 0.333}; //3/4 pattern //float D[] = {1, 0.5, 0.5, 1,0.5, 0.5}; //4/4 pattern // Largo del array D int NDuration=6; int DurCount=0; int value[] = {0, 0, 0, 0, 0, 0}; // Valor para definir el intervalo discreto de tono al usar el potenciomentro int note[] = {0, 0, 0, 0, 0, 0}; int interval; int i=1; int led1 = 4; int led2 = 5; int led3 = 6; int led4 = 7; int led5 = 8; int led6 = 10; void setup() { pinMode(3, INPUT); //Periodo segun bpm y subdivisiones interval = 60000/(subdivision*bpm); //leds indicadores de paso pinMode (led1, OUTPUT); pinMode (led2, OUTPUT); pinMode (led3, OUTPUT); pinMode (led4, OUTPUT); pinMode (led5, OUTPUT); pinMode (led6, OUTPUT); } void loop() { if(digitalRead(3)==HIGH){ //La secuencia inicia solo cuando el interruptor está en posición de encendido for (k = 0; k <= 5; k++) { // Ciclo en cada potenciómetro value[k] = map(analogRead(k), 0, 1023, 0, 2500); // Mapeo del valor del pot para tener un rango más amplio de valores if ((value[k]>=0) && (value[k]<100)) // Discretización de los intervalos de los pots para poder asignar la nota note[k] = 0; if ((value[k]>=100) && (value[k]<300)) note[k] = pitch[0]; if ((value[k]>=300) && (value[k]<500)) note[k] = pitch[1]; if ((value[k]>=500) && (value[k]<700)) note[k] = pitch[2]; if ((value[k]>=700) && (value[k]<900)) note[k] = pitch[3]; if ((value[k]>=900) && (value[k]<1100)) note[k] = pitch[4]; if ((value[k]>=1100) && (value[k]<1300)) note[k] = pitch[5]; if ((value[k]>=1300) && (value[k]<1500)) note[k] = pitch[6]; if ((value[k]>=1500) && (value[k]<1700)) note[k] = pitch[7]; if ((value[k]>=1700) && (value[k]<=1900)) note[k] = pitch[8]; if ((value[k]>=1900) && (value[k]<=2100)) note[k] = pitch[9]; if ((value[k]>=2100) && (value[k]<=2300)) note[k] = pitch[10]; if ((value[k]>=2300) && (value[k]<=2500)) note[k] = pitch[11]; float Duration=D[DurCount]*interval; tone(speaker, note[k], Duration); // Play the note DurCount++; if(DurCount>=NDuration)DurCount=0; delay(Duration); //Duración de cada nota //Secuencia de leds como indicadores de pasos if(i<=6){ digitalWrite(led1, HIGH); // Enciende el LED if(i == 2) { digitalWrite(led2, HIGH); // Enciende el LED } if(i == 3) { digitalWrite(led3, HIGH); // Enciende el LED } if(i == 4) { digitalWrite(led4, HIGH); // Enciende el LED } if(i == 5) { digitalWrite(led5, HIGH); // Enciende el LED } if(i == 6) { digitalWrite(led6, HIGH); // Enciende el LED } i++; } else { digitalWrite(led2, LOW); digitalWrite(led3, LOW); digitalWrite(led4, LOW); digitalWrite(led5, LOW); digitalWrite(led6, LOW); i=2; } } } }