Arduino Forum

International => Italiano => Software => Topic started by: schiller on Apr 26, 2013, 02:02 pm

Title: Midi, array, modificare dati in ingresso ad Arduino e spedirli in uscita
Post by: schiller on Apr 26, 2013, 02:02 pm
Si tratta di un progetto per una midi transpose box.
In pratica arduino riceve messaggi midi di note on / note off
Questi messaggi vengono modificati per variare la nota (il primo byte dei tre che compongono ciascun messaggio) e poi vengono inviati.
E' utilizzata la libreria MIDI e funzioni di callback.
La modifica dei messaggi (ovvero la trasposizione delle note) è azionata mediante un bottone.

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

dovrei costruire quindi un array dove memorizzare gli ultimi 5 messaggi di note on,
quando arriva un messaggio di note off dovrei cercare nell' array il corrispondente messaggio di note on (dei tre byte hanno il primo identico)
se non ne trovo nessuno, (perchè nel frattempo il note off è stato modificato dalla variabile transpose) applico l' inverso della variabile transpose e ripeto la ricerca
infine quando trovo il messaggio corrispondente lo rimuovo dalla lista e termino la ricerca..

Ho intuito che è necessario utilizzare array e che per rimuovere un messaggio dalla lista è sufficiente settare il suo valore a zero, ma al momento son fermo qui.

Vorrei capire:

come assegnare i messaggi di note on in ingresso all' array
come eseguire una ricerca
dove posizionare il codice,
insomma, qualcuno che mi dia le coordinate su cosa fare, o degli esempi...

Grazie anticipatamente,

Andrea

Code: [Select]

#include <MIDI.h>

int transposeTrigger = 0;

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
}

        transposeTrigger = digitalRead(InputTriggerTranspose);
        if (transpose == HIGH) {
          transpose = 7;}