Lätt MIDI bas pedaler (3 / 5 steg)
Steg 3: Genomföra MIDI
Kodning
Konster och knep för MIDI är mycket väl dokumenterade på annat håll, men för detta projekt är vi verkligen bara handlar om tre av dem: "kommando-kanal", "not nummer" och "velocity".
Kommando-kanal är hård kodad till de två kommandon som vi behöver, "anteckning på kanal 1" och "note off, kanal 1". I koden visas detta som:
int noteON = 144; (Observera på kanal 1)
och int noteOFF = 128; (Observera av kanal 1)
"Notera nummer" kräver en liten mängd beräkning. I seriell läge 64 knappen sköld sänder seriella data för knapptryckningar eller utgåvor, från 1 till 64 för övergång och från 129 till 192 för press. MIDI börjar på noll så Observera på för att trycka på knappen längst ner (förutsatt att din start längst ner på skalan) skall minskas av 129. Observera off skall minska med 1. Om detta är för låg (MIDI OBS "noll" är riktigt lågt), att dessa nummer 12 kommer att ta upp planen en oktav.
Hastighet är svårt-kodad till 100, som vi behandlar med switch nedläggningar ingen anslagskänslighet. Om du vill höja eller sänka filmljudet, kan denna variabel variera från 0-127.
Här är hela koden, med stort tack Josh Boughey
/ ** MIDIstomp Read inkommande seriell ström att få knappen input och svara med MIDI-utgång ** skriven av Tim Halle & Josh Boughey, April 2015 ** /
#include
flyktiga uint8_t knappen = 0; knappen Ställ in
int hastighet = 100; hastigheten på MIDI-noter, måste vara mellan 0 och 127
int noteON = 144; 144 = 10010000 i binärt, notera på kanal 1command
int noteOFF = 128; 128 = 10000000 i binärt, Anm av kanal 1 kommando
int NoteNumber = 0;
mjukvaran följetong
SoftwareSerial midiSerial (2, 3); Digital stift som vi använder för mjuk seriell RX och TX
void setup() / / Set knappen och MIDI baud-hastighet:
{
Serial.BEGIN(57600);
midiSerial.begin(31250);
}
void loop()
{/ / början av huvudloop
om (Serial.available() > 0) / / kolla om seriella data tas emot, om inte bara loopa igen
{
Knappen = Serial.read(); vilken knapp trycktes?
IF(Button > 128) / / Detta berättar att det är en anmärkning
{
NoteNumber=(Button-129); ställa in MIDI-not värde
MidiOn(); spelar en MIDI-not.
}
annat
{/ / Annars är det en anteckning
NoteNumber=(Button-1); ställa in MIDI-not värde
MidiOff(); Stänger av en MIDI Observera.
} / / end annars
}
} / / End av huvudloop
void MidiOn()
{
midiSerial.write(noteON); Notera på kanal 1
midiSerial.write(NoteNumber); Som anmärkning ska = knappen
midiSerial.write(velocity); Hastigheten anges till 100
Serial.Print ("anteckning på"); Skriver ut värdet till seriell 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); Notera av kanal 1
midiSerial.write(NoteNumber); Som anmärkning ska = knappen
midiSerial.write(velocity); Hastigheten anges till 100
Serial.Print ("NOTE OFF"); Skriver ut värdet till seriell monitor
Serial.println("");
Serial.Print(noteOFF);
Serial.println("");
Serial.Print(NoteNumber);
Serial.println("");
Serial.Print(Velocity);
Serial.println("");
Serial.println("");
}