Pages: [1]   Go Down
Author Topic: midi in naar led  (Read 1404 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 35
Posts: 1299
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ik heb inderdaad de gehele thread doorgelezen, eerlijk gezegd is mijn engels niet top. smiley-red

Ik heb diverse standaard sketches gebruikt die er op het net te vinden zijn.
Quote
/* 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://www.instructables.com/id/Send-and-Receive-MIDI-with-Arduino/step9/Receive-MIDI-Messages-with-Arduino/
http://fritzing.org/projects/midi-in-arduino/
http://www.tigoe.com/pcomp/code/communication/midi/
http://ragingreality.blogspot.nl/2008/11/arduino-led-midi-controller.html
http://arduino.cc/forum/index.php/topic,4639.0.html
http://arduino.cc/forum/index.php?PHPSESSID=c5cf9748971363ed912353c02e5503d5&topic=22447.15

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.





Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kleine update.

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

Quote
//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?
Logged

The Netherlands
Offline Offline
Edison Member
*
Karma: 35
Posts: 1299
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
//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  smiley-cool

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)
Logged

Forum Moderator
Belgium
Offline Offline
Edison Member
*****
Karma: 58
Posts: 1731
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-cool
Dat heb je dan toch weer mooi geleerd :-)
Volhouden is de boodschat.
Met vriendelijke groet
Jantje
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Pages: [1]   Go Up
Jump to: