ACESSE www.fisicarduino.com

Este projeto conecta o Arduino a um módulo de piano midi.  Através da porta serial, o Arduino envia informação (protocolo midi) de (note on) e (note off) para o módulo de som. Note on (tecla do teclado pressionada) e note off (momento em que a tecla deixa de ser pressionada). Assim é possível controlar qualquer dispositivo midi. Ex.: Baterias eletrônicas, Teclados e através de uma interface midi, conectada ao computador, controlar VSTs.

Aqui está o código fonte do Arduino:

/*
Arduino Plays Bach - Prelude in C

Este código mostra como conectar um dispositivo midi ao Arduino.
Através da porta serial, o Arduino envia informação (protocolo midi) de (note on) e (note off) para o módulo de som.
Note on (tecla do teclado pressionada) e note off (momento em que a tecla deixa de ser pressionada).
Assim é possível controlar qualquer dispositivo midi. Ex.: Baterias eletrônicas, Teclados e através de uma interface
midi, conectada ao computador, controlar VSTs.

O Circuito:
* Entrada do pino digital 1 é conectada ao pino 5 do cabo midi (macho).
* Pino 2 (cabo midi) conectado ao terra.
* Pino 4 (cabo midi) conectado aos +5V em série com um resistor de 220 ohms.
* Há um led conectado ao pino digital 8, que acende e apaga cada vez que uma nota é tocada.

Conecte o cabo midi no módulo midi e ouça a música.

Programa criado por Marcelo Rocha.

Este código é de domínio público.

Assista ao vídeo do projeto funcionando: www.fisicarduino.wordpress.com

*/

boolean estado = 1; // Variável que define o estado do led ( aceso ou apagado ).
int ledPin = 8; // Pino do led.
// A variável Notas é um array que contém as notas da música. Cada nota musical equivale a um valor em hexadecimal.
// 0x3C é o dó central do piano, o dó3 e assim por diante.
char notas[] = {0x3C,0x40,0x43,0x48,0x4C,0x43,0x48,0x4C,0x3C,0x40,0x43,0x48,0x4C,0x43,0x48,0x4C,
                0x3C,0x3E,0x45,0x4A,0x4D,0x45,0x4A,0x4D,0x3C,0x3E,0x45,0x4A,0x4D,0x45,0x4A,0x4D,
                0x3B,0x3E,0x43,0x4A,0x4D,0x43,0x4A,0x4D,0x3B,0x3E,0x43,0x4A,0x4D,0x43,0x4A,0x4D,
                0x3B,0x3C,0x43,0x48,0x4C,0x43,0x48,0x4C,0x3B,0x3C,0x43,0x48,0x4C,0x43,0x48,0x4C};

void setup() {

Serial.begin(31250); // Configura a velocidade de comunicação serial.
pinMode(ledPin, OUTPUT); // Configura o ledPin com saída.
delay(1000); // Espera 1s.
/* Através do protocolo midi podemos comandar o dispositivo midi com vários parâmetros.
Podemos mudar o timbre através de um comando chamado (Program Change), mudar a afinação usando um PITCH BEND e etc.
*/
Serial.print(0xC0, BYTE); // Neste caso 0xC0 é o código para enviar informação do tipo PROGRAM CHANGE.
Serial.print(0x0D, BYTE); // Aqui temos o número do som que queremos, neste caso é o 0x0D que é 13 em decimal.
}

void loop() {
// Este for varre o nosso vetor notas, que tem 64 posições.
for (int nota = 0; nota 0). // Se apagado, acende ( 0 -> 1 ).
delay(1); // Pequena pausa para que o módulo receba o noteOff.
}
delay(1000); // Espera 1s para repetir a música.
}

// Função noteOn, recebe os parâmetros ( cmd = Comando, pitch = Nota, velocity = (Intensidade com que será tocada a nota, de 0 à 127.))
void noteOn(int cmd, int pitch, int velocity) {
Serial.print(cmd, BYTE); // Envia o comando.
Serial.print(pitch, BYTE); // Envia a nota.
Serial.print(velocity, BYTE); // Envia o velocity.
}