Arduino, sensorer och MIDI- (5 / 16 steg)
Steg 5: Utlösa en MIDI-not med en knapp
Med hjälp av enkel knapp debounce kod från första klass (du kan också använda denna debounce kod som använder millis() för att hålla tid), tråd upp en knapp till digital stift 7 och använda den för att utlösa en MIDI-not:
byte noteON = 144; //note på kommando
int buttonPin = 7.
booleska currentState = låg, //stroage för aktuella knappläge
booleska lastState = låg, //storage för sista knappen stat
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
Serial.BEGIN (9600); //initialize seriell anslutning
}
void loop() {
currentState = digitalRead(buttonPin);
om (currentState == hög & & lastState == låg) {//if-knappen bara har tryckt
MIDImessage (noteON, 60, 127); //turn not 60 på med 127 hastighet
fördröjning (2), //crude form av knappen debouncing
} else om (currentState == låg & & lastState == hög) {
MIDImessage (noteON, 60, 0); //turn not 60 off
fördröjning (2), //crude form av knappen debouncing
}
lastState = currentState;
}
skicka MIDI-meddelande
void MIDImessage (byte kommando, byte data1, byte data2) {
Serial.write(Command);
Serial.write(Data1);
Serial.write(data2);
}
Varje gång knappen trycks vi skicka en anteckning på meddelande i denna skiss, och varje gång knappen släpps, vi skicka en anteckning av meddelande. Nu prova att lägga i potentiometern (ansluten till A0) för att styra tonhöjden för anteckningen:
byte noteON = 144; //note på kommando
byte Obs; //storage för spelar Obs
int buttonPin = 7.
int potPin = A0;
booleska currentState = låg, //stroage för aktuella knappläge
booleska lastState = låg, //storage för sista knappen stat
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
Serial.BEGIN (9600); //initialize seriell anslutning
}
void loop() {
currentState = digitalRead(buttonPin);
om (currentState == hög & & lastState == låg) {//if-knappen bara har tryckt
int currentPotVal = analogRead(potPin);
Obs = karta (currentPotVal, 0, 1023, 0, 127);
MIDImessage (noteON, Obs, 127); //turn anteckning på med 127 hastighet
fördröjning (2), //crude form av knappen debouncing
} else om (currentState == låg & & lastState == hög) {
MIDImessage (noteON, Obs, 0); //turn anmärkning av
fördröjning (2), //crude form av knappen debouncing
}
lastState = currentState;
}
skicka MIDI-meddelande
void MIDImessage (byte kommando, byte data1, byte data2) {
Serial.write(Command);
Serial.write(Data1);
Serial.write(data2);
}
Nu kan vi lägga till några fler anteckningar i mixen, spelar denna skiss en tre Obs fras på varje knapptryckning. Du kan ändra basnot med potentiometern:
byte noteON = 144; //note på kommando
byte Obs; //storage för spelar Obs
int buttonPin = 7.
int potPin = A0;
booleska currentState = låg, //stroage för aktuella knappläge
booleska lastState = låg, //storage för sista knappen stat
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
Serial.BEGIN (9600); //initialize seriell anslutning
}
void loop() {
currentState = digitalRead(buttonPin);
om (currentState == hög & & lastState == låg) {//if-knappen bara har tryckt
int currentPotVal = analogRead(potPin);
Obs = karta (currentPotVal, 0, 1023, 0, 127);
int noteLength = 200.
byte noteVelocity = 127;
MIDImessage (noteON, Obs, noteVelocity); //base anmärkning
Delay(noteLength);
MIDImessage (noteON, Obs, 0); //turn anmärkning av
MIDImessage (noteON, notera + 7, noteVelocity), //fifth
Delay(noteLength);
MIDImessage (noteON, Obs + 7, 0); //turn anmärkning av
MIDImessage (noteON, notera + 12, noteVelocity), //octave
Delay(noteLength);
MIDImessage (noteON, Obs + 12, 0);
}
lastState = currentState;
}
skicka MIDI-meddelande
void MIDImessage (byte kommando, byte data1, byte data2) {
Serial.write(Command);
Serial.write(Data1);
Serial.write(data2);
}
Slutligen kan vi använda en medan slinga för att fortsätta arpeggio som vi trycker på knappen. Medan loopar är i princip loopable om uttalanden. Om argumentet inuti while loop är parenteser utvärderas till sant, då kommandoexekveringar inuti while loopen. Vid slutet av while loop, Arduino kontroller för att se om argumentet inuti while loopars parenteser är sant igen. Om det stämmer fortfarande, while loop körs alla kommandon i de culy tandställning igen, detta fortsätter för evigt till argumentet inuti while loopens parenteser beräknas till falskt. I exemplet nedan använder jag while loop att fortsätta spela tre Obs frasen så länge som digitalRead(buttonPin) == hög.
byte noteON = 144; //note på kommando
byte Obs; //storage för spelar Obs
int buttonPin = 7.
int potPin = A0;
booleska currentState = låg, //stroage för aktuella knappläge
booleska lastState = låg, //storage för sista knappen stat
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
Serial.BEGIN (9600); //initialize seriell anslutning
}
void loop() {
currentState = digitalRead(buttonPin);
om (currentState == hög & & lastState == låg) {//if-knappen bara har tryckt
int currentPotVal = analogRead(potPin);
Obs = karta (currentPotVal, 0, 1023, 0, 127);
int noteLength = 200.
byte noteVelocity = 127;
While(digitalRead(buttonPin) == hög) {//as långa knappen trycks, upprepa arpeggio
MIDImessage (noteON, Obs, noteVelocity); //base anmärkning
Delay(noteLength);
MIDImessage (noteON, Obs, 0); //turn anmärkning av
MIDImessage (noteON, notera + 7, noteVelocity), //fifth
Delay(noteLength);
MIDImessage (noteON, Obs + 7, 0); //turn anmärkning av
MIDImessage (noteON, notera + 12, noteVelocity), //octave
Delay(noteLength);
MIDImessage (noteON, Obs + 12, 0);
}
}
lastState = currentState;
}
skicka MIDI-meddelande
void MIDImessage (byte kommando, byte data1, byte data2) {
Serial.write(Command);
Serial.write(Data1);
Serial.write(data2);
}