A/3
Activitat 3
- El polsador. Per tocar el so que volem quan nosaltres volem.
Aquesta activitat explica l’esquema de components i com carregar el programa del Polcatrònik a l’Arduino.
Un cop carregat ja pots practicar amb el teu polcatrònik, funciona així:
– El potenciòmetre 1 regula la primera nota entre DO, DO#, RE, RE#, … i SI
– El potenciòmetre 2 regula la distància entre la primera i la segona nota.
Així si la primera nota és un DO, la segona pot variar entre: DO3, MI3, SOL3, DO4, MI4, SOL4 O DO5
– El potenciòmetre 3 regula el temps que hi ha entre les dues notes.
– El polsador fa sonar una nota aleatòria de la tonalitat.
1 Arduino UNO
1 Protoboard
2 Díodes emissors de llum o díode LED
3 Resistències elèctriques de 230 Ohms
1 Connector jack de 3.5mm per a protoboard
1 Polsador
1 Interruptor
3 Potenciòmetres
Diversos cables (mascle – mascle)
1 Auricular o altaveu per sentir el so que surt del jack
// Manual Instròniks // Crea el teu pròpi instrument /* * Aquest és l'últim codi del manual instròniks * Un cop carregat a l'Arduino, permet controlar el polcatrònik * Funcionament: * - El potenciòmetre 1 regula la primerar nota entre DO, DO#, RE, RE#, ... i SI * - El potenciòmetre 2 regula la distància entre la primera i la segona nota. * Així si la primera nota és un DO la segona pot variar entre: DO3, MI3, SOL3, DO4, MI4, SOL4 O DO5 * - El potenciòmetre 3 regula el temps que hi ha entre les dues notes. * - El pulsador fa sonar una nota aleatoria de la tonalitat. */ // definim totes les notes amb el valor de la seva freqüència int NOTE_B0 = 31; int NOTE_C1 = 33; int NOTE_CS1 = 35; int NOTE_D1 = 37; int NOTE_DS1 = 39; int NOTE_E1 = 41; int NOTE_F1 = 44; int NOTE_FS1 = 46; int NOTE_G1 = 49; int NOTE_GS1 = 52; int NOTE_A1 = 55; int NOTE_AS1 = 58; int NOTE_B1 = 62; int NOTE_C2 = 65; int NOTE_CS2 = 69; int NOTE_D2 = 73; int NOTE_DS2 = 78; int NOTE_E2 = 82; int NOTE_F2 = 87; int NOTE_FS2 = 93; int NOTE_G2 = 98; int NOTE_GS2 = 104; int NOTE_A2 = 110; int NOTE_AS2 = 117; int NOTE_B2 = 123; int NOTE_C3 = 131; int NOTE_CS3 = 139; int NOTE_D3 = 147; int NOTE_DS3 = 156; int NOTE_E3 = 165; int NOTE_F3 = 175; int NOTE_FS3 = 185; int NOTE_G3 = 196; int NOTE_GS3 = 208; int NOTE_A3 = 220; int NOTE_AS3 = 233; int NOTE_B3 = 247; int NOTE_C4 = 262; int NOTE_CS4 = 277; int NOTE_D4 = 294; int NOTE_DS4 = 311; int NOTE_E4 = 330; int NOTE_F4 = 349; int NOTE_FS4 = 370; int NOTE_G4 = 392; int NOTE_GS4 = 415; int NOTE_A4 = 440; int NOTE_AS4 = 466; int NOTE_B4 = 494; int NOTE_C5 = 523; int NOTE_CS5 = 554; int NOTE_D5 = 587; int NOTE_DS5 = 622; int NOTE_E5 = 659; int NOTE_F5 = 698; int NOTE_FS5 = 740; int NOTE_G5 = 784; int NOTE_GS5 = 831; int NOTE_A5 = 880; int NOTE_AS5 = 932; int NOTE_B5 = 988; int NOTE_C6 = 1047; int NOTE_CS6 = 1109; int NOTE_D6 = 1175; int NOTE_DS6 = 1245; int NOTE_E6 = 1319; int NOTE_F6 = 1397; int NOTE_FS6 = 1480; int NOTE_G6 = 1568; int NOTE_GS6 = 1661; int NOTE_A6 = 1760; int NOTE_AS6 = 1865; int NOTE_B6 = 1976; int NOTE_C7 = 2093; int NOTE_CS7 = 2217; int NOTE_D7 = 2349; int NOTE_DS7 = 2489; int NOTE_E7 = 2637; int NOTE_F7 = 2794; int NOTE_FS7 = 2960; int NOTE_G7 = 3136; int NOTE_GS7 = 3322; int NOTE_A7 = 3520; int NOTE_AS7 = 3729; int NOTE_B7 = 3951; int NOTE_C8 = 4186; int NOTE_CS8 = 4435; int NOTE_D8 = 4699; int NOTE_DS8 = 4978; // Vector per totes les notes int notes[] = { NOTE_C3, NOTE_CS3, NOTE_D3, NOTE_DS3, NOTE_E3, NOTE_F3, NOTE_FS3, NOTE_G3, NOTE_GS3, NOTE_A3, NOTE_AS3, NOTE_B3, NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5 }; int escala[] = {0,4,7,12,16,19,24}; int tempos[] = {200,300,500,700}; // Variables pels valors dels potenciòmetres int pote1 = 0; int pote2 = 0; int pote3 = 0; // Variables per recollir valors del pulsador i de l'interruptor int pul1 = 0; int int1 = 0; // Variables per les notes i pel tempo int notafinal1 = 0; int notafinal2 = 0; int tempo = 0; int limit = 0; // Variable per saber si l'interruptor està sent apretat boolean apretat = false; // Variables per a calcular el tempo, per alternar notes i pel valor aleatori int beat = 0; int a = 0; int aleatori = 0; // Variable per saber quina nota sona int quinaNotaSona = 0; // Variable per desar els milisegons que han passat unsigned long tempsActual = 0; // Variable per desar el moment que ha de sonar la proxima nota unsigned long tempsProperaNota = 0; // Funcio per escriure pel port sèrie els valors de les variables void mostraVariables() { Serial.print(pote1); Serial.print(" - "); Serial.print(pote2); Serial.print(" - "); Serial.print(pote3); Serial.print(" - "); Serial.print(notafinal1); Serial.print(" - "); Serial.print(notafinal2); Serial.print(" - "); Serial.print(tempo); Serial.print(" - "); Serial.print(pul1); Serial.print(" - "); Serial.print(int1); Serial.print(" - b:"); Serial.print(beat); Serial.print(" - tp:"); Serial.print(tempsProperaNota); Serial.print(" - ta:"); Serial.print(tempsActual); Serial.print(" - limit:"); Serial.println(limit); } void setup() { pinMode(3,OUTPUT); pinMode(4,INPUT); pinMode(5,INPUT); pinMode(A0,INPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); Serial.begin(9600); } void loop() { // Capturar el temps que ha passat des de que ha arrencat Arduino tempsActual = millis(); // Recuperar l'estat dels INPUTS i desar a variables pul1 = digitalRead(4); int1 = digitalRead(5); pote1 = analogRead(A0); pote2 = analogRead(A1); pote3 = analogRead(A2); notafinal1 = map(pote1, 0, 1023, 0, 12); notafinal2 = notafinal1 + escala[ map(pote2, 0, 1023, 0, 7) ]; // Agafem el temp de la llista que indiqui el pote3 beat = map(pote3, 0, 1023, 0, 4); tempo = tempos[beat]; // Cridem que s'executi la funcio que mostra variables al port sèrie mostraVariables(); // Si el pulsador està apretat if( pul1 == HIGH ) { // Si encara no sabiem que estava apretat if( !apretat ) { // Indicar que s'està apretant el botó apretat = true; // Fer sonar una nota aleatoria aleatori = escala[random(0, 7)]; tone(3, notes[notafinal1 + aleatori], 50); } } else { // Si el pulsador no esta apretat apretat = false; } // Si l'interruptor està OFF if (int1 == LOW) { // Indicar quin és el pròxim temps que sonarà una nota tempsProperaNota = tempsActual + tempo; a = 0; digitalWrite(12,LOW); digitalWrite(13,LOW); } else { // Si interruptor està a ON limit = tempsActual - tempsProperaNota; // Si s'ha arribat al temps de que ha de sonar una nota if (limit >= 0) { // Indicar quin es el pròxim temps que sonarà una nota tempsProperaNota = tempsActual + tempo; // si a val 0 if (a == 0) { // Activar LED 13 i desactivar LED 12 digitalWrite(12,LOW); digitalWrite(13,HIGH); tone(3, notes[notafinal1], 20); } else { // si a val 1 // Activar LED 12 i desactivar LED 13 digitalWrite(12,HIGH); digitalWrite(13,LOW); tone(3, notes[notafinal2], 20); } // Incrementem a. Si a >= 2 posar a 0 quedant 0 i 1 com valors possibles a = (a + 1) % 2; } } }
A. Mmmmm… ara ens hem fixat que el codi que us hem donat, no fa el mateix que el videotutorial A4.1. Que sabries modificar el codi i fer que fes el mateix que fa el videotutorial?
Algunes preguntes de música que el Polcatrònik et pot ajudar a entendre.
B. Què és el ritme?
C. Què és el tempo?
D. Què és la tonalitat?
E. Què són la dominant la tercera i la quinta en música?
F. Què és l’escala pentatònica?
G. Com podem lligar les matemàtiques i la música?
NOTA: Si tens resposta a alguna d’aquestes preguntes, o alguna observació, la pots compartir per Twitter.
Etiqueta la resposta amb el hashtag: #instroniks_a4 i @instroniks
Així la podrem veure dins d’aquesta activitat.