Eseguire un file MIDI mediante il componente gb.sdl2.audio
Le risorse della libreria SDL2 per la gestione dell'audio e del Midi sono state implementate in Gambas attraverso il nuovo componente gb.sdl2.audio.
Va sottolineato che il Componente gb.sdl2.audio può essere attivato anche indipendentemente dal Componente gb.sdl2 .
Il Componente fornisce per l'esecuzione dei file Midi la Classe "Music ".
E' possibile eseguire un solo file Midi per volta.
Volendo, è possibile anche scegliere mediante la Proprietà "Music.SoundFontPath" il percorso del file banco dei suoni (soundfont bank) di formato .SF2 per la riproduzione dei suoni con il Midi.
Esempio di esecuzione con un'applicazione in ambiente grafico
Mostriamo un semplice esempio in applicazione grafica, nel quale si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file Midi e modificare il volume sonoro con uno Slider :
Public Sub Form_Open()
' E' possibile caricare un file banco dei suoni ".sf2" a piacere:
Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2"
With Slider1
.MaxValue = Sound.MaxVolume
.Value = 100
End With
With ValueBox1
.Alignment = Align.Right
.Value = Slider1.Value
End With
ToggleButton1.Text = "Esegui"
ToggleButton2.Enabled = False
End
Public Sub ToggleButton1_Click()
If ToggleButton2.Value = True Then Return
Select Case ToggleButton1.Value
Case True
With Music
.Load("/percorso/del/file.mid")
.Play
End With
ToggleButton1.Text = "Stop"
With ToggleButton2
.Enabled = True
.Text = "Pausa"
End With
Repeat
Wait 0.01
Me.Title = Str(Time(0, 0, 0, Music.Pos * 1000))
Until Music.State == Music.Stopped
Esecuzione()
Case False
Esecuzione()
End Select
End
Private Procedure Esecuzione()
Music.Stop
ToggleButton1.Text = "Esegui"
ToggleButton1.Value = False
With ToggleButton2
.Value = False
.Enabled = False
.Text = Null
End With
End
Public Sub ToggleButton2_Click()
Select Case ToggleButton2.Value
Case True
Music.Pause
ToggleButton1.Text = Null
ToggleButton1.Enabled = False
ToggleButton2.Text = "Riprendi"
Case False
Music.Play
ToggleButton1.Text = "Stop"
ToggleButton1.Enabled = True
ToggleButton2.Text = "Pausa"
End Select
End
Public Sub Slider1_Change()
Music.Volume = Slider1.Value
ValueBox1.Value = Slider1.Value
End
Esempio di esecuzione con un'applicazione a riga di comando
In quest'altro esempio viene eseguito un file Midi con un'applicazione a riga di comando. Il codice consente di vedere continuamente anche il tempo trascorso dall'inizio dell'esecuzione del file Midi:
Public Sub Main() Dim mid As String mid ="/percorso/del/file.mid" ' Possiamo scegliere il file del banco di suoni ".sf2" che vogliamo utilizzare: Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2" Music.Load(mid) Music.Play While Music.State == Music.Playing ' Mostra il tempo trascorso dall'inizio dell'esecuzione: Write Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, Music.Pos * 1000)) Wait 0.01 Wend Music.Stop End
In questo secondo esempio di esecuzione di un file Midi con un'applicazione a riga di comando si potrà interagire con essa inviando tramite console/Terminale istruzioni con la tastiera per fermare l'esecuzione, metterla in pausa e riprenderla, aumentare ed abbassare il volume audio, nonché vedere il tempo trascorso in quel momento dall'inizio dell'esecuzione del file Midi. Per interagire con la tastiera si premerà il tasto previsto per l'azione desiderata, scrivendo così il carattere in basso nella console o nel Terminale (se l'applicazione è stata lanciata da Terminale), e si premerà sul tasto "Invio".
Public Sub Main()
Dim mid As String
mid ="/percorso/del/file.mid"
' Possiamo scegliere il file del banco di suoni ".sf2" che vogliamo utilizzare:
Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2"
Music.Load(mid)
Music.Play
Repeat
' Mostra nello standard output il tempo trascorso dall'inizio dell'esecuzione:
Write "\r" & Str(Time(0, 0, 0, Music.Pos * 1000))
' Una brevissima attesa consente di inviare i previsti caratteri/comandi allo standard Input:
Wait 0.01
Until Music.State == Music.Stopped
Music.Stop
' Usando l'Evento "Application_Read()", per terminare il programma è necessario l'uso dell'istruzione "Quit"
Quit
End
Public Sub Application_Read()
Dim s As String
Line Input #File.In, s
Select Case s
Case "s"
Music.Stop
Print "Esecuzione fermata."
Case "p"
Music.Pause
Print "Pausa......."
Case "r"
Music.Play
Print "....continua"
Case "+"
Music.Volume += 1
Print Music.Volume
Case "-"
Music.Volume -= 1
Print Music.Volume
End Select
End
Modificare il volume
Come già visto, la Classe Music fornisce la proprietà .Volume per modificare appunto il volume audio dell'esecuzione. L'ambito dei valori possibili va da 0 a 128.
Esempio:
Music.Volume = 110