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

Da Gambas-it.org - Wikipedia.
(Creare blocchi di dati)
Riga 5: Riga 5:
 
<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>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>
+
<P>L'esempio, che faremo per esporre l'argomento, prevede la ricezione di dati Midi provenienti da un dispositivo esterno, per esempio una tastiera, senza uso 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
 
  exStrum As File
Riga 14: Riga 14:
 
   
 
   
 
  f As Integer
 
  f As Integer
 +
bl As Integer
 +
ndt As Integer
 
   
 
   
 
   
 
   
Riga 47: Riga 49:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
 +
  Dim k, j As Integer
 +
   
 +
  For k = 0 To (d - 1) / 3
 
    
 
    
 +
  For j = 0 To 2
 +
    If bl > 0 Then    ''<Font Color= #006400>' bl rappresenta il numero di blocchi da 3 dati (1 messaggio Midi)''</font>
 +
      blocco.Add(bl)
 +
      blocco[bl] = blocco[bl] & Chr(a[ndt])
 +
      Else
 +
        blocco.Add(bl)
 +
        blocco[bl] = blocco[bl] & Chr(a[ndt])
 +
    Endif
 +
 +
    Inc ndt
 +
  Next
 +
 
 +
  Inc bl
 +
 +
Next
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
  
 
===Creare i valori per il ''Tempo Delta''===
 
===Creare i valori per il ''Tempo Delta''===

Versione delle 15:28, 13 dic 2011

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. 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.

L'esempio, che faremo per esporre l'argomento, prevede la ricezione di dati Midi provenienti da un dispositivo esterno, per esempio una tastiera, senza uso 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".

exStrum As File
d As Integer
a As New Byte[]
aa As New Float[]
dd As Integer

f As Integer
bl As Integer
ndt 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  ' Evita di raccogliere l'evento Midi: "Active Sensing"
 
  
a.Add(d)
a[d] = b

Inc d
  
' ricava anno, mese, giorno, ora:muniti:secondi.millisecondi di ciascun evento:
' serviranno per determinare il Tempo Delta di ciascuno di essi.
  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()

 Dim k, j As Integer
   
 For k = 0 To (d - 1) / 3
 
 For j = 0 To 2
   If bl > 0 Then    ' bl rappresenta il numero di blocchi da 3 dati (1 messaggio Midi)
     blocco.Add(bl)
     blocco[bl] = blocco[bl] & Chr(a[ndt])
      Else
       blocco.Add(bl)
       blocco[bl] = blocco[bl] & Chr(a[ndt])
   Endif

   Inc ndt
 Next
 
 Inc bl

Next

End


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 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 ' 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




< pagina in costruzione >