Stap 16: Arduino MIDI IN
U kunt ten slotte verzenden van MIDI in de Arduino en gebruiken om te controleren dingen verbonden met de uitgangen van de Arduino. Hier is een robotachtige drumstel, gemaakt door mijn collega, de randofo.
Ook een gehackte gitaar held dat vlammen schiet:
Hier is een eenvoudig voorbeeld van hoe u een inkomende MIDI kunt parseren message met Arduino en de informatie gebruiken om te controleren de birghtness van een LED. In mijn voorbeeld zet ik op een LED als opmerking 60 (midden c) wordt geactiveerd, en ik zal de helderheid van de LED volgens de snelheid van de binnenkomende notitie schaal:
byte noteOn = 144; int ledPin = 9; byte noteToCheck = 60; //light up led at pin 13 when receiving noteON message with note = 60 void setup(){ Serial.begin(9600); pinMode(ledPin,OUTPUT); } void loop(){ checkForNote(); delay(10); } void checkForNote(){ while (Serial.available()){//while there is serial data availble byte incomingByte = Serial.read();//read first byte if (incomingByte>127){//if a command byte if (incomingByte == noteOn){//if note on message byte noteByte = Serial.read();//read next byte byte velocityByte = Serial.read();//read final byte if (noteByte == noteToCheck && velocityByte > 0){//note on int brightness = map(velocityByte, 0, 127, 0, 255);//map velocity to a number between 0 and 255 analogWrite(ledPin,brightness);//turn on led w brightness relative to velocity } if (noteByte == noteToCheck && velocityByte == 0){//note off digitalWrite(ledPin,LOW);//turn off led } } } } }
Er zijn een paar nieuwe commando's hier gebruikt:
Serial.available() geeft het aantal bytes dat beschikbaar is voor het lezen van de seriële poort van de Arduino.
Serial.Read() is het tegenovergestelde van Serial.print(), wordt de volgende beschikbare byte van de gegevens van de seriële poort van de Arduino.
In deze code, leest de Arduino beschikbaar de eerste byte en controles om te zien of het een byte van de opdracht (Onthoud, opdracht bytes zijn altijd > 127)
Als (incomingByte > 127)
Vervolgens, omdat we alleen op zoek bent naar opmerking op opdrachten, de Arduino gecontroleerd om te zien als de opdracht is een opdracht, opmerking op:
Als (incomingByte == noteOn)
Vervolgens de Arduino leest in de volgende twee bytes en slaat ze op als noteByte en velocityByte:
byte noteByte = Serial.read();
byte velocityByte = Serial.read();
De Arduino controleert om te zien of de opmerking die we hebben is de opmerking dat we geïnteresseerd in, en als de snelheid groter is dan 0 (notitie op of notitie af). Als het brandt opmerking, de Arduino gebruikt map() om te schalen van de snelheid (0-127) naar een helderheid tussen 0 en 255, en stuurt deze helderheid naar analogWrite(). Als er een bericht opmerking af, schakelt de Arduino de LED.
De een stiekeme ding dat ik heb toegevoegd aan deze code is de delay(10) in de loop. Ik vond dat de Arduino kon lezen in de MIDI-berichten meer betrouwbaar met deze vertraging in daar. U kan ook prutsen met de baud-rate om ervoor te zorgen dat je nooit een MIDI-bericht missen.