non riesco ad andare oltre per ora. posto quello a cui sono arrivato:
Ogni segnale midi è composto di 3 parti principali: il primo valore individua il tipo di messaggio midi inviato, e il canale midi sul quale è inviato, il secondo valore è il numero della nota o del parametro midiCC, ed il terzo valore è la velocity della nota o il valore del parametro midiCC.
il messaggio midi però è comunque un numero unico, per mettere insieme questi 3 valori il procedimento è il seguente:
primo valore = Canale Midi (1-16) + un valore corrispondente al tipo di messaggio da inviare: NoteOff 127; NoteOn 143; "PolyAT" 159; "CC" 175; "PChange" 191; "ChanAT" 207; "Wheel" 223. (sinceramente non so cosa significhi PolyAt e ChanAt, ma dovrebbero fare qualcosa

)
Esempio: se voglio mandare un segnale di Nota on sul canale 1, il primo valore è 143+1=144; NoteOff sul canale 3= 127+3=130, ecc
secondo valore = numero della nota o del parametro CC: questo è molto semplice per ora, per esempio il do centrale è 60, i vari controlli midi hanno il loro valore.
terzo valore = velocity o nuovo valore di un CC: anche qua è semplice, l'unica precisazione è che a seconda del dispositivo midi (penso dipenda dalle diverse implemetazioni dei produttori, ma sarebbe da verificare con più prodotti) i valori possono variare da 0 a 127, oppure da 1 a 128. questo vale anche per i comandi che hanno valore solo ON e OFF (come damper, cambio preset, ecc) che possono assumere 1/128 oppure 0/127.
Creare un pacchetto midi da inviare in OutputMessaggio Midi = Primo valore +
BitShift(Secondo valore, -8) +
BitShift(Terzo valore, -16)
spieghiamo questi BitShift: l'operazione di Bitshifting è uno spostamento dei bit nel codice binario, per esempio se ho 0 1 1 0 0 1 1 1 e faccio BitShifting a destra di 2, ottengo 0 0 0 1 1 0 0 1.
Questa operazione è espressa nei vari linguaggi di programmazione in vari modi ("BitShift", "&", o altri operatori).
Nel nostro caso è rappresentata così: BitShift(Valore da modificare, spostamento verso destra)
A noi interessa un BitShift di 8 posti verso sinistra, quindi -8 (il segno meno, come si può intuire, inverte lo spostamento)
Vorrei far notare che questa è di fatto un'operazione matematica, che può essere effettuata anche in base decimale, ma lavorando sui calcolatori è infinitamente più facile in questo modo.
facciamo qualche esempio:
NotaON, Channel1, Do centrale, velocity 100 = (143+1)+BitShift(60, -8)+BitShift(100, -16) = 6569104
NotaOFF, channel 5, La, velocity 75 = (127+5)+BitShift(69, -8)+BitShift(75, -16) = 4932996
CC, channel 3, CC#4(foot pedal), valore 127 = 175+3+BitShift(4, -8)+BitShift(127, -16) = 8324274
Decifrare i segnali in InputNaturalmente considerando l'input valori e logica sono gli stessi, ed è da applicare lo stesso procedimento matematico, ma al contrario(qua però c'è da fare una precisazione... leggendo in giro e procedendo un po per tentativi ho trovato un metodo che funziona, ma certi passaggi non li so giustificare nemmeno io):
ho appena ottenuto un MidiMsg:
valore1 = BitAND(MidiMsg, 255) questo è il primo valore sommato al canale midi (basta sottrargli il canale midi che troverò grazie ad esso nel prossimo passaggio per ottenere i valori specifici caratteristici)
channel = BitAND(valore1, 15) + 1 questo è il numero di canale midi nel quale il messaggio è inviato
valore2 = BitAND(BitShift(MidiMsg, 8), 255) questo è il numero della nota o del comando CC
valore3 = BitAND(BitShift(MidiMsg, 16), 255)questo è la velocity o il valore del comando CC
l'operazione di BitAND è un'operatore logico di "E" applicato su ogni bit, cioè il bit dà 1 se nei due valori in input era 1, altrimenti dà 0. questo è quello che non riesco a capire... ma, diciamocelo,
Basta che funzioniP.S., so che queste informazioni da sole sono relativamente inutili, in un prossimo post spiegherò come inviare un messaggio in output da un pc, e purtroppo con l'imput sono fermo, non essendo pratico di CallBacks in informatica, nè di C++, e fino all'altro ieri non sapevo nemmeno quello che ho appena spiegato
