• Welcome to LusoRobótica - Robótica em Português.
 

Modificação de um teclado MIDI

Started by diogo0880, 01 de July de 2011, 20:36

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

tcustodio

desculpa não ter tido grande tempo para te ajudar :S

olha, estás a usar a biblioteca MIDI para arduino? com essa biblioteca consegues definir funções que são chamadas automaticamente em determinadas situações (eventos). neste caso, a biblioteca MIDI pode fazer-te com que ao receberes uma mensagem midi, se for uma mensagem Control Change, é chamada uma função que tu definiste, se for outra coisa qualquer, é chamada outra função que tu defines. Chamam-se funções call-back.
sinceramente nunca cheguei a usar esta biblioteca, mas creio que ao usá-la, possas sentir-te mais seguro de que o teu arduino faz exactamente o que queres!

http://www.arduino.cc/playground/Main/MIDILibrary
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

tcustodio

acho que encontrei a ferramenta de que precisas para poderes enviar MIDI pela porta série de volta para o arduino :)

http://www.stephenhobley.com/blog/2010/02/15/serial-port-midi-relay/
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

diogo0880

Quote from: tcustodio on 15 de August de 2011, 03:18
desculpa não ter tido grande tempo para te ajudar :S

olha, estás a usar a biblioteca MIDI para arduino? com essa biblioteca consegues definir funções que são chamadas automaticamente em determinadas situações (eventos). neste caso, a biblioteca MIDI pode fazer-te com que ao receberes uma mensagem midi, se for uma mensagem Control Change, é chamada uma função que tu definiste, se for outra coisa qualquer, é chamada outra função que tu defines. Chamam-se funções call-back.
sinceramente nunca cheguei a usar esta biblioteca, mas creio que ao usá-la, possas sentir-te mais seguro de que o teu arduino faz exactamente o que queres!

http://www.arduino.cc/playground/Main/MIDILibrary

Eu já tinha visto essa biblioteca MIDI e já a saquei e instalei, mas ainda não vi muito bem o que faz, tenho de dar mais uma olhada no pdf que tras :)

Quote from: tcustodio on 15 de August de 2011, 03:21
acho que encontrei a ferramenta de que precisas para poderes enviar MIDI pela porta série de volta para o arduino :)

http://www.stephenhobley.com/blog/2010/02/15/serial-port-midi-relay/

Vou exprimentar e já dou feedback :)

Obrigado por toda a ajuda até agora tcustódio ;)

diogo0880

#93
Não me orientei com o programa e quanto a biblioteca MIDI tambem está dificil perceber :-\

--- EDITADO ---

Tentativas a tras de tentativas e o programa que indicaste não converte nem Serial -> MIDI nem MIDI -> Serial :-\ Estive a procurar da solução no site deles mas não encontrei nada :S:S

diogo0880

Quote from: tcustodio on 15 de August de 2011, 03:18
desculpa não ter tido grande tempo para te ajudar :S

Não há problema nenhum amigo, eu agradeço toda a ajuda que tens dado ;)

diogo0880

Definitivamente não consigo fazer com que o programa envie sinais midi para o arduino... :(
O programa em questão é o Traktor, entre outros

diogo0880

Boas pessoal, em primeiro lugar quero pedir desculpa pela demora, tenho estado com algumas dificuldades em prestar tempo a este projecto :-\
Em segundo lugar quero dizer que encontrei um código em que parece ser a solução para o problema dos LED's ligarem via MIDI. Acontece é que ainda não o consegui por a funcionar... o código é o seguinte:

/* 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) {
    // 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== 208){ // aftertouch message starting
       //not implemented yet
    }else if (incomingByte== 160){ // polypressure message starting
       //not implemented yet
    }else if ( (action==0)&&(note==0) ){ // if we received a "note off", we wait for which note (databyte)
      note=incomingByte;
      playNote(note, 0);
      note=0;
      velocity=0;
      action=2;
    }else if ( (action==1)&&(note==0) ){ // if we received a "note on", we wait for the note (databyte)
      note=incomingByte;
    }else if ( (action==1)&&(note!=0) ){ // ...and then the velocity
      velocity=incomingByte;
      playNote(note, velocity);
      note=0;
      velocity=0;
      action=0;
    }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);
}

}


Percebem-no? ???

diogo0880

Boas Tardes amigos :)
Tenho boas novidades...

Seguindo um esquema eléctrico e um código de programação (colocado no post anterior), consegui fazer com certos LED's ligassem ao pressionar determinadas notas do piano e o arduino continuasse a receber e a enviar sinais para o computador! =D   O resultado na Placa de Testes foi este:

Se quiserem ver o esquema eléctrico, apesar de estar confuso, está aqui (http://img716.imageshack.us/img716/4456/s1potetecladomidiesquem.png)

O potenciómetro junto à ficha DIN foi para testar o envio de informação para o computador.
A recepção de informação vinda do computador foi testada com o upload do código do potenciómetro :)

Até agora parece estar a avançar muito bem, vou estudar melhor o código do post anterior e tentar fazer com que seja o computador a ligar os led's que eu quero :)

Agradeço qualquer ajuda que já tenham dado, ou que venham a dar (sim porque vou percisar MUITO dela ;D)
Obrigado pessoal!!



Só um à parte para o tcustodio.
Aquele programa que me indicaste anteriormente, o MIDI Relay, funciona apenas num sentido (Arduino -> PC). Confirmei isto com o programador que originou o programa :-\
Mas obrigado na mesmo amigo ;)

diogo0880

Pessoal tou com um problema que me está a impedir de avançar no projecto :-\

Como não encontro nenhum programa que converta MIDI -> Serial, a unica maneira de testar (penso eu) é alterando o firmware do atmega8U2 para que o arduino seja detectado como um dispositivo MIDI...

Mas como é obvio isto não é nada facil de se fazer e estou com grandes duvidas de como carregar o firmware e como voltar ao firmware original, especialmente porque não encontro informação para o meu arduino (Arduino UNO R2)

Ajuda?? :-\ :-\

senso

O R2 é uma pequena alteração no circuito do autoreset, por isso pesquisa unicamente por uno.
O programa para reprogramares o Atmega8u2 podes sacar da Atmel e chama-se Flip.
Avr fanboy

diogo0880

Quote from: senso on 25 de September de 2011, 12:55
O R2 é uma pequena alteração no circuito do autoreset, por isso pesquisa unicamente por uno.
O programa para reprogramares o Atmega8u2 podes sacar da Atmel e chama-se Flip.

Já alterei o firmware e funciona as mil maravilhas =D
O programa já controla os LED's

Vou continuar com os testes e com a aprendizagem de C++, quando tiver novidades posto :)

Obrigado por toda a ajuda até agora :)


diogo0880


diogo0880

Devagarinho vou fazendo mais umas coisas no arduino :D
Mas para já deixo-vos aqui um pequeno guia para porem o Arduino em modo DFU



Seguindo a imagem acima, faz-se o seguinte:
1º- Liga-se o Arduino ao PC;
2º- Liga-se o fio 1 ao pino indicado;
3º- Toca-se com o fio 2 no pino indicado;
4º- Desliga-s o fio 1 do pino;
e pronto, tens o arduino em modo DFU

O Arduino deixará de ser detectado como ele próprio e será necessário instalar novos drivers para este modo (os drivers estão no directório do programa Flip da ATMEL, o qual eu aconcelho para modificar o firmware) :)

diogo0880

Pessoal depois deste tempo todo e das cenas que fui aprendendo, descobri que não consigo fazer o que quero com o arduino.
Eu perciso que os pots sejam precisos e, por causa da função map, os valores dos pots saltam de 5 em 5 :S

De qualquer maneira não tenho muito tempo para me dedicar a este projecto agora...

Obrigado pela vossa ajuda

Cumprimentos