Stap 27: Midi Out
Dit instrument is voornamelijk een MIDI-apparaat, dus moeten we bouwen een MIDI out. Er zijn twee manieren om dit te doen (en in de loop van dit project ik heb een en vervolgens overgeschakeld naar de andere):
MIDI-uitgang via een 5 pin DIN connector (zie fig 1)
MIDI uitgang via USB (dit is wat ik uiteindelijk afgerekend op)
Een van deze opties is prima, ik koos voor USB, omdat ik niet wil hoeft te dragen een speciale MIDI naar USB-kabel altijd. Als je hebt een heleboel synthesizers die ontvangen wordt een 5-pin MIDI input, het wellicht handiger voor u te gebruiken van de 5 Penaansluiting (het is ook een beetje makkelijker). Ik ga via beide processen hieronder:
5 pins aansluiting:
Een weerstand van 220 ohm aan pin 4 van de MIDI-aansluiting soldeer en verbinding met 5V van de Arduino. Soldeer een draad tussen MIDI pin 2 en grond. Soldeer een draad tussen MIDI pin 5 en digitale pin 1 (TX).
MIDI over USB:
MIDI over USB is een beetje lastig. Idealiter wij zou kunnen sturen MIDI uit de USB-poort al aangesloten op de Arduino, maar dit blijkt te zijn meer moeite dan het waard naar mijn mening. U kunt lezen een beetje over verschillende oplossingen hier. In plaats daarvan vond ik een echt grote tutorial waarin wordt uitgelegd hoe u een goedkope MIDI naar USB-kabeluit elkaar te halen, nieuwe verbindingen met het soldeer, en plooi het in het terrarium van uw project met uw Arduino, maken een secundaire MIDI-USB-uitgang. Het proces wordt uitgelegd echt goed op de blog van de Shiftmore, maar de MIDI naar USB-kabel ontving ik van amazon was een beetje anders, dus ik het proces weer hier beschrijven zal.
Verwijder de plastic behuizing van de MIDI naar USB-kabel en unsolder van de verbindingen met de kabels aan beide zijden (Fig. 8). De USB-verbindingen staan hier, maak de volgende aansluitingen:
5V tot +
DP tot D +
DM naar D-
VSS-
Zoals u in vijgen 9 en 10 zien kunt, gebruikte ik een pieced van première van bestuur om de verbinding met de USB-aansluiting maken. Aan de andere kant van de MIDI naar USB-bestuur, door de volgende verbinding met de Ardunio te maken:
IN-tot digitale Pin 1 (TX)
GND op grond van de Arduino
Testen het uit:
Laden van de firmware hieronder op de Arduino (ook in het bijgevoegde bestand), het zal het toetsenbord veranderen in een eenvoudige MIDI-apparaat: elk van de knoppen te drukken zal veroorzaken de knop aan het licht omhoog en leiden tot een MIDI-noot. Van de Arduino seriële verbinding verbreken en sluit de MIDI-uitgang naar een MIDI-instrument of uw computer om te horen van de MIDI-noten. U ziet ook het gele lampje van de MIDI IN op de MIDI naar USB bestuur inschakelen met elke noot. Meer info over het programmeren van de Arduino te sturen MIDI kan hier worden gevonden.
//basic midi test //by Amanda Ghassaei 2012 /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * */ //this firmware will cause the buttons to light up momentarily while they are pressed. //pin connections int ledLatchPin = 6; int ledClockPin = 5; int ledDataPin = 7; int buttonLatchPin = 4; int buttonClockPin = 3; int buttonDataPin = 2; //looping variables byte i; byte j; byte k; //storage for led states, 4 bytes byte ledData[] = {0, 0, 0, 0}; //storage for buttons, 4 bytes byte buttonCurrent[] = {0,0,0,0}; byte buttonLast[] = {0,0,0,0}; byte buttonEvent[] = {0,0,0,0}; byte buttonState[] = {0,0,0,0}; //button debounce counter- 16 bytes byte buttonDebounceCounter[4][4]; //MIDI variables int velocity = 100; int noteON = 144; int MIDIoffset = 60; void setup() { DDRD = 0xFA;//set pins D7-D4 as output, D2 as input Serial.begin(31250);//set midi baud rate } // buttonCheck - checks the state of a given button. //this buttoncheck function is largely copied from the monome 40h firmware by brian crabtree and joe lake void buttonCheck(byte row, byte index) { if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) && // if the current physical button state is different from the ((buttonCurrent[row] ^ buttonState[row]) & (1 << index))) { // last physical button state AND the current debounced state if (buttonCurrent[row] & (1 << index)) { // if the current physical button state is depressed buttonEvent[row] = 1 << index; // queue up a new button event immediately buttonState[row] |= (1 << index); // and set the debounced state to down. } else{ buttonDebounceCounter[row][index] = 12; } // otherwise the button was previously depressed and now // has been released so we set our debounce counter. } else if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) == 0 && // if the current physical button state is the same as (buttonCurrent[row] ^ buttonState[row]) & (1 << index)) { // the last physical button state but the current physical // button state is different from the current debounce // state... if (buttonDebounceCounter[row][index] > 0 && --buttonDebounceCounter[row][index] == 0) { // if the the debounce counter has // been decremented to 0 (meaning the // the button has been up for // kButtonUpDefaultDebounceCount // iterations/// buttonEvent[row] = 1 << index; // queue up a button state change event if (buttonCurrent[row] & (1 << index)){ // and toggle the buttons debounce state. buttonState[row] |= (1 << index); } else{ buttonState[row] &= ~(1 << index); } } } } void shift(){ for (i=0;i<4;i++){ buttonLast[i] = buttonCurrent[i]; byte dataToSend = (1 << (i+4)) | (15 & ~ledData[i]); // set latch pin low so the LEDs don't change while sending in bits digitalWrite(ledLatchPin, LOW); // shift out the bits of dataToSend shiftOut(ledDataPin, ledClockPin, LSBFIRST, dataToSend); //set latch pin high so the LEDs will receive new data digitalWrite(ledLatchPin, HIGH); //once one row has been set high, receive data from buttons //set latch pin high digitalWrite(buttonLatchPin, HIGH); //shift in data buttonCurrent[i] = shiftIn(buttonDataPin, buttonClockPin, LSBFIRST) >> 3; //latchpin low digitalWrite(buttonLatchPin, LOW); for (k=0;k<4;k++){ buttonCheck(i,k); } } } void updateLEDs(){ //update the leds to reflect hte state of the buttons for (j=0;j<4;j++){ ledData[j] = buttonState[j]; } } void MIDImessage(int command, int MIDInote, int MIDIvelocity) {//send s a MIDI message Serial.write(command);//send note on or note off command Serial.write(MIDInote);//send pitch data Serial.write(MIDIvelocity);//send velocity data } void sendMIDI(){ for (byte a=0;a<4;a++){ for (byte b=0;b<4;b++){ if (buttonEvent[a]&(1<<b)){ buttonEvent[a]&=~(1<<b);//zero button event if (buttonState[a]&(1<<b)){ MIDImessage(noteON,(MIDIoffset+a*5+b),100); } else{ MIDImessage(noteON,(MIDIoffset+a*5+b),0); } } } } } void loop() { shift(); updateLEDs(); sendMIDI(); }