Sockerbit MIDI Controller (27 / 38 steg)
Steg 27: Midi ut
Detta instrument är främst en MIDI-enhet, så vi måste bygga en MIDI ut. Det finns två sätt att göra detta (och under loppet av detta projekt jag gjorde en och sedan bytte till en annan):
MIDI-utgång via en 5 pin mini-din-kontakt (se fig 1)
output MIDI via USB (detta är vad jag så småningom bosatte sig på)
Något av dessa alternativ är bra, jag valde USB eftersom jag inte vill bära en speciell MIDI till USB-kabel hela tiden. Om du har en massa syntar som får en 5 pin MIDI-ingång, det kan vara mer bekvämt för dig att använda 5 pin jack (det är också lite lättare). Jag ska gå igenom båda processerna nedan:
5 pin anslutning:
Löda en 220 ohm resistor till stift 4 uttaget MIDI och ansluta till Arduino 5V. Löda en tråd mellan MIDI stift 2 och marken. Löda en tråd mellan MIDI stift 5 och digital stift 1 (TX).
MIDI via USB:
MIDI via USB är lite knepigt. Helst skulle man kunna skicka MIDI ut USB-porten redan ansluten till Arduino, men detta visar sig vara mer problem än det är värt i min mening. Du kan läsa lite om olika lösningar här. Istället hittade jag en riktigt bra tutorial som förklarar hur du kan ta isär en billigt MIDI till USB-kabel, löda nya anslutningar till det och tuck den inuti din projektet låda med din Arduino att skapa en sekundär MIDI-USB-utgång. Processen förklaras riktigt bra på Shiftmore blogg, men MIDI till USB-kabel jag fått från amazon var lite annorlunda, så jag ska beskriva processen igen här.
Ta bort plast höljet från MIDI till USB-kabel och unsolder anslutningarna till kablarna på vardera ändan (Fig. 8). USB-anslutningar visas här, gör följande anslutningar:
5V till +
DP till D +
DM till D-
VSS-
Som ni kan se i figurerna 9 och 10, använde jag en pusslas av perf ombord för att göra anslutningar till USB-uttaget. På andra sidan av MIDI till USB-styrelsen, göra följande anslutningar för Ardunio:
IN-till Digital stift 1 (TX)
GND Arduino marken
Testa den:
Ladda firmware nedan på Arduino (även i bifogad fil), det blir tangentbordet till en enkel MIDI-enhet: Tryck på varje knapp kommer att orsaka knappen till ljus upp och utlösa en MIDI-not. Koppla bort den Arduino seriell anslutning och ansluta MIDI-utgången till datorn lyssna på MIDI-noter eller ett MIDI-instrument. Du borde också se den gula MIDI IN lampan på MIDI till USB-styrelsen slår på med varje not. Mer information om att programmera Arduino att skicka MIDI kan hittas här.
grundläggande MIDI-test
Amanda Ghassaei 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 2 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
denna firmware kommer att orsaka knapparna till ljus upp tillfälligt medan de trycks.
PIN-anslutningar
int ledLatchPin = 6;
int ledClockPin = 5;
int ledDataPin = 7.
int buttonLatchPin = 4;
int buttonClockPin = 3;
int buttonDataPin = 2;
looping variabler
byte i.
byte j;
byte k;
lagring för ledde staterna, 4 byte
byte ledData [] = {0, 0, 0, 0};
lagring för knappar, 4 byte
byte buttonCurrent [] = {0,0,0,0}.
byte buttonLast [] = {0,0,0,0}.
byte buttonEvent [] = {0,0,0,0}.
byte buttonState [] = {0,0,0,0}.
knappen Dämpningstid counter - 16 byte
byte buttonDebounceCounter [4] [4].
MIDI-variabler
int hastighet = 100;
int noteON = 144;
int MIDIoffset = 60.
void setup() {
DDRD = 0xFA; //set stift D7-D4 som D2 som indata-utdata
Serial.BEGIN (31250); //set midi baudhastighet
}
buttonCheck - kontrollerar status för en viss knapp.
denna buttoncheck funktion är i stort sett kopierade från monome 40h firmware brian crabtree och joe sjö
void buttonCheck (byte rad, byte index)
{
om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) & & / / om det aktuella fysiska knapp läget skiljer sig från den
((buttonCurrent [rad] ^ buttonState[row]) & (1 << index))) {/ / last fysisk knapp staten och nuvarande debounced staten
om (buttonCurrent [rad] & (1 << index)) {/ / om nuläget fysisk knapp trycks
buttonEvent [rad] = 1 << index; köa upp en ny knapp händelse omedelbart
buttonState [rad] | = (1 << index); och ställa in debounced ner.
}
annat {
buttonDebounceCounter [rad] [index] = 12.
} / / annars knappen tidigare var deprimerad och nu
har släppts så vi våra debounce counter.
}
annars om (((buttonCurrent [rad] ^ buttonLast[row]) & (1 << index)) == 0 & & / / om det aktuella fysiska knapp läget är samma som
(buttonCurrent [rad] ^ buttonState[row]) & (1 << index)) {/ / den senaste fysiskt knappen stat men den nuvarande fysiskt
knappläge skiljer sig från den nuvarande debounce
statliga...
om (buttonDebounceCounter [rad] [index] > 0 & &--buttonDebounceCounter [rad] [index] == 0) {/ / om den räknaren debounce har
varit minskas till 0 (menande den
knappen har varit upp i
kButtonUpDefaultDebounceCount
iterationer / / /
buttonEvent [rad] = 1 << index; köa en knapp staten change-händelse
om (buttonCurrent [rad] & (1 << index)) {/ / och växla knapparna debounce staten.
buttonState [rad] | = (1 << index);
}
annat {
buttonState [rad] & = ~ (1 << index);
}
}
}
}
{Ogiltig shift()
för (jag = 0; jag < 4; i ++) {
buttonLast [i] = buttonCurrent [i];
byte dataToSend = (1 << (jag + 4)) | (15 & ~ ledData[i]);
ställa in spärren pin låg så lysdioderna inte ändra samtidigt skickas i bitar
digitalWrite (ledLatchPin, låg);
flytta ut bitarna av dataToSend
shiftOut (ledDataPin, ledClockPin, LSBFIRST, dataToSend);
ställa in spärren pin hög så lysdioderna kommer att få nya uppgifter
digitalWrite (ledLatchPin, hög);
När en rad har ställts in hög, ta emot data från knappar
ställa in spärren pin hög
digitalWrite (buttonLatchPin, hög);
skifta i data
buttonCurrent [i] = shiftIn (buttonDataPin, buttonClockPin, LSBFIRST) >> 3.
latchpin låg
digitalWrite (buttonLatchPin, låg);
för (k = 0; k < 4; k ++) {
buttonCheck(i,k);
}
}
}
void updateLEDs() {//update lysdioder att spegla tillståndet i knapparna
för (j = 0; j < 4; j ++) {
ledData [j] = buttonState [j];
}
}
void MIDImessage (int befalla, int MIDInote, int MIDIvelocity) {//send s ett MIDI-meddelande
Serial.write (kommandot); //send på eller av kommandot
Serial.write (MIDInote); //send pitch data
Serial.write (MIDIvelocity); //send hastighet data
}
void sendMIDI() {
för (byte en = 0; en < 4; a ++) {
för (byte b = 0; b < 4; b ++) {
om (buttonEvent [a] & (1 << b)) {
buttonEvent [a] & = ~ (1 << b), //zero knappen händelse
om (buttonState [a] & (1 << b)) {
MIDImessage(noteON,(MIDIoffset+a*5+b),100);
}
annat {
MIDImessage(noteON,(MIDIoffset+a*5+b),0);
}
}
}
}
}
void loop() {
Shift();
updateLEDs();
sendMIDI();
}