Skicka och ta emot MIDI med Arduino (9 / 11 steg)
Steg 9: Pitchbend och Arduino
Nu när du vet hur man styr anteckning på och notera bort, kan du prova pitchbend.
Pitchbend information lagras i 2 data-byte, och mest signifikanta byte (MSB) och en minst signifikanta byte (LSB). Var och en av dessa byte innehåller bara 7 bitar av information. Detta innebär att alla pitchbend information lagras i 14 bitar, med de mest betydande 7 bitar lagras i MSB och de minst signifikanta 7 bitar lagras i LSB.
För de flesta tillämpningar endast hittar dig ändra pitchbend via MSB och bara ställa LSB till 0. I det här fallet har du 7 bitar av upplösning för pitchbend (128 steg). I MIDI-protokollet pitchbend = 64 är ingen pitchbend, pitchbend större än 64 är pitchbends frekvensen upp, och mindre än 64 pitchbends frekvensen ner.
I exemplet nedan en anteckning spelade och rymde, sedan spelade igen medan de pitchbend höjningarna från 64 till sitt max värde på 127, sedan spelade en tredje gång medan de pitchbend höjningarna från 64 till dess min värdet 0. Denna sekvens är loopas för evigt. Bilderna ovan visar utdata i ableton från denna Arduino skiss.
< pre > / *
MIDI-Pitchbend (msb)
Av Amanda Ghassaei
Juli 2012
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*/
int noteON = 144; //144 = 10010000 i binärt, notera på kommando
noteON lagring av data:
int Obs = 60; //middle c
int hastighet = 100; //velocity för MIDI-noter, måste vara mellan 0 och 127
(högre hastighet gör vanligtvis MIDI-instrument högre)
int pitchbend = 224; //224 = 11100000 i binär, pitchbend kommando
pitchbend datalagring:
int lsb = 0; //least siginificant bit av pitchbend meddelande
int msb = 0; //most signifikanta biten av pitchbend meddelande
void setup() {
Ställ in MIDI-baud-hastighet:
Serial.BEGIN(31250);
}
void loop() {
först spela Obs utan pitchbend
MIDImessage (pitchbend, 0, 64); //reset pitchbend till 0 (noll pitchbend är lsb = 0, msb = 64)
MIDImessage (noteON, Obs, velocity); //turn anteckning på
fördröjning (700); //sustain anmärkning
MIDImessage (noteON, Obs, 0); //turn anmärkning av
fördröjning (500); //wait 500ms tills utlöser nästa anteckning
sedan spela med pitchbend
MIDImessage (pitchbend, 0, 64); //reset pitchbend till 0 (noll pitchbend är lsb = 0, msb = 64)
MIDImessage (noteON, Obs, velocity); //turn anteckning på
för (msb = 64, msb < = 127; msb ++) {//increase pitchbend msb 64 (ingen pitchbend) till 127
MIDImessage (pitchbend, lsb, msb); //send pitchbend meddelande
Delay(10);
}
MIDImessage (noteON, Obs, 0); //turn anmärkning av
fördröjning (500); //wait 500ms tills utlöser nästa anteckning
sedan spela med pitchbend
MIDImessage (pitchbend, 0, 64); //reset pitchbend till 0 (noll pitchbend är lsb = 0, msb = 64)
MIDImessage (noteON, Obs, velocity); //turn anteckning på
för (msb = 64, msb > = 0; msb--) {//decrease pitchbend msb från 64 (ingen pitchbend) 0;
MIDImessage (pitchbend, lsb, msb); //send pitchbend meddelande
Delay(10);
}
MIDImessage (noteON, Obs, 0); //turn anmärkning av
fördröjning (500); //wait 200ms tills utlöser nästa anteckning
}
skicka MIDI-meddelande
void MIDImessage (int befalla, int data1, int data2) {
Serial.write (kommandot); //send kommandobyte
Serial.write (data1); //send databyte #1
Serial.write (data2); //send databyte #2
}
Nedan är en video demonstration av koden ovan. För denna del av koden, kommer att pitchbend vara mest märkbar på instrument med en lång sustain, till exempel ett stränginstrument, ha detta i åtanke när du testar koden själv.
Du kommer troligen att bli bra med endast 128 steg pitchbend resolution, men om du måste använda alla 16384 steg, se koden nedan. I grund och botten vad jag har gjort här definieras en variabel som kallas pitchbendVal, som varierar från 0 till 16383. Som jag sa under "noll" pitchbend värdet är msb = 64 och lsb = 0. I binär är detta:
MSB = 64 = 01000000
LSB = 0 = 0000000
(kom ihåg MSB och LSB är 7 bitars tal)
sätta dessa värden tillsammans får vi:
1000000 0000000
MSB LSB
eller
10000000000000
som översätter till 8192 i decimal
så nu är "noll" pitchbend värdet 8192.
Du märker också jag var tvungen att bryta de variabla pitchbendVal i två 7 bitars delar att skicka ut via MIDI-meddelande:
MIDImessage (pitchbend, (pitchbendVal & 127), (pitchbendVal >> 7));
den första delen, pitchbendVal & 127, returnerar de minst signifikanta 7 bitarna av pitchbendVal
den andra delen, pitchbendVal >> 7, returnerar de mest betydande 7 bitarna av pitchbendVal
se & och >> på Arduino referenssida för mer information.
< pre > / *
MIDI-Pitchbend (full upplösning)
Av Amanda Ghassaei
Juli 2012
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*/
int noteON = 144; //144 = 10010000 i binärt, notera på kommando
noteON lagring av data:
int Obs = 60; //middle c
int hastighet = 100; //velocity för MIDI-noter, måste vara mellan 0 och 127
(högre hastighet gör vanligtvis MIDI-instrument högre)
int pitchbend = 224; //224 = 11100000 i binär, pitchbend kommando
pitchbend datalagring:
int pitchbendVal = 8192; //value mellan 0 och 16383. noll pitchbend = 8192
void setup() {
Ställ in MIDI-baud-hastighet:
Serial.BEGIN(31250);
}
void loop() {
först spela Obs utan pitchbend
pitchbendVal = 8192; //reset pitchbend till "0" (noll pitchbend är pitchbendVal = 8192)
MIDImessage (pitchbend, (pitchbendVal & 127), (pitchbendVal >> 7)); //send pitchbend meddelande
MIDImessage (noteON, Obs, velocity); //turn anteckning på
fördröjning (700); //sustain anmärkning
MIDImessage (noteON, Obs, 0); //turn anmärkning av
fördröjning (500); //wait 500ms tills utlöser nästa anteckning
sedan spela med pitchbend
pitchbendVal = 8192; //reset pitchbend till "0" (noll pitchbend är pitchbendVal = 8192)
MIDImessage (pitchbend, (pitchbendVal & 127), (pitchbendVal >> 7)); //send pitchbend meddelande
MIDImessage (noteON, Obs, velocity); //turn anteckning på
för (pitchbendVal = 8192; pitchbendVal < 16384; pitchbendVal ++) {//increase pitchbend från 8192 till 16383
MIDImessage (pitchbend, (pitchbendVal & 127), (pitchbendVal >> 7)); //send pitchbend meddelande
Delay(1);
}
MIDImessage (noteON, Obs, 0); //turn anmärkning av
fördröjning (500); //wait 500ms tills utlöser nästa anteckning
sedan spela med pitchbend
pitchbendVal = 8192; //reset pitchbend till "0" (noll pitchbend är pitchbendVal = 8192)
MIDImessage (pitchbend, (pitchbendVal & 127), (pitchbendVal >> 7)); //send pitchbend meddelande
MIDImessage (noteON, Obs, velocity); //turn anteckning på
för (pitchbendVal = 8192; pitchbendVal > = 0, pitchbendVal--) {//decrease pitchbend 8192 till 0;
MIDImessage (pitchbend, (pitchbendVal & 127), (pitchbendVal >> 7)); //send pitchbend meddelande
Delay(1);
}
MIDImessage (noteON, Obs, 0); //turn anmärkning av
fördröjning (500); //wait 500ms tills utlöser nästa anteckning
}
skicka MIDI-meddelande
void MIDImessage (int befalla, int data1, int data2) {
Serial.write (kommandot); //send kommandobyte
Serial.write (data1); //send databyte #1
Serial.write (data2); //send databyte #2
}