Noteon e noteoff... protocollo midi

  • ottavanota
  • Membro: Expert
  • Risp: 945
  • Loc: Firenze
  • Thanks: 39  

30-07-10 15.21

Sapete che differenza c'e' fra un Midi Message di Note Off e un messaggio Midi di Note On con velocity=0 ? In mio piano Thecnics non invia in classico Note Off ma Note On Vel=0!. E' normale?
(mi sto' facendo un controllino MIDI da solo e ho notato questa anomalia, in verita' la tabella midi allegata allo strumento mi dice proprio quello che vedo, cioe' non viene inviato alcun messagio di Note Off... ma funzionano tutti cosi' gli strumenti MIDI?... o dipende dal protocollo implementato dalla casa costruttrice del dispositivo?)
Edited 30 Lug. 2010 13:56
  • michelet
  • Membro: Staff
  • Risp: 16771
  • Loc: Venezia
  • Thanks: 2377  

30-07-10 17.44

Così su due piedi inviare un valore di nota ON con valore uguale a zero potrebbe non aver alcun risvolto negativo, se non per il fatto di ripercuotersi sulla polifonia totale dello strumento.

Infatti, a livello teorico, per il processore che gestisce la polifonia 64 note on a velocity uguale a zero equivalgono a 64 note on a velocity diverse.
Per assurdo, saturando la polifonia con note dalla velocità pari a zero andresti a "tagliare" anche le note con un valore di velocity diverso da zero.
In altre parole, se la polifonia massima del tuo pianoforte è 64 note e tu fai suonare al sequencer un accordo di semibreve, composto da 64 note con velocity uguale a zero, non riusciresti a suonare altre note di velocity diversa fino a che non si è esaurito il valore della semibreve... emo

Penso che ogni produttore agisca diversamente dagli altri, Technics ad esempio non utiilizza il Note off.

Nell'uso quotidiano se questo non ti ha creato problemi, non dovresti preoccupartene.
Diversamente se dovessi pilotare strumenti che richiedono la presenza dell'evento di Note off, allora questo potrebbe rappresentare un problema dal momento che l'expander farebbe suonare la nota a volume zero.
  • ottavanota
  • Membro: Expert
  • Risp: 945
  • Loc: Firenze
  • Thanks: 39  

02-08-10 17.04

@ michelet
Così su due piedi inviare un valore di nota ON con valore uguale a zero potrebbe non aver alcun risvolto negativo, se non per il fatto di ripercuotersi sulla polifonia totale dello strumento.

Infatti, a livello teorico, per il processore che gestisce la polifonia 64 note on a velocity uguale a zero equivalgono a 64 note on a velocity diverse.
Per assurdo, saturando la polifonia con note dalla velocità pari a zero andresti a "tagliare" anche le note con un valore di velocity diverso da zero.
In altre parole, se la polifonia massima del tuo pianoforte è 64 note e tu fai suonare al sequencer un accordo di semibreve, composto da 64 note con velocity uguale a zero, non riusciresti a suonare altre note di velocity diversa fino a che non si è esaurito il valore della semibreve... emo

Penso che ogni produttore agisca diversamente dagli altri, Technics ad esempio non utiilizza il Note off.

Nell'uso quotidiano se questo non ti ha creato problemi, non dovresti preoccupartene.
Diversamente se dovessi pilotare strumenti che richiedono la presenza dell'evento di Note off, allora questo potrebbe rappresentare un problema dal momento che l'expander farebbe suonare la nota a volume zero.
Il problema e' che se devo implementare del codice devo prevedere questa possibilita' di gestire anche Note On con velocita'=0, che genera un equivalente NOte Off! Io credevo che tutti i pianoforti/tastiere/master spedissero un Note Off... invece mi devo ricredere! ...quindi tutto lavoro in piu' per me... anzi per il mio controllino!
  • ziokiller
  • Membro: Supporter
  • Risp: 9397
  • Loc: Treviso
  • Thanks: 1252  

02-08-10 17.11

Non so qual'è il motivo, ma all'inizio del MIDI, diciamo prima del General Midi, molte tastiere non riconoscevano il NOTE OFF, quindi era consuetudine inviare il NOTE ON con velocity = 0. Tutti i moduli sonori, dunque, riconoscono entrambi i messaggi, sia il NOTE OFF (0x80) che il NOTE ON (0x90) con velocity = 0. La polifonia non viene per niente coinvolta in questa storia.

Il set di dati resta sempre quello, sono comunque tre byte per ogni evento.

  • ziokiller
  • Membro: Supporter
  • Risp: 9397
  • Loc: Treviso
  • Thanks: 1252  

02-08-10 17.14

Giusto per darti un esempio in codice, così è come gestisco io i messaggi di NOTE ON e OFF:

[pre]
switch (midiStatus)
{
case MIDI_STATUS_NOTEON:
if (bVelocity > 0) OnNoteOn(bChannel, bNote, bVelocity);
else OnNoteOff(bChannel, bNote, bVelocity);
break;

case MIDI_STATUS_NOTEOFF:
OnNoteOff(bChannel, bNote, bVelocity);
break;
}
[/pre]


  • ottavanota
  • Membro: Expert
  • Risp: 945
  • Loc: Firenze
  • Thanks: 39  

02-08-10 17.16

@ ziokiller
Non so qual'è il motivo, ma all'inizio del MIDI, diciamo prima del General Midi, molte tastiere non riconoscevano il NOTE OFF, quindi era consuetudine inviare il NOTE ON con velocity = 0. Tutti i moduli sonori, dunque, riconoscono entrambi i messaggi, sia il NOTE OFF (0x80) che il NOTE ON (0x90) con velocity = 0. La polifonia non viene per niente coinvolta in questa storia.

Il set di dati resta sempre quello, sono comunque tre byte per ogni evento.

Infatti... forse e' piu' semplice implementare del codice/ firmware per inviare sempre e soli 3 byte ! (infondo u pino elettronico senza pitch bender, after toch e modulation dovra sempre e solo inviare dei semplici Note On. Pero' capisci che mi complica un po' la vita! Devo implementare una sorta di if else in cui prevedere anche il Nota On V=0!
Edited 2 Ago. 2010 15:16
  • ottavanota
  • Membro: Expert
  • Risp: 945
  • Loc: Firenze
  • Thanks: 39  

02-08-10 17.18

@ ziokiller
Giusto per darti un esempio in codice, così è come gestisco io i messaggi di NOTE ON e OFF:

[pre]
switch (midiStatus)
{
case MIDI_STATUS_NOTEON:
if (bVelocity > 0) OnNoteOn(bChannel, bNote, bVelocity);
else OnNoteOff(bChannel, bNote, bVelocity);
break;

case MIDI_STATUS_NOTEOFF:
OnNoteOff(bChannel, bNote, bVelocity);
break;
}
[/pre]


Beh un super THANKS per l'idea dell'uso dello SWITCH! Il "C" non e' mai stato il mio forte... ma con questi controllini e' d'obbligo!
Grande emo
Sapro' a chi chiere la proxima volta! emo
Edited 2 Ago. 2010 15:19
  • ziokiller
  • Membro: Supporter
  • Risp: 9397
  • Loc: Treviso
  • Thanks: 1252  

02-08-10 17.57

Ma non ho capito ancora cosa devi fare... Il codice che ti ho postato io è relativo allo strumento che riceve il MIDI e deve interpretarlo, ossia il modulo sonoro (nel mio caso, come avrai potuto immaginare, si tratta di uno strumento virtuale).

Se invece devi implementare un controller che deve inviare messaggi di nota in base alla pressione dei tasti, devi inviare il NOTE ON (0x90) sia alla pressione che al rilascio del tasto, lascia perdere il NOTE OFF, non lo usa nessuno.

Quindi, se per esempio devi inviare il NOTE ON per il DO centrale (nota n. 60) con una velocity di 127 sul canale 1, il comando sarà:

90 3C 7F

E per il relativo Note OFF dovrai inviare:

90 3C 00

Quest'è emo

  • ottavanota
  • Membro: Expert
  • Risp: 945
  • Loc: Firenze
  • Thanks: 39  

02-08-10 18.32

@ ziokiller
Ma non ho capito ancora cosa devi fare... Il codice che ti ho postato io è relativo allo strumento che riceve il MIDI e deve interpretarlo, ossia il modulo sonoro (nel mio caso, come avrai potuto immaginare, si tratta di uno strumento virtuale).

Se invece devi implementare un controller che deve inviare messaggi di nota in base alla pressione dei tasti, devi inviare il NOTE ON (0x90) sia alla pressione che al rilascio del tasto, lascia perdere il NOTE OFF, non lo usa nessuno.

Quindi, se per esempio devi inviare il NOTE ON per il DO centrale (nota n. 60) con una velocity di 127 sul canale 1, il comando sarà:

90 3C 7F

E per il relativo Note OFF dovrai inviare:

90 3C 00

Quest'è emo

Io devo interpretare il codice di Note ON e Note Off (Note On v=0) e fare delle cose.... quindi quello che mi hai suggerito e' piu' che utile... quando parlo di controller intendo l'ATMEL (capisci a me! emo) che ho saldato sulla mia schedina emo! Non devo inviare... ma ricevere... interpretare!
Sorry x il fraintendimento!
Edited 2 Ago. 2010 16:33