Stap 3: Uitvoering van MIDI
Codering
De ins en outs van MIDI zijn zeer goed gedocumenteerd elders, maar voor dit project zijn we eigenlijk alleen bezig met drie van hen: "opdracht-kanaal", "opmerking nummer" en "snelheid".
Opdrachtkanaal zijn hard gecodeerd naar de twee commando's die we nodig hebben, "note op kanaal 1" en "note off, kanaal 1". In de code wordt dit weergegeven als:
int noteON = 144; (Let op kanaal 1)
en int noteOFF = 128; (Let op uit kanaal 1)
"Noteer het nummer" vereist een kleine hoeveelheid van de berekening. In seriële modus de 64 knop Shield stuurt seriële data voor knooppersen of releases, van 1 tot en met 64 voor release en van 129 192 voor pers. MIDI begint bij nul, zodat de opmerking op voor de onderkant te drukken (ervan uitgaande dat je begint aan de onderkant van de schaal) moet worden verlaagd door 129. Opmerking af moet verlaagd door 1. Als dit te laag is (MIDI opmerking "nul" is echt laag), het toevoegen van 12 naar deze nummers zal omhoog brengen de toonhoogte een octaaf.
Snelheid is hard gecodeerd tot 100, aangezien wij met schakelaar sluitingen geen aanslaggevoeligheid te selecteren behandelen. Als u het harder of zachter wilt, kan deze variabele variëren van 0-127.
Hier is de volledige code, met veel dank aan Josh Boughey
/ ** MIDIstomp Read inkomende seriële stroom om knop input, en reageren met MIDI-uitgang ** geschreven door Tim Halle & Josh Boughey, April 2015 ** /
#include
vluchtige uint8_t knop = 0; knop instellen
int snelheid = 100; snelheid van MIDI-noten, moet liggen tussen 0 en 127
int noteON = 144; 144 = 10010000 in binary, opmerking op kanaal 1command
int noteOFF = 128; 128 = 10000000 in binary, Opmerking u kanaal 1 opdracht uit
int NoteNumber = 0;
software seriële
SoftwareSerial midiSerial (2, 3); digitale pinnen die we voor zachte seriële RX en TX gebruiken zullen
void setup / / Set knop en MIDI baud-rate:
{
Serial.begin(57600);
midiSerial.begin(31250);
}
void loop
{/ / begin van de hoofdlus
Als (Serial.available() > 0) / / controleren als seriële data is ontvangen, zo niet alleen lus starten
{
Knop = Serial.read(); welke knop werd ingedrukt?
if(button > 128) / / Dit vertelt ons dat er een notitie op
{
NoteNumber=(Button-129); MIDI opmerking waarde instellen
MidiOn(); een MIDI-noot speelt.
}
anders
{/ / Anders een opmerking is uitgeschakeld
NoteNumber=(Button-1); MIDI opmerking waarde instellen
MidiOff(); Schakelt een MIDI opmerking.
} / / anders einde
}
} / / Einde van de hoofdlus
VOID MidiOn()
{
midiSerial.write(noteON); Opmerking op kanaal 1
midiSerial.write(NoteNumber); Welke opmerking moet knop =
midiSerial.write(velocity); Snelheid ingesteld op 100
Serial.Print ("Let op"); Afdrukken waarde op seriële monitor
Serial.println("");
Serial.Print(noteON);
Serial.println("");
Serial.Print(NoteNumber);
Serial.println("");
Serial.Print(Velocity);
Serial.println("");
Serial.println("");
}
VOID MidiOff()
{
midiSerial.write(noteOFF); Opmerking uit kanaal 1
midiSerial.write(NoteNumber); Welke opmerking moet knop =
midiSerial.write(velocity); Snelheid ingesteld op 100
Serial.Print ("Let OFF"); Afdrukken waarde op seriële monitor
Serial.println("");
Serial.Print(noteOFF);
Serial.println("");
Serial.Print(NoteNumber);
Serial.println("");
Serial.Print(Velocity);
Serial.println("");
Serial.println("");
}