Differenze tra le versioni di "Conversione del Tempo Delta fra due eventi Midi dai secondi nel valore esadecimale in formato "a lunghezza variabile""

Da Gambas-it.org - Wikipedia.
Riga 15: Riga 15:
  
 
Fatto ciò, si potrà passare all'ultima fase, ossia convertire il valore dei ''tick'' <SPAN Style="text-decoration:underline">reali</span> nel corrispondente valore in formato "''a lunghezza variabile''", in ''rappresentazione'' esadecimale e in ordine ''Big-Endian''.
 
Fatto ciò, si potrà passare all'ultima fase, ossia convertire il valore dei ''tick'' <SPAN Style="text-decoration:underline">reali</span> nel corrispondente valore in formato "''a lunghezza variabile''", in ''rappresentazione'' esadecimale e in ordine ''Big-Endian''.
 +
'''Public Sub Main()
 +
 
 +
  Dim tick_reali As Integer
 +
  Dim intero As Integer
 +
  Dim b, c As Byte
 +
  Dim lv As New Byte[]
 +
 
 +
  tick_reali = 151808
 +
 
 +
  lv.Push(tick_reali Mod 128)
 +
  intero = Fix(tick_reali / 128)
 +
 
 +
  While intero > 0
 +
    c = CByte(intero Mod 128)
 +
    lv.Push(c Or 128)
 +
    intero = Fix(intero / 128)
 +
  Wend
 +
 
 +
  lv.Reverse()
 +
 
 +
<FONT Color=gray>' ''Mostra il valore dei tick in formato "a lunghezza variabile" e in rappresentazione esadecomale:''</font>
 +
  For Each b In lv
 +
    Print Hex(b, 2);
 +
  Next
 +
 
 +
'''End'''
  
  
<FONT Color=red size=4><B>Pagina in costruzione !</b></font>
+
 
 +
 
 +
=Note=
 +
[1] Vedere anche la pagina: [[Conoscere_la_durata_in_secondi_del_Tempo_Delta_fra_due_Eventi_Midi|Conoscere la durata in secondi del Tempo Delta fra due Eventi Midi]]

Versione delle 10:36, 15 apr 2018

Il Tempo Delta, che divide un evento Midi dall'evento immediatamente precedente, viene espresso nel file Midi standard in formato a lunghezza variabile. Più specificatamente il Tempo Delta, così come contenuto nel file Midi standard, assume la rappresentazione esadecimale del valore espresso in tick preliminarmente convertito in formato a lunghezza variabile.

Il formato "a lunghezza variabile" rappresenta i numeri usando solo sette bit per byte, mentre il bit più significativo è impostato ad un valore tale da poterlo riconoscere. Se la rappresentazione contiene più byte per esprimere un numero, il bit più significativo dei primi byte sarà posto sempre ad 1, mentre quello dell'ultimo byte sarà sempre posto a 0. Tale impostazione sta ad indicare che, quando il bit più significativo è posto ad 1, tale byte non è l'ultimo della rappresentazione esadecimale, ma che dopo di esso v'è un altro byte. Se il bit più significativo è invece posto a 0, allora vuol dire che il byte, al quale quel bit appartiene, è l'ultimo della rappresentazione.


Di seguito verrà mostrato un algoritmo per ottenere di un Tempo Delta, espresso in secondi, la conversione da tale unità di misura in tick reali fra due eventi Midi e successivamente in tick in formato "a lunghezza variabile", in rappresentazione esadecimale e in ordine Big-Endian

Innanzitutto va detto che per passare dal valore temporale espresso in secondi al valore espresso in tick reali, bisognerà adottare questa formula:

(secondi * 1000000) / ((60000000 / bpm) / td) = tick_reali

Laddove:

  • secondi: è il valore temporale espresso in secondi che intercorre fra un Evento-Midi e quello immediatamente successivo;
  • bmp: è il tempo metronomico (battute per minuto);
  • td: è la risoluzione di clock per nota da 1/4 (PPQN), che nel file Midi è espressa in Big-Endian dal 13° e il 14* byte (gli ultimi due byte della traccia MThd.


Fatto ciò, si potrà passare all'ultima fase, ossia convertire il valore dei tick reali nel corrispondente valore in formato "a lunghezza variabile", in rappresentazione esadecimale e in ordine Big-Endian.

Public Sub Main()
 
 Dim tick_reali As Integer
 Dim intero As Integer
 Dim b, c As Byte
 Dim lv As New Byte[]
  
  tick_reali = 151808
  
  lv.Push(tick_reali Mod 128)
  intero = Fix(tick_reali / 128)
  
  While intero > 0
    c = CByte(intero Mod 128)
    lv.Push(c Or 128)
    intero = Fix(intero / 128)
  Wend
  
  lv.Reverse()
  
' Mostra il valore dei tick in formato "a lunghezza variabile" e in rappresentazione esadecomale:
  For Each b In lv
    Print Hex(b, 2);
  Next
  
End



Note

[1] Vedere anche la pagina: Conoscere la durata in secondi del Tempo Delta fra due Eventi Midi