MIDI-Light Show (6 / 7 steg)
Steg 6: Kodning begrepp
Detta är MIDI-kommandon för att interagera med arduino
byte midi_on = 0x90;
byte midi_off = 0x80;
/ * Dessa globala variabler används specifikt med
funktionen check_midi() som beskrivs senare i programmet * /
byte location_byte;
byte in_note;
byte in_volume;
Först ange vi en konstant variabel för meddelandet midi_on och midi_off meddelandet så att vi snabbt kan hänvisa till dem i koden. Därefter skapar vi 3 byte variabler för input av MIDI-funktioner som du märkt tidigare.
Nästa är MIDI-funktionerna igen:
Här är funktionen internet för att skriva ut på planen
void midi_send (byte cmd, byte Obs, byte volym)
{
digitalWrite(3,LOW);
Serial.write(CMD);
Serial.write(Note);
Serial.write(Volume);
}
läser den seriella porten för att se om det finns någon inkommande information
Boolean check_midi()
{
medan (Serial.available() > = 3) //when tre byte tillgängligt
{
om (Serial.available())
{
digitalWrite(3,HIGH);
location_byte = Serial.read (); //read första byten
in_note = Serial.read (); //read nästa byte
in_volume = Serial.read (); //read sista byte
return true;
}
}
}
Här är funktioner som vi nämnde tidigare. De kopieras bara för Kontinuitets skull. Att flytta...
Arduino specifika setup
Ogiltiga inställningar)
{
Serial.BEGIN(31250);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode (5, OUTPUT);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite (5, låg).
}
Detta är en mycket viktig del av Arduino. Detta ställer baudhastighet, eller den hastighet vid vilken Arduino läser de bitar som sänds till den kurs som MIDI-system kräver. Nästa anger det stift 3, 4 och 5 till utgångsstift. Det skriver slutligen utgångsstift off eller låg.
void light_on()
{
int switch_note = in_note % 12.
Switch(switch_note)
{
C
fall 0:
digitalWrite(3,HIGH);
bryta;
D
fall 2:
digitalWrite(4,HIGH);
bryta;
E
fall 4:
digitalWrite 5, hög,
bryta;
F
fall 5:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
bryta;
G
fall 7:
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
bryta;
A
mål 9:
digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
bryta;
B
mål 11:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
bryta;
}
}
snabb samtal för att stänga av alla lampor
void light_off()
{
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
}
Den första funktionen är verkligen kött i koden, medan andra är helt enkelt en Snabbreferens uppmaning att stänga av alla lampor på en gång. Den första funktionen läser indata från variabeln in_note, delar det med 12 (eftersom det finns 12 toner i musik). Baserat på vad observera det, visar det på lämplig färg genom att skriva stiften till hög. Nu för sista kulmen på alla dessa:
den viktigaste loopen
void loop()
{
kontrollerar om det finns en midi att använda, sedan skickar den ut (ekon ekon ekon ekon)
IF(check_midi()) midi_send(location_byte,in_note,in_volume);
om (location_byte == midi_on & & in_volume! = 0)
{light_on();}
annat light_off();
}
Här är det viktigaste kretsar av funktionen. Det kontrollerar först, om det i MIDI-ingång kommer och om det är, skickar det genom funktionen midi_send. Eftersom check_midi() fyller de globala variablerna, kontrollera vi om det finns ett midi_on samtal och att volymen av inkommande anteckningen är inte 0. Om dessa villkor är uppfyllda, det går genom funktionen light_on() och sätter på lamporna. Annars släcks det lamporna som standard. Och det är det!