una otra vez con la... MIDI-mania
Este código permite obtener con sólo las funciones de gambas las siguientes informaciones de un archivo Midi:
- nombre;
- tamaño;
- tipo file Midi;
- Cantidad de pistas;
- Resolución PPQN;
- Tempo metronomico inicial.
Public Sub Main()
Dim file_midi As String = "/ruta/del/file.mid"
Dim fl As File
Dim bb As Byte[]
Dim i As Integer
Dim t As Short
fl = Open file_midi For Read
' Muestra el nombre del archivo Midi.:
Print "Nombre del archivo Midi: "; File.Name(file_midi)
' Verifica el tamaño del archivo Midi:
Print "Tamaño del archivo Midi: "; Lof(fl); " byte"
' Lee todo el archivo Midi y carga los datos en la variable vectorial:
With bb = New Byte[Lof(fl)]
.Read(fl)
End With
' Verifica que el archivo subido sea un archivo MIDI estándar.:
If bb.ToString(0, 4) <> "MThd" Then Error.Raise("El archivo subido no es un archivo Midi !")
' Verifica el tipo de archivo Midi:
Print "Tipo de archivo Midi: "; CStr(bb[9])
' Verifica la cantidad de pistas en el archivo Midi.:
Print "Numero de pistas: "; CStr(bb[11])
' Verifica la resolución PPQN del archivo Midi.:
Print "Resolución PPQN: "; legge_Byte(fl, 12, 2)
' Verifica el Tempo metronomico inicial del archivo Midi:
i = InStr(bb.ToString(0, Lof(fl)), Chr(&FF) & Chr(&51) & Chr(&03))
If i > 0 Then
t = 60000000 \ legge_Byte(fl, i + 2, 3)
Else
t = 120
Endif
Print "Tempo metronomico: "; t; " bpm"
fl.Close
End
Private Function legge_Byte(f As File, s As Short, q As Byte) As Integer
Dim ris As Integer
Dim b As Byte
Seek #f, s
Do
Read #f, b
ris = (ris * CInt(2 ^ 8)) Or b
Dec q
Loop Until q = 0
Return ris
End
Dim file_midi As String = "/ruta/del/file.mid"
Dim fl As File
Dim bb As Byte[]
Dim i As Integer
Dim t As Short
fl = Open file_midi For Read
' Muestra el nombre del archivo Midi.:
Print "Nombre del archivo Midi: "; File.Name(file_midi)
' Verifica el tamaño del archivo Midi:
Print "Tamaño del archivo Midi: "; Lof(fl); " byte"
' Lee todo el archivo Midi y carga los datos en la variable vectorial:
With bb = New Byte[Lof(fl)]
.Read(fl)
End With
' Verifica que el archivo subido sea un archivo MIDI estándar.:
If bb.ToString(0, 4) <> "MThd" Then Error.Raise("El archivo subido no es un archivo Midi !")
' Verifica el tipo de archivo Midi:
Print "Tipo de archivo Midi: "; CStr(bb[9])
' Verifica la cantidad de pistas en el archivo Midi.:
Print "Numero de pistas: "; CStr(bb[11])
' Verifica la resolución PPQN del archivo Midi.:
Print "Resolución PPQN: "; legge_Byte(fl, 12, 2)
' Verifica el Tempo metronomico inicial del archivo Midi:
i = InStr(bb.ToString(0, Lof(fl)), Chr(&FF) & Chr(&51) & Chr(&03))
If i > 0 Then
t = 60000000 \ legge_Byte(fl, i + 2, 3)
Else
t = 120
Endif
Print "Tempo metronomico: "; t; " bpm"
fl.Close
End
Private Function legge_Byte(f As File, s As Short, q As Byte) As Integer
Dim ris As Integer
Dim b As Byte
Seek #f, s
Do
Read #f, b
ris = (ris * CInt(2 ^ 8)) Or b
Dec q
Loop Until q = 0
Return ris
End