Arduino

Sparkfun Midi Shield

Saturday, December 15, 2012
Sparkfun Midi ShieldLike0

Net voordat mijn twee telgen geboren gaan worden ben ik begonnen aan een nieuw Arduino projectje: de ultieme MIDI-controller.

Uiteindelijk wil ik de MIDI-controller der MIDI-controllers maken waarmee je met allerlei sensoren synths kan beïnvloeden door middel van gecontroleerde willekeurm Maar vandaag begon ik klein: met het in elkaar solderen van het Sparkfun Midi Shield.

Dit shield, dat zonder female headers geleverd wordt (zonder female headers kun je ‘m niet vastklikken op je Arduino, dus besten die mee!) zorgt ervoor dat je bijna meteen aan de slag kunt met MIDI. Ik zeg bijna, omdat je de zooi dus nog wel even in elkaar moet solderen. Zie hier mijn trotse resultaat:

Het solderen viel wel mee (ik ben een beginner), hoewel de headers lastig recht te houden waren. De knopjes, midi connectors en potmeters zaten goed vast dus dat was geen probleem. Het lijkt er op dat alle knoppen werken, dus ik heb wat eerste testen kunnen doen.

Omdat ik de bijgeleverde sketch net niet helemaal lekker vond werken, voeg ik hier een wat simpelere versie toe, die naast note on ook een note off meegeeft als je de knop los laat. Alle overige (midi-in, onder andere) informatie heb ik eruit gehaald. De originele sketch van Sparkfun is hier te vinden (“Arduino Example Sketch”). In onderstaande code staan nog wat rest-lijnen uit de oude code die hier niet meer gebruikt worden, dus raak daar vooral niet van in de war. Dit was alleen even om uit te testen of Nuendo mijn shield begreep en dat bleek zo te zijn!

 

Versimpelde code:

// SparkFun MIDI Sheild and MIDI Breakout test code
// Defines bare-bones routines for sending and receiving MIDI data
// Written 02/16/10

// defines for MIDI Shield components only
#define KNOB1  0                        // Definieer draaiknop 1
#define KNOB2  1                        // Definieer draaiknop 2

#define BUTTON1  2                      // Definieer drukknop 1
#define BUTTON2  3                      // Definieer drukknop 2
#define BUTTON3  4                      // Definieer drukknop 3

#define STAT1  7                        // Definieer STAT1 als led output op shield
#define STAT2  6                        // Definieer STAT2 als led output op shield

#define OFF 1                           // ???
#define ON 2                            // ???
#define WAIT 3                          // ???

byte incomingByte;                      // ???
byte note;                              // Definieer midi note
byte velocity;                          // Definieer midi velocity
int pot;                                // Definieer potentiometer (pin A0)

byte byte1;                            // ??
byte byte2;                            // ??
byte byte3;                            // ??

int action=2;                         // Definieer wat te doen
//1 =note off ; 2=note on ; 3= wait

void setup() {

pinMode(STAT1,OUTPUT);              // Pin 7 is vanaf nu een output.
pinMode(STAT2,OUTPUT);              // Pin 6 is vanaf nu een output.

pinMode(BUTTON1,INPUT);              // Drukknop 1 op pin 2 is nu een input.
pinMode(BUTTON2,INPUT);              // Drukknop 2 op pin 3 is nu een input.
pinMode(BUTTON3,INPUT);              // Drukknop 3 op pin 4 is nu een input.

digitalWrite(BUTTON1,HIGH);          // Schrijf de waarde HIGH naar drukknop 1
digitalWrite(BUTTON2,HIGH);          // Schrijf de waarde HIGH naar drukknop 2
digitalWrite(BUTTON3,HIGH);          // Schrijf de waarde HIGH naar drukknop 3

for(int i = 0;i < 10;i++)             // Knipper MIDI Shield LED’s tijdens het opstarten
{
digitalWrite(STAT1,HIGH);          // HIGH betekent: LED UIT
digitalWrite(STAT2,LOW);           // LOW betekent: LED AAN
delay(100);
digitalWrite(STAT1,LOW);
digitalWrite(STAT2,HIGH);
delay(100);
}
digitalWrite(STAT1,HIGH);             // Zet uiteindelijk beide LEDjes uit
digitalWrite(STAT2,HIGH);

Serial.begin(31250);                  // Baudrate voor MIDI moet 31250 zijn
}

void loop () {

//*************** MIDI OUT ***************//

pot = analogRead(0);                                        // pot = analoge waarde uitlezing van pin 0   (tussen 0 – 1023)
note = pot/8;  // convert value to value 0-127              // note is de pot-waarde gedeeld door acht    (tussen 0 – 127)
if(button(BUTTON1) || button(BUTTON2) || button(BUTTON3))   // Als drukknop 1, 2 of 3 wordt ingedrukt,
{
Midi_Send(0x90,note,0x45);                                // Stuur midi commando (note on op channel 1 (0x90)), note, middel velocity
while(button(BUTTON1) || button(BUTTON2) || button(BUTTON3));  // Herhaal dit zolang de knoppen ingedrukt blijven
}
Midi_Send(0x80,note,0x45);
//*************** MIDI LOOPBACK ******************//
/*  if(Serial.available() > 0)                                  // Indien er seriele waarden binnenkomen,
{
byte1 = Serial.read();                                    // byte1 is de uitlezing van serial (tussen 0 – 255)
byte2 = Serial.read();                                    // byte2 is de uitlezing van serial (tussen 0 – 255)
byte3 = Serial.read();                                    // byte3 is de uitlezing van serial (tussen 0 – 255)

Midi_Send(byte1, byte2, byte3);                          // Stuur dit uit over midi
}
*/

}

void Midi_Send(byte cmd, byte data1, byte data2) {
Serial.print(cmd, BYTE);
Serial.print(data1, BYTE);
Serial.print(data2, BYTE);
}

void blink(){
digitalWrite(STAT1, HIGH);
delay(100);
digitalWrite(STAT1, LOW);
delay(100);
}

char button(char button_num)
{
return (!(digitalRead(button_num)));
}

———

Wel typisch bij deze sketch: in Nuendo treden bij bepaalde noten bijzondere bijwerkingen op. Het “edit history” scherm verschijnt, loop gaat aan en uit, of het “save as” dialog scherm komt tevoorschijn. Ik denk dat als ik uitzoek welke midi berichten precies verzonden worden, ik via het Steinberg forum misschien wel moet kunnen achterhalen waarom dit gebeurt.

 

0

Leave a Reply

Your email address will not be published.

Follow @ Guerrilla Games
Instagram has returned invalid data.