Paola Chicano L - Proyecto Final I&P

De Casiopea


TítuloPablo Chicano L - Proyecto Final I&P
Tipo de ProyectoProyecto de Curso
Período2020-2020
AsignaturaInteracción y Performatividad
Del CursoInteracción y Performatividad 2020
CarrerasDiseñ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
ProfesorRenzo 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

Perf 2020 Pablo Chicano Lcroquis.jpg

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

Perf 2020 Pablo Chicano L7.jpg Perf 2020 Pablo Chicano L6.jpg

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;
             }
      
    }
   }
}