|
|
(Una versione intermedia di uno stesso utente non è mostrata) |
Riga 1: |
Riga 1: |
− | 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).
| + | #REDIRECT [[ALSA_e_Gambas_-_Registrare_messaggi_Midi]] |
− | <BR>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.
| |
− | <P>Qui prenderemo in considerazione ovviamente la seconda soluzione.</p>
| |
− | | |
− | ===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''===
| |
− | 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)
| |
− |
| |
− | 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]) ''<Font Color= #006400>' bloccoTD è la variabile riempita dal valore del Tempo Delta''</font>
| |
− | Next
| |
− |
| |
− | ''<Font Color= #006400>' pulisce la variabile "s"''</font>
| |
− | For aaa = hhh To 0 Step -1
| |
− | s[aaa] = 0
| |
− | Next
| |
− |
| |
− | Inc jk
| |
− |
| |
− | '''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>
| |
− | | |
− | | |
− | ==Note==
| |
− | [1] Potremmo anche utilizzare:
| |
− | * il comando bash "''Date''":
| |
− | | |
− | sSec[1000000] As String
| |
− | sNan[1000000] As String
| |
− | aa[1000000] As Long
| |
− |
| |
− | '''Public''' Sub ......()
| |
− |
| |
− | ....... ''<Font Color= #006400>' qui le istruzioni per intercettare i dati Midi''</font>
| |
− |
| |
− | Shell "date +%s" To sSec[dd] ''<Font Color= #006400>' esprime i secondi dal 01.01.1970''</font>
| |
− | Shell "date +%N" To sNan[dd] ''<Font Color= #006400>' esprime i nanosecondi in un secondo''</font>
| |
− | 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''" <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:
| |
− | | |
− | 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 h As Integer ''<Font Color= #006400>' la variabile " h " conterrà la quantità di byte che costituiscono la rappresentazione esadecimale dei Midi ''tick''</font>
| |
− |
| |
− | '''Public''' Sub Button2_Click()
| |
− |
| |
− | Dim a, b, c, d, e As Integer
| |
− | Dim rob As Byte
| |
− |
| |
− | h = 0
| |
− |
| |
− | a = ...''<Font Color= #006400>' la variabile " a " raccoglie il valore reale decimale dei Midi ''tick'':</font>
| |
− |
| |
− | 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)
| |
− | ''<Font Color= #006400>' facciamo mostrare distintamente a scopo didattico ciascun valore della "rappresentazione" esadecimale del valore dei Midi ''tick'':</font>
| |
− | Print g[a]
| |
− | Next
| |
− |
| |
− | '''End'''
| |