Differenze tra le versioni di "Alsa e Gambas: Registrare messaggi Midi"
(→Ricezione e memorizzazione dei dati Midi) |
|||
Riga 3: | Riga 3: | ||
* attraverso l'utilizzazione di un altro specifico applicativo in C di supporto, come ad esempio ''arecordmidi'', diciamo in modalità ''demone''; | * attraverso l'utilizzazione di un altro specifico applicativo in C di supporto, come ad esempio ''arecordmidi'', diciamo in modalità ''demone''; | ||
* oppure mediante la realizzazione in Gambas di apposito algoritmo, come parte del nostro applicativo appositamente dedicata o come applicativo a se stante. | * oppure mediante la realizzazione in Gambas di apposito algoritmo, come parte del nostro applicativo appositamente dedicata o come applicativo a se stante. | ||
− | <P>Qui prenderemo in considerazione ovviamente la seconda soluzione | + | <P>Qui prenderemo in considerazione ovviamente la seconda soluzione.</p> |
===Ricezione e memorizzazione dei dati Midi=== | ===Ricezione e memorizzazione dei dati Midi=== | ||
− | + | Di seguito eviteremo di esporre codice esemplificativo, ritenendo che ciascun programmatore possa e debba scegliere le soluzioni algoritmiche che riterrà più opportune e migliori. Riporteremo con proposte di codice soltanto le parti più delicate anche a fini esplicativi di concetti più complessi. | |
− | + | Sottolineeremo soltanto che nella fase di registrazione dei dati bisognerà individuare, (mediante il ''Timer'', oppure prendendo il tempo dell'orologio interno con la funzione ''Time(Now) |[[#Note|1]]|) il tempo che distanzia il primo evento da un tempo iniziale assoluto, nonché i tempi che distanziano ciascun Messaggio Midi dal precedente. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===Creare i valori per il ''Tempo Delta''=== | ===Creare i valori per il ''Tempo Delta''=== | ||
− | Come abbiamo già avuto modo di vedere nella pagina "[[Alsa_e_Gambas:_Ricevere_dati_da_smf#Il_Tempo_Delta_come_dato_a_lunghezza_variabile|''Ricevere dati da uno Standard Midi File'']]", il ''Tempo Delta'' con valore superiore a 127 viene definito non con il suo valore reale, bensì con una sua ''rappresentazione''. Pertanto, nel file Midi non avremo i valori reali dei Midi ''tick'' superiori al valore 127, tenuto conto della ''risoluzione'' per nota da 1/4 del Tempo Delta presente nell'Header Chunk, bensì una loro ''rappresentazione'' esadecimale. | + | Come abbiamo già avuto modo di vedere nella pagina "[[Alsa_e_Gambas:_Ricevere_dati_da_smf#Il_Tempo_Delta_come_dato_a_lunghezza_variabile|''Ricevere dati da uno Standard Midi File'']]", il ''Tempo Delta'' con valore superiore a 127 viene definito non con il suo valore reale, bensì con una sua ''rappresentazione''. Pertanto, nel file Midi non avremo i valori reali dei Midi ''tick'' superiori al valore 127, tenuto conto della ''risoluzione'' per nota da 1/4 del Tempo Delta presente nell'Header Chunk, bensì una loro ''rappresentazione'' esadecimale. |[[#Note|2]]| |
Public Sub rappr(deTick As Integer) | Public Sub rappr(deTick As Integer) | ||
Riga 163: | Riga 52: | ||
'''End''' | '''End''' | ||
− | + | <P>Ora siamo, dunque, pronti per la parte del codice che raggrupperà le istruzioni per la realizzazione dell'ultima fase: la costruzione del file standard Midi ''.mid'', che esporremo nel seguente capitolo: "[[Alsa_e_Gambas:_Salvataggio_dei_dati|''Salvataggio dei dati Midi'']]", ed al quale rimandiamo.</p> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <P>Ora siamo, dunque, pronti per | ||
Riga 278: | Riga 73: | ||
'''End''' | '''End''' | ||
− | + | [2] Dunque, prima ancora di poter scrivere, ossia di salvare, un file Midi dovremo - fra l'altro - individuare l'algoritmo per trasformare i valori decimali "''reali''" <SPAN style="text-decoration:underline">superiori a 127</span> del Tempo Delta (ossia del numero dei Midi ''tick'', tenuto conto - ripetiamo - della ''risoluzione'' per nota da 1/4 presente nell'Header Chunk) nella loro ''rappresentazione'' esadecimale: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | [2 | ||
− | |||
− | |||
Public g[4] As Byte ''<Font Color= #006400>' la variabile " g " è un array che conterrà i valori esadecimali costituenti la rappresentazione esadecimale dei Midi ''tick''</font> | Public g[4] As Byte ''<Font Color= #006400>' la variabile " g " è un array che conterrà i valori esadecimali costituenti la rappresentazione esadecimale dei Midi ''tick''</font> |
Versione delle 17:08, 16 lug 2012
In questa pagina tratteremo del caso in cui vengono ricevuti in entrata dati Midi e memorizzati, al fine di creare al termine un file Midi (.mid).
Possiamo pensare di effettuare la registrazione dei dati Midi in entrata:
- attraverso l'utilizzazione di un altro specifico applicativo in C di supporto, come ad esempio arecordmidi, diciamo in modalità demone;
- oppure mediante la realizzazione in Gambas di apposito algoritmo, come parte del nostro applicativo appositamente dedicata o come applicativo a se stante.
Qui prenderemo in considerazione ovviamente la seconda soluzione.
Ricezione e memorizzazione dei dati Midi
Di seguito eviteremo di esporre codice esemplificativo, ritenendo che ciascun programmatore possa e debba scegliere le soluzioni algoritmiche che riterrà più opportune e migliori. Riporteremo con proposte di codice soltanto le parti più delicate anche a fini esplicativi di concetti più complessi. Sottolineeremo soltanto che nella fase di registrazione dei dati bisognerà individuare, (mediante il Timer, oppure prendendo il tempo dell'orologio interno con la funzione Time(Now) |1|) il tempo che distanzia il primo evento da un tempo iniziale assoluto, nonché i tempi che distanziano ciascun Messaggio Midi dal precedente.
Creare i valori per il Tempo Delta
Come abbiamo già avuto modo di vedere nella pagina "Ricevere dati da uno Standard Midi File", il Tempo Delta con valore superiore a 127 viene definito non con il suo valore reale, bensì con una sua rappresentazione. Pertanto, nel file Midi non avremo i valori reali dei Midi tick superiori al valore 127, tenuto conto della risoluzione per nota da 1/4 del Tempo Delta presente nell'Header Chunk, bensì una loro rappresentazione esadecimale. |2|
Public Sub rappr(deTick As Integer) Dim dT As Integer Dim aaa, bbb, ddd, eee, hhh As Integer Dim fff As Byte dT = deTick bbb = dT Mod 128 ddd = CInt(dT / 128) ggg[hhh] = bbb While ddd > 0 eee = ddd Mod 128 fff = eee Or 128 ddd = CInt(ddd / 128) Inc hhh ggg[hhh] = fff Wend For aaa = hhh To 0 Step -1 Inc tdk s[aaa] = ggg[aaa] bloccoTD[jk] = bloccoTD[jk] & Chr(s[aaa]) ' bloccoTD è la variabile riempita dal valore del Tempo Delta Next ' pulisce la variabile "s" For aaa = hhh To 0 Step -1 s[aaa] = 0 Next Inc jk End
Ora siamo, dunque, pronti per la parte del codice che raggrupperà le istruzioni per la realizzazione dell'ultima fase: la costruzione del file standard Midi .mid, che esporremo nel seguente capitolo: "Salvataggio dei dati Midi", ed al quale rimandiamo.
Note
[1] Potremmo anche utilizzare:
- il comando bash "Date":
sSec[1000000] As String sNan[1000000] As String aa[1000000] As Long Public Sub ......() ....... ' qui le istruzioni per intercettare i dati Midi Shell "date +%s" To sSec[dd] ' esprime i secondi dal 01.01.1970 Shell "date +%N" To sNan[dd] ' esprime i nanosecondi in un secondo Inc dd End
[2] Dunque, prima ancora di poter scrivere, ossia di salvare, un file Midi dovremo - fra l'altro - individuare l'algoritmo per trasformare i valori decimali "reali" superiori a 127 del Tempo Delta (ossia del numero dei Midi tick, tenuto conto - ripetiamo - della risoluzione per nota da 1/4 presente nell'Header Chunk) nella loro rappresentazione esadecimale:
Public g[4] As Byte ' la variabile " g " è un array che conterrà i valori esadecimali costituenti la rappresentazione esadecimale dei Midi tick Public h As Integer ' la variabile " h " conterrà la quantità di byte che costituiscono la rappresentazione esadecimale dei Midi tick Public Sub Button2_Click() Dim a, b, c, d, e As Integer Dim rob As Byte h = 0 a = ...' la variabile " a " raccoglie il valore reale decimale dei Midi tick: b = a Mod 128 d = CInt(a / 128) g[h] = b While d > 0 e = d Mod 128 rob = e Or 128 d = CInt(d / 128) Inc h g[h] = rob Wend For a = h To 0 Step -1 g[a] = Hex$(g[a], 2) ' facciamo mostrare distintamente a scopo didattico ciascun valore della "rappresentazione" esadecimale del valore dei Midi tick: Print g[a] Next End