Skicka och ta emot MIDI med Arduino (10 / 11 steg)
Steg 10: Ta emot MIDI-meddelanden med Arduino
De flesta Arduino MIDI projekt skicka MIDI-meddelanden ut, men du kan också använda Arduino ta emot MIDI-data. Här är några idéer:
en Arduino synthesizer som använder MIDI-meddelanden för att konstruera ljudvågor
en enhet som använder MIDI för att utlösa mekaniska händelser, liksom ringmärkning av olika storlek klockor
en MIDI att styra voltage(CV) enhet-kommunikation mellan MIDI och analoga synthesizers
Reservdelslista:
MIDI-connector Digikey CP-2350-ND
220 Ohm 1/4 watt resistor Digikey CF14JT220RCT-ND
1N4148 diod Digikey1N4148-TAPCT-ND
10kOhm 1/4 watt resistor Digikey CF14JT10K0CT-ND
470 Ohm 1/4 watt resistor Digikey CF14JT470RCT-ND (jag använde 2 x 220 istället)
6N138 optocoupler Digikey 751-1263-5-ND
Andra delar
(1 x) Arduino Uno Amazon
(1 x) USB-kabel Amazon
(1 x) bakbord (detta kommer med bygel sladdar) Amazon
(1 x) hoppare ledningar Amazon
(1 x) MIDI till USB-kabel Amazon
Installationen av maskinvara är något mer komplicerat för att ta emot MIDI än det är för att skicka. Som ni kan se i schematiskt ovan, måste du ställa in en optoisolator mellan uttaget MIDI och Arduino. Om du är förvirrad om MIDI-pin-anslutningar, se fig 1. Jag satt denna krets upp på en skärbräda i figurerna 4 och 5.
Följande kod tar emot dessa meddelanden, läser dem och lagrar dem på lämpligt sätt. Se kommentarer för mer information.
< pre > / * ta emot Midi
Av Amanda Ghassaei
Juli 2012
< en href = " >
* 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.
*/
byte commandByte;
byte noteByte;
byte velocityByte;
void setup() {
Serial.BEGIN(31250);
}
void checkMIDI() {
göra {
om (Serial.available()) {
commandByte = Serial.read (); //read första byten
noteByte = Serial.read (); //read nästa byte
velocityByte = Serial.read (); //read sista byte
}
}
medan (Serial.available() > 2); //when minst tre byte tillgängliga
}
void loop() {
checkMIDI();
}
Se till att allt fungerar, prova koden nedan. Denna kod aktiverar lysdioderna på stift 13 kort när den tar emot en anteckning på meddelande för MIDI-not 60 (mitten C). Märker hur jag med "& & velocityByte > 0" i om uttalande-ser du till att vi har att göra med en anteckning på uttalande, om du inte inkluderar detta ljuset kommer att blinka vid båda Obs på och observera på med hastighet = 0 (Observera off) meddelanden.
< pre > / * ta emot MIDI och kontrollera om Obs = 60
Av Amanda Ghassaei
Juli 2012
< en href = " >
* 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.
*/
byte commandByte;
byte noteByte;
byte velocityByte;
byte noteOn = 144;
ljus upp ledde på stift 13 när mottagande noteON meddelande med anmärkning = 60
void setup() {
Serial.BEGIN(31250);
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
}
void checkMIDI() {
göra {
om (Serial.available()) {
commandByte = Serial.read (); //read första byten
noteByte = Serial.read (); //read nästa byte
velocityByte = Serial.read (); //read sista byte
om (commandByte == noteOn) {//if anteckning på meddelande
Kontrollera om Obs == 60 och hastighet > 0
om (noteByte == 60 & & velocityByte > 0) {
digitalWrite (13, hög), //turn på ledde
}
}
}
}
medan (Serial.available() > 2); //when minst tre byte tillgängliga
}
void loop() {
checkMIDI();
Delay(100);
digitalWrite (13, låg); //turn ledde bort
}
Om du vill göra en massa saker i den viktigaste loopen, eller om du förväntar dig att få en massa MIDI-data och timing är viktigt för dig, du kan också prova med en timer avbryta regelbundet pausa huvudloop och kontrollera om det finns inkommande MIDI. Det kommer att se ut ungefär så här:
< pre > / * ta emot Midi med avbrott
Av Amanda Ghassaei
Juli 2012
< en href = " >
* 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.
*/
byte commandByte;
byte noteByte;
byte velocityByte;
void setup() {
Serial.BEGIN(31250);
(CLI); //stop avbrott
Ange timer2 avbryta varje 128us
TCCR2A = 0; / / Ställ in hela TCCR2A register till 0
TCCR2B = 0; / / samma för TCCR2B
TCNT2 = 0; //initialize värde till 0
Set jämför match registrera för 7,8 khz steg
OCR2A = 255; / / = (16 * 10 ^ 6) / (7812.5 * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR2A | = (1 << WGM21);
Ange CS11 bit för 8 prescaler
TCCR2B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK2 | = (1 << OCIE2A);
SEI (); //allow avbrott
}
ISR(TIMER2_COMPA_vect) {//checks för inkommande midi varje 128us
göra {
om (Serial.available()) {
commandByte = Serial.read (); //read första byten
noteByte = Serial.read (); //read nästa byte
velocityByte = Serial.read (); //read sista byte
}
}
medan (Serial.available() > 2); //when minst tre byte tillgängliga
}
void loop() {
göra vad här
}