Differenze tra le versioni di "Alsa e Gambas: Registrare messaggi Midi"

Da Gambas-it.org - Wikipedia.
 
(62 versioni intermedie di uno stesso utente non sono mostrate)
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. Per ottenenre il risultato finale, come per ogni altro caso, si potrà seguire il percorso che si preferisce ed utilizzare, dunque, le funzioni e le istruzioni ritenute più opportune. Appresso proponiamo una soluzione fra le molte possibili, sottolineando e ponendo in rilievo soprattutto i passaggi più importanti da considerare particolarmente.</p>
 
 
 
<P>Supporremmo di avere un programma capace di riceve dati da un dispositivo esterno, per esempio una tastiera, senza servirsi delle funzioni esterne di ALSA, bensì mediante l'intercettazione dei dati del dispositivo dal ''file device'' presente, come già abbiamo avuto modo di imparare in altro capitolo, nel percorso: ''"/dev/snd/midiC2D0"''.</p>
 
 
 
exStrum As File
 
d As Integer
 
a As New Byte[]
 
aa As New Float[]
 
dd As Integer
 
 
f As Integer
 
 
 
'''Public''' Sub Form_Open()
 
  exStrum = Open "/dev/snd/midiC2D0" For Read Watch
 
'''End'''
 
 
'''Public''' Sub File_Read()
 
 
Dim b As Byte
 
 
  Read #exStrum, b
 
  If b = 254 Then Return  ''<Font Color= #006400>' Evita di raccogliere l'evento Midi: "Active Sensing"''</font>
 
 
 
 
 
a.Add(d)
 
a[d] = b
 
 
Inc d
 
 
 
''<Font Color= #006400>' ricava anno, mese, giorno, ora:muniti:secondi.millisecondi di ciascun evento:''</font>
 
''<Font Color= #006400>' serviranno per determinare il Tempo Delta di ciascuno di essi.''</font>
 
  aa.Add(dd)
 
  aa[dd] = Now 
 
  Inc dd
 
 
 
'''End'''
 
 
 
 
 
===Creare blocchi di dati===
 
Una volta ricevuti tutti i dati dalla tastiera Midi esterna, con un tasto procederemo a calcolare innanzitutto quanti dati sono stati ricevuti, successivamente creeremo dei blocch contenenti 3 dati Midi. Tali blocchi rappresentano ciascuno un Messaggio Midi (NoteOn oppure NoteOFF).
 
 
 
'''Public''' Sub Button1_Click()
 
 
 
 
 
'''End'''
 
 
 
===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'' viene definito non con i suoi valori reali, bensì con una ''rappresentazione'' di tali valori. Pertanto, nel file Midi non avremo i valori reali dei Midi ''tick'', tenuto conto della ''risoluzione'' per nota da 1/4 del Tempo Delta presente nell'Header Chunk, bensì una loro ''rappresentazione'' esadecimale.
 
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''" 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'''
 
 
 
 
 
 
 
 
 
 
 
 
 
'''<Font Color= #FF0000>< pagina in costruzione >'''
 

Versione attuale delle 17:44, 12 gen 2022