La gestione dei file audio mediante il componente gb.sdl2.audio
Le risorse della libreria SDL2 per la gestione dell'audio 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 .
Le Classi fondamentali e basilari del componente gb.sdl2.audio sono: Sound e Music, le quali combinate con le altre fornite dallo stesso componente consentono di gestire l'esecuzione dei file audio.
Indice
- 1 Gestione dei file audio mediante la sola Classe Sound
- 2 Gestione dei file audio mediante le Classi Sound e Channels
- 3 Gestione di un solo file audio mediante l'uso congiunto delle Classi Sound e Channel
- 4 Gestione dei file audio mediante la Classe Music
- 5 Errore "Module format not recognized" con un file .mp3
Gestione dei file audio mediante la sola Classe Sound
La classe Sound consente di eseguire un file audio (solo di tipo WAV, OGG ed AIFF).
In questo caso, per far eseguire un file sonoro, è necessario caricarlo in memoria assegnando il file audio ad una specifica variabile di tipo "Sound".
Mostriamo un semplice esempio in un'applicazione a riga di comando, nel quale viene eseguito un file di tipo wav:
Public Sub Main() Dim sn As Sound sn = Sound.Load("/percorso/del/file.wav") sn.Play End
Gestione dei file audio mediante le Classi Sound e Channels
La classe Sound congiuntamente con la Classe Channels consente di ascoltare contemporaneamente due o più (fino a 32) file sonori (solo di tipo WAV, OGG ed AIFF).
In questo caso, per far eseguire un file sonoro, è necessario caricarlo in memoria assegnando ad una specifica variabile di tipo "Sound" un singolo file sonoro.
Ogni file sarà fatto suonare in un canale, cosicché è possibile decidere mediante la classe "Channels" quanti canali saranno attivati per la riproduzione, e dunque quanti file, caricati in memoria nelle predette variabili, saranno eseguiti.
Innanzitutto bisognerà stabilire il numero di canali utilizzabili impostando la proprietà:
Channels.Count = numero canali utilizzabili (<=32)
La classe "Channels" ci consente, inoltre, di impostare il volume all'interno di una gamma tra 0 e 128.
Quindi per eseguire i file audio WAV ed AIFF, si potrà utilizzare o la Classe "Sound", oppure la Classe statica "Channels".
Nell'esempio che segue saranno eseguiti contemporaneamente due file WAV in un'applicazione in ambiente grafico. Si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file audio WAV, nonché variare manualmente il volume di ogni singolo canale di uscita:
Private sn1 As Sound Private sn2 As Sound Public Sub Form_Open() Dim sn1, sn2 As Sound ' Si stabilisce il numero di canali da utilizzare: Channels.Count = 2 ' Si imposta a piacere il volume audio di ciascun canale: Slider1.Value = 110 ValueBox1.Value = Slider1.Value Channels[0].Volume = Slider1.Value Slider2.Value = 40 ValueBox2.Value = Slider2.Value Channels[1].Volume = Slider2.Value ' Si carica per ciascun canale un file WAV: sn1 = Sound.Load("/percorso/del/primo/file.wav") sn2 = Sound.Load("/percorso/del/secondo/file.wav") ' Si eseguono contemporaneamente i file WAV dei due canali. ' Come abbiamo già detto, si possono adottare due modalità. ' Usando la Classe "Sound": sn1.Play() sn2.Play() ' Oppure usando la Classe statica Channels: ' Channels[0].Play(sn1) ' Channels[1].Play(sn2) End Public Sub ToggleButton1_Click() Select Case ToggleButton1.Value Case True Channels[0].Pause Case False Channels[0].Play End Select End Public Sub ToggleButton2_Click() Select Case ToggleButton2.Value Case True Channels[1].Pause Case False Channels[1].Play End Select End Public Sub Button1_Click() Channels[0].Stop End Public Sub Button2_Click() Channels[1].Stop End Public Sub Slider1_Change() Channels[0].Volume = Slider1.Value ValueBox1.Value = CStr(Slider1.Value) End Public Sub Slider2_Change() Channels[1].Volume = Slider2.Value ValueBox2.Value = CStr(Slider2.Value) End
Nell'esempio che segue saranno eseguiti contemporaneamente due file WAV in un'applicazione a riga di comando:
Public Sub Main() Dim sn1, sn2 As Sound ' Si stabilisce il numero di canali da utilizzare: Channels.Count = 2 ' Si imposta a piacere il volume audio di ciascun canale: Channels[0].Volume = 110 Channels[1].Volume = 80 ' Si carica per ciascun canale un file WAV: sn1 = Sound.Load("/percorso/del/primo/file.wav") sn2 = Sound.Load("/percorso/del/secondo/file.wav") ' Si eseguono contemporaneamente i file WAV dei due canali. ' Come abbiamo già detto, si possono adottare due modalità. ' Usando la Classe "Sound": sn1.Play() sn2.Play() ' Oppure usando la Classe statica Channels: ' Channels[0].Play(sn1) ' Channels[1].Play(sn2) End
Gestione di un solo file audio mediante l'uso congiunto delle Classi Sound e Channel
Se si deve far eseguire un solo file audio WAV o AIFF, si può utilizzare la Classe Channel unitamente alla già vista Classe Sound.
Mostriamo un semplice esempio in applicazione grafica, nel quale si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file audio WAV e variare il volume dell'audio:
Private cn As New Channel Public Sub Form_Open() With Slider1 .MaxValue = 128 .Value = 100 End With ValueBox1.Text = CStr(Slider1.Value) End Public Sub Button1_Click() Dim sn As Sound sn = Sound.Load("/percorso/del/file.wav") cn.Play(sn) End Public Sub ToggleButton1_Click() Select Case ToggleButton1.Value Case True cn.Pause Case False cn.Play End Select End Public Sub Button2_Click() cn.Stop End Public Sub Slider1_Change() cn.Volume = Slider1.Value ValueBox1.Value = CStr(Slider1.Value) End
In quest'altro esempio l'esecuzione avviene in un'applicazione a riga di comando:
Public Sub Main() Dim sn As Sound Dim cn As New Channel sn = Sound.Load("/percorso/del/file.wav") cn.Play(sn) End
Gestione dei file audio mediante la Classe Music
La Classe Music consente di eseguire i seguenti tipi di file audio: WAV, MP3, OGG, AIFF e MOD. Inoltre, consente di eseguire un solo file audio per volta.
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 audio WAV e variare il volume dell'audio con uno Slider:
Public Sub Form_Open() With Slider1 .MaxValue = 128 .Value = 100 End With ValueBox1.Text = CStr(Slider1.Value) End Public Sub Button1_Click() Music.Load("/percorso/del/file/audio") Music.Play End Public Sub ToggleButton1_Click() Select Case ToggleButton1.Value Case True Music.Pause Case False Music.Play End Select End Public Sub Button2_Click() Music.Stop End Public Sub Slider1_Change() Music.Volume = Slider1.Value ValueBox1.Value = CStr(Slider1.Value) End
Esempi di esecuzione con un'applicazione a riga di comando
In questo esempio il file audio viene eseguito con un'applicazione a riga di comando. Il codice consente di vedere continuamente anche il tempo trascorso dall'inizio dell'esecuzione del file audio.
Public Sub Main() Music.Load("/percorso/del/file/audio") Music.Play While Music.State = Music.Playing ' Mostra il tempo trascorso dall'inizio dell'esecuzione: Write #File.Out, CStr(Date(0, 0, 0, 0, 0, 0, Music.Pos * 1000)) & "\r" Wend Quit End
In questo secondo esempio di esecuzione di un file audio 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 audio. 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() Music.Load("/percorso/del/file/audio") Music.Play Do ' Una brevissima attesa consente di inviare i previsti caratteri/comandi allo standard Input: Wait 0.01 ' Mostra nello standard output il tempo trascorso dall'inizio dell'esecuzione: Write #File.Out, CStr(Date(0, 0, 0, 0, 0, 0, Music.Pos * 1000)) & "\r" Loop Until Music.State = Music.Stopped 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." Quit 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 si è visto, anche 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
Errore "Module format not recognized" con un file .mp3
Se, leggendo un file .mp3, viene sollevato l'errore: "Module format not recognized", è molto probabile che non sia riconosciuto il bit-rate o la frequenza di campionamento del file. Si dovrà, allora, modificare il bit-rate impostandolo a 32bit (o inferiore), oppure la frequenza di campionamento a 16 kHz o inferiore. Si possono fare varie prove, testando diversi rapporti bit/frequenza di campionamento fino a trovare quello che esegue il file .mp3 correttamente.