midi in naar led

Hoi, Ik ben nieuw met arduino. ik heb een basis eletra kennis maar ook niet super

Ik probeer al 2 dagen om een midi in controller te maken en het lukt me niet.

Ik heb diverse tutorials gevolgd, ook met verschillende optoisolators de 4n28 en de 6n138

beide hebben geen succes, wat ik probeer is om van mijn korg esx drumcomputer de midi singalen om te zetten naar leds.

Zou het kunnen dat de standaard tutorials niet werken omdat deze meestal voor een keyboard met midi out zijn gemaakt? Zodat de tonen die de mijn korg via de midi verstuurd anders zijn?, Ik heb een tooltje op mijn pc geinstalleerd en de midi out stuurt goed uit. maar op de arduino gebeurd helemaal niks geen enkele led komt op.

deze site heb ik oa gebruikt.

http://arduino.cc/forum/index.php/topic,22447.0.html

Wie o wie kan me helpen?
alvast bedankt!

Hoi Dennis uit Rotterdam, welkom.

Je verwijst naar een thread met 154 bijdragen, heb jij die allemaal gelezen ?
Ik niet, is me teveel werk.
Maar heb je gezien dat je wel met een en ander rekening moet houden ?
Je kunt een aantal dingen doen om jezelf te helpen.
Een daarvan is registreren of je UNO wel boot, omdat aangegeven word dat het kan voorkomen dat de boot geblokkeerd word als er al data is wanneer je je UNO opstart of reset.
Als je pinnen over hebt, kun je die gebruiken om een extra LEDje te laten oplichten op bepaalde kritische momenten.
Zoals bijvoorbeeld wanneer je systeem aan het opstarten is tijdens de void.SETUP() fase in je sketch.
En dan weer op een ander moment uit laten gaan.
Maar die momenten kunnen dan wel heel snel na elkaar komen zodat je ze mist.
Je kunt ook een display aansluiten, maar dat kost je meer pinnen en redelijk veel meer programmeren om dat aan te sturen.
Aangezien je schijnbaar de seriële communicatie al gebruikt voor MIDI (als ik het goed begrepen heb), kun je niet met de seriële monitor meekijken wat er gebeurt.

Verder is het een goed idee als je de code die je op dit moment klaar hebt staan, hier ook neerzet zodat iemand er naar kan kijken.

Ik heb inderdaad de gehele thread doorgelezen, eerlijk gezegd is mijn engels niet top. :blush:

Ik heb diverse standaard sketches gebruikt die er op het net te vinden zijn.

/* Midi In Basic 0.2 // kuki 8.2007
*


  • listen for midi serial data, and light leds for individual notes

IMPORTANT:
your arduino might not start if it receives data directly after a reset, because the bootloader thinks you want to uplad a new progam.
you might need to unplug the midi-hardware until the board is running your program. that is when that statusLed turns on.

#####################################################################################################################################################
SOMETHING ABOUT MIDI MESSAGES
midi messages start with one status byte followed by 1 or 2 data bytes, depending on the command

example midi message: 144-36-100
the status byte "144" tells us what to do. "144" means "note on".
in this case the second bytes tells us which note to play (36=middle C)
the third byte is the velocity for that note (that is how powerful the note was struck= 100)

example midi message: 128-36
this message is a "note off" message (status byte = 128). it is followed by the note (data byte = 36)
since "note off" messages don't need a velocity value (it's just OFF) there will be no third byte in this case
NOTE: some midi keyboards will never send a "note off" message, but rather a "note on with zero velocity"

do a web search for midi messages to learn more about aftertouch, poly-pressure, midi time code, midi clock and more interesting things.
#####################################################################################################################################################

HARDWARE NOTE:
The Midi Socket is connected to arduino RX through an opto-isolator to invert the midi signal and seperate the circuits of individual instruments.
connect 8 leds to pin2-pin9 on your arduino.

####################################################################################################################################################

*/

//variables setup

byte incomingByte;
byte note;
byte velocity;

int statusLed = 13; // select the pin for the LED

int action=2; //0 =note off ; 1=note on ; 2= nada

//setup: declaring iputs and outputs and begin serial
void setup() {
pinMode(statusLed,OUTPUT); // declare the LED's pin as output
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);

//start serial with midi baudrate 31250 or 38400 for debugging
Serial.begin(31250);
digitalWrite(statusLed,HIGH);
}

//loop: wait for serial data, and interpret the message
void loop () {
if (Serial.available() > 0) {
blink(); //once to signal at least something arrived

// read the incoming byte:
incomingByte = Serial.read();

// wait for as status-byte, channel 1, note on
if (incomingByte== 144){ // note on message starting starting
// yeaha, we're getting something
blink();
blink();
blink();
}
}
}

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

void playNote(byte note, byte velocity){
int value=LOW;
if (velocity >10){
value=HIGH;
}else{
value=LOW;
}

//since we don't want to "play" all notes we wait for a note between 36 & 44
if(note>=36 && note<44){
byte myPin=note-34; // to get a pinnumber between 2 and 9
digitalWrite(myPin, value);
}

}

Ik heb nu 3 optocouplers gebruikt en geen van alle werken deze.

Ik heb mijn korg esx geprobeerd en een midi keyboard. Met het programma midi-ox zie ik de midi singalen binnenkomen en weer verzenden. op mijn usb midi interface ( Emu midi 1x1) zie ik ook de ledsjes van ontvangst en verzenden knipperen als ik toetsen aanraak op de keyboard. Ik heb verschillende weerstanden geprobeerd en zonder een weerstand op de ground. beide geen effect. ik heb hier 3 soorten arduino liggen, de arduino uno, de arduino mega, en een arduino olimex-328. Allen hebben hetzelfde effect.

De site's die ik heb gevonden en hierbij de circuit heb nagemaakt en de sketch 1op1 heb gekopieerd zijn er een hoop.

http://fritzing.org/projects/midi-in-arduino/
http://www.tigoe.com/pcomp/code/communication/midi/

http://arduino.cc/forum/index.php/topic,4639.0.html

Ik snap er niks meer van. ik heb ook wat foto's van mijn setup gemaakt, en van de midi-ox programma waar je de singalen ziet binnenkomen en weer ziet verzenden.

Wat ik doe is het volgende.
ik haal alle kabels die naar de midi lopen eruit ik upload het programma en wacht even. het ledje 13 die onboard zit licht op en ik doe dan pas de midi kabel erin. ik heb ook al de midi connector polen omgedraaid aangezien ik las dat meer mensen hiermee de fout ingingen.




Kleine update.

Ik krijg hem nu werkend met de midi keyboard. alleen maar bij een paar noten. Ik heb nu deze code gebruikt

//variables setup

byte incomingByte = 255;
byte note = 255;
byte velocity = 255;

int statusLed = 13; // select the pin for the LED

int action=2; //0 =note off ; 1=note on ; 2= nada

//setup: declaring iputs and outputs and begin serial
void setup() {
pinMode(statusLed,OUTPUT); // declare the LED's pin as output
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);

//start serial with midi baudrate 31250 or 38400 for debugging
Serial.begin(31250);
digitalWrite(statusLed,HIGH);
digitalWrite(10, OUTPUT);
}

//loop: wait for serial data, and interpret the message
void loop () {
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();

// wait for as status-byte, channel 1, note on or off
if (incomingByte== 144){ // note on message starting starting
action=1;
}else if (incomingByte== 128){ // note off message starting
action=0;
}else if (incomingByte > 144){ // message is anything but note message
action=2; //nothing happens
//not implemented yet
//}else if (incomingByte== 160){ // polypressure message starting
//not implemented yet
//process second byte
}else if ( (incomingByte<=127) && (action ==1 || action==0)&&(note==255) ){ // if we received note number message load this byte in the note byte
note=incomingByte;
//process Third byte
}else if ( (incomingByte<=127) && (action ==1)&&(note!=255) ){ // if we received noteon message load this byte in the velocity byte
velocity=incomingByte;
playNote(note, velocity);
note=255;
}else if ( (incomingByte<=127) && (action ==0)&&(note!=255) ){ // if we received note message load this byte in the velocity byte
velocity=0;
playNote(note, velocity);
note=255;
}else{
//nada
}
}
}

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

void playNote(byte note, byte velocity){
int value=LOW;
if (velocity >10){
value=HIGH;
}else{
value=LOW;
}

//since we don't want to "play" all notes we wait for a note between 36 & 44
if(note>=36 && note<44){
byte myPin=note-34; // to get a pinnumber between 2 and 9
digitalWrite(myPin, value);
}

}

Hij werkt nog niet op mijn korg esx. Ik neem aan dat ik de noten moet veranderen waar ie op moet reageren?

Ik kan je code niet helemaal goed lezen/volgen, maar het lijkt er op dat je naar bepaalde noten luistert.
Is dat wat je wil ?
Er word gefilterd tussen verschillende soorten signalen zodat je stuursignalen afvangt en er dan niets mee doet.
Probeer anders eens of je het voor mekaar kunt krijgen eerst te laten zien dat er überhaupt een noot gespeeld word en niet iets anders gecommuniceerd word.

Het lijkt me dat het wel erg belangrijk is dat je weet welke midi commando's er zijn en dat je niet op een toon, maar op een bereik gaat letten.
In het laatste stukje word zoiets gedaan, maar misschien anders als jij van plan bent.
Waarschijnlijk dat je daarom niet alles ziet wat je doet met je keyboard.
Haal anders dat laatste stukje even weg door het als commentaar aan te merken.
Je kunt dit ook ombouwen naar een bereik van tonen en het resultaat dat je hebt dan omzetten (mappen) naar een pin nummer.
Dat is volgens mij niet heel erg moeilijk om te doen (zijn meerdere oplossingen voor mogelijk).

Is die sketch waar je de midi afhandelt misschien al wat ouder ?
Persoonlijk vind ik de switch/case oplossing eleganter als de if/then/else/else/else... oplossing, maar voor de werking moet dat verder niet zoveel uitmaken.

Het is me ondertussen ongeveer gelukt, het is me gelukt om met een paar toets aanslagen op het keyboard een led te laten oplichten, via midi-ox kon ik de midi notes zien welke de led deed oplichten. De korg esx is zeer uitgebreid en daar heb ik geluk mee. ik heb hierin 9 groepen waar ik een sampel in kan laden zodat je live muziek kan maken. in de korg esx kan ik aan elke groep een midi note koppelen die die via de midi verstuurd, ik heb ze de noten gegeven waar de leds op reageren.

Erg tof om te zien werken.

Ik heb trouwens wel deze code gebruikt maar een kleine aanpassing ingemaakt

 //play all notes
 if(note>=0 && note<127){
   byte myPin=note-34; // to get a pinnumber between 2 and 9
   digitalWrite(myPin, value);

ik moet wel zeggen dan ik nog echt heel erg nieuw ben met arduino en als ik die instellingen niet kon veranderen in de korg esx had ik nu nog hoofdpijn gehad.
Arduino is echt super leuk maar leren doe je niet in een paar dagen 8)

volgend project wordt een arduino met audio input die dan weer leds laat oplichten op de tonen van de audio (licht orgel die reageerd op de geluids input)

dennis010:
ik moet wel zeggen dan ik nog echt heel erg nieuw ben met arduino en als ik die instellingen niet kon veranderen in de korg esx had ik nu nog hoofdpijn gehad.
Arduino is echt super leuk maar leren doe je niet in een paar dagen 8)

Dat heb je dan toch weer mooi geleerd :slight_smile:
Volhouden is de boodschat.
Met vriendelijke groet
Jantje