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.