Black Box MIDI-Controller (10 / 14 steg)
Steg 10: Ladda upp en skiss till Arduino
Enheten är fysiskt klar, allt som återstår är att ladda koden på it.below är en kopia av koden, från början till slut, som jag använt när jag byggde min svarta låda. Arduino skiss ingår också som bilaga.
< p > #define rowOne 0 / / definierar midi Obs spelas av den första raden. < br > #define rowTwo 1 / / definierar midi Obs spelas av den andra raden.
#define rowThree 2 / / definierar midi Obs spelas av den tredje raden.
#define rowFour 3 / / definierar midi Obs spelas av den fjärde raden.
#define columnOne 2 / / definierar pin ansluten till den första kolumnen.
#define columnTwo 3 / / definierar pin ansluten till den första kolumnen.
#define columnThree 4 / / definierar pin ansluten till den första kolumnen.
#define columnFour 5 / / definierar pin ansluten till den första kolumnen.
int fördröjningstid; Har antalet millisekunder som programmet ska vänta mellan kolumner. < /p >< p > byte noteOne;
byte noteTwo;
byte noteThree;
byte noteFour; < /p >< p > / / anger pin lägen för alla ingångar och utgångar med arduino < /p >< p > void setup() {
pinMode (7, ingång);
pinMode (8, ingående);
pinMode (9, ingång);
pinMode (10, ingång);
pinMode (11, ingång);
pinMode (12, ingång);
digitalWrite 12, hög.
pinMode (columnOne, produktionen);
pinMode (columnTwo, produktionen);
pinMode (columnThree, produktionen);
pinMode (columnFour, produktionen);
} < /p >< p > void loop() {
setDelay();
flashColumn(columnOne);
flashColumn(columnTwo);
flashColumn(columnThree);
flashColumn(columnFour);
IF(digitalRead(12) == 0) {
playTimingNotes();
} annat {
playNormalNotes();
Delay(delayTime);
}
noteOne = 0;
noteTwo = 0;
noteThree = 0;
noteFour = 0;
} < /p >< p > / / första parametern är händelsetypen (0x09 = Obs, 0x08 = Obs av).
Andra parametern är Obs-/ Obs-på, i kombination med kanalen.
Kanalen kan vara allt mellan 0-15. Normalt rapporteras till användaren som 1-16.
Tredje parametern är antalet Obs (48 = mitten C).
Fjärde parametern är hastigheten (64 = normal, 127 = snabbast). < /p >< p > void noteOn (byte kanal, byte pitch, byte velocity) {
MIDIEvent noteOn = {0x09, 0x90 | kanal, pitch, velocity};
MIDIUSB.write(noteOn);
} < /p >< p > void noteOff (byte kanal, byte pitch, byte velocity) {
MIDIEvent noteOff = {0x08, 0x80 | kanal, pitch, velocity};
MIDIUSB.write(noteOff);
} < /p >< p > / / kombinerar anteckning på och notera av information till en metod < /p >< p > void playNote (byte kanal, byte pitch, byte velocity) {
noteOn (kanal, pitch, velocity);
MIDIUSB.flush();
noteOff (kanal, pitch, velocity);
MIDIUSB.flush();
} < /p >< p > / / driver en kolumn i matrisen, då läser ut som växlar är stängda
sedan anger kolumnen tillbaka ner till låga < /p >< p > void flashColumn (byte kolumn) {
digitalWrite (kolumn, hög).
readColumn(column);
digitalWrite (kolumn, låg).
} < /p >< p > / / läser varje rad, då spelar de respektive anteckningarna om växlarna är stängda < /p >< p > void readColumn (int kolumn) {
int noteNumber = 100;
IF(digitalRead(8) == 1) {
noteNumber = rowOne + (kolumn-1) * 12;
} annat if(digitalRead(9) == 1) {
noteNumber = rowTwo + (kolumn-1) * 12;
} annat if(digitalRead(10) == 1) {
noteNumber = rowThree + (kolumn-1) * 12;
} annat if(digitalRead(11) == 1) {
noteNumber = rowFour + (kolumn-1) * 12;
}
IF(Column == 2) {
noteOne = noteNumber;
} annat if(column == 3) {
noteTwo = noteNumber;
} annat if(column == 4) {
noteThree = noteNumber;
} annat if(column == 5) {
noteFour = noteNumber;
}
} < /p >< p > void playTimingNotes() {
för (int jag = 0; jag < 4; i ++) {
playNote (0, 100, 64);
Delay(delayTime/32);
}
} < /p >< p > void playNormalNotes() {
om (noteOne! = 0) {
playNote (0, noteOne, 64);
}
om (noteTwo! = 0) {
playNote (0, noteTwo, 64);
}
om (noteThree! = 0) {
playNote (0, noteThree, 64);
}
om (noteFour! = 0) {
playNote (0, noteFour, 64);
}
} < /p >< p > void setDelay() {
Fördröjningstid = ((analogRead (A0) / 2) + 300) * 32;
} < /p >