Il problema stava nel dover dichiarare in ordine diverso, gli attributi della funzione void e dell istruzione send message. Questo in accordo alla documentazione della libreria MIDI.
void noteon(byte channel, byte note, byte velocity) {
MIDI.sendNoteOn( note + transpose, velocity, channel );
}
Ora il codice funziona ma ho un nuovo problema.
Ho aggiunto un pulsante di midi panic che funziona bene e un pulsante di tipo switch per applicare la modifica dei messaggi in ingresso ad Arduino in tempo reale.
Quando il bottone è premuto i dati vengono modificati.
Il problema è che se premo il bottone durante un messaggio di note off, la trasposizione (modifica) parte da quel messaggio e il precedente messaggio di note on rimane "incastrato" e continua a suonare.
Esempio:
Time note message
00 C1 ON
01 C1 OFF
02 C1 ON
03 D1 OFF <----- bottone di transpose viene premuto. Note off message for C1 è modificato. C1 continua a suonare.
04 D1 ON C1 ancora in stato di ON
05 D1 OFF C1 ancora in stato di ON
... .. .... C1 ancora in stato di ON
Ho pensato di inserire in void loop() delle istruzioni come:
Quando il bottone è premuto (HIGH)
se il messaggio corrente è di note off
non modificare.
Se il messaggio corrente è di note on
modificalo.
Esegui questa istruzione una sola volta.
Quando il bottone non è premuto
se il messaggio corrente è di note off
non modificare.
Se il messaggio corrente è di note on
modificalo.
Esegui questa istruzione una sola volta.
Consigli? Secondo voi è la strada giusta?
Grazie..
#include <MIDI.h>
const int InputTriggerTranspose = 7; // port for the push button transpose switch
byte transpose = 0;
byte last_type, last_ch, last_note, last_vel;
const int InputTriggerPanic = 2; // port for the working midi panic button
int Panic = 0;
void noteon(byte channel, byte note, byte velocity) {
digitalWrite( 13, HIGH );
last_type = 1;
last_ch = channel;
last_note = note;
last_vel = velocity;
}
void noteoff(byte channel, byte note, byte velocity) {
digitalWrite( 13, LOW );
last_type = 2;
last_ch = channel;
last_note = note;
last_vel = velocity;
}
void setup() {
pinMode (2, INPUT);
pinMode (7, INPUT);
pinMode( 13, OUTPUT );
MIDI.begin();
MIDI.setInputChannel( MIDI_CHANNEL_OMNI ); // listen to all channels
MIDI.turnThruOff(); // turn off thru mode
MIDI.setHandleNoteOn(noteon); // call noteon when a note on message is received
MIDI.setHandleNoteOff(noteoff); // call noteoff when a note off message is received
last_type = 0;
}
void loop() {
Panic = digitalRead(InputTriggerPanic);
if (Panic == HIGH) {
MIDI.sendControlChange(120, 0, last_ch); // midi panic message
}
transpose = digitalRead(InputTriggerTranspose);
if (transpose == HIGH) {
transpose = 7;}