Paso 3: Implementación MIDI
Codificación de
Los entresijos de MIDI están muy bien documentados en otros lugares, pero para este proyecto estamos realmente sólo ocupan tres de ellos: "canal de comando", "número de la nota" y "velocidad".
Canal de comando es difícil codificado a los dos comandos que necesitamos, "en, canal 1" y "Nota de, canal 1". En el código aparece como:
noteON int = 144; (nota en el canal 1)
y noteOFF int = 128; (nota de canal 1)
"Número de la nota del" requiere una pequeña cantidad de cálculo. En modo SERIAL los 64 botón escudo envía datos en serie para pulsar un botón o versiones, de 1 a 64 para el lanzamiento y de 129 a 192 para la prensa. MIDI se inicia en cero para que nota sobre para presionar el botón de abajo (suponiendo que su partida en la parte inferior de la escala) debe ser disminuye por 129. Nota de debe disminuye en 1. Si esto es demasiado bajo (nota MIDI «cero» es realmente bajo), sumando 12 a estos números se abrirá el tono una octava.
Velocidad es difícil codificado a 100, como se trata con cierres de interruptor no sensibilidad al tacto. Si usted lo quiere más fuerte o más suave, esta variable puede variar de 0-127.
Aquí está el código completo, con muchas gracias Josh Boughey
/ ** Entrante flujo serial MIDIstomp Read entrada pulsador, y responder con salida MIDI ** escrito por Tim Halle & Josh Boughey, abril de 2015 ** /
#include
volátil uint8_t botón = 0; botón Configurar
int velocidad = 100; velocidad de notas MIDI, debe estar entre 0 y 127
noteON int = 144; 144 = 10010000 en binario, nota en canal 1command
noteOFF int = 128; 128 = 10000000 en binario, nota de comando de canal 1
int NoteNumber = 0;
software serial
MidiSerial SoftwareSerial (2, 3); digitales pins que usaremos para suave serie RX y TX
void setup() / / conjunto de botón y baudios de MIDI:
{
Serial.Begin(57600);
midiSerial.begin(31250);
}
void loop()
{/ / Inicio del bucle principal
Si (Serial.available() > 0) / / Compruebe si los datos en serie se recibieron, si no solo lazo otra vez
{
Botón = Serial.read(); ¿botón que se presionó?
if(Button > 128) / / esto nos dice es una nota
{
NoteNumber=(Button-129); establecer nota MIDI valor
MidiOn(); juega una nota MIDI.
}
otra cosa
{/ / Si es una nota
NoteNumber=(Button-1); establecer nota MIDI valor
MidiOff(); Se apaga un MIDI Nota.
} / / fin otra
}
} / / Fin de bucle principal
void MidiOn()
{
midiSerial.write(noteON); Nota en canal 1
midiSerial.write(NoteNumber); Qué nota deben = botón
midiSerial.write(velocity); Velocidad a 100
Serial.Print ("Nota sobre"); Valor de impresiones para monitor serial
Serial.println("");
Serial.Print(noteON);
Serial.println("");
Serial.Print(NoteNumber);
Serial.println("");
Serial.Print(Velocity);
Serial.println("");
Serial.println("");
}
void MidiOff()
{
midiSerial.write(noteOFF); Nota de canal 1
midiSerial.write(NoteNumber); Qué nota deben = botón
midiSerial.write(velocity); Velocidad a 100
Serial.Print ("NOTE OFF"); Valor de impresiones para monitor serial
Serial.println("");
Serial.Print(noteOFF);
Serial.println("");
Serial.Print(NoteNumber);
Serial.println("");
Serial.Print(Velocity);
Serial.println("");
Serial.println("");
}