Differenze tra le versioni di "La gestione dei file audio mediante il componente gb.sdl2.audio"
(56 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Le risorse della libreria ''SDL2'' per la gestione dell'audio sono state | + | Le risorse della libreria ''SDL2'' per la gestione dell'audio sono state implementate in Gambas attraverso il Componente ''gb.sdl2.audio'', il quale 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 | + | Le Classi fondamentali e basilari del componente ''gb.sdl2.audio'' sono: ''Sound'', ''Channels'', ''Channel'' e ''Music'', le quali opportunamente combinate consentono di gestire l'esecuzione dei file audio supportati. |
+ | =Gestione dei file audio mediante la sola Classe ''Sound''= | ||
+ | La classe '''''Sound''''' consente di eseguire un file audio (<SPAN style="text-decoration:underline">solo di tipo AIFF, FLAC, MP3, OGG e WAV</span>). | ||
+ | In questo caso, per eseguire un file sonoro, è ''necessario'' caricarlo in memoria mediante il Metodo ".Load()" della Classe ''Sound''. Detto Metodo restituirà un Oggetto (istanza) della Classe ''Sound'' che sarà assegnato e gestito mediante apposita variabile del medesimo tipo. | ||
− | ==Gestione dei file audio mediante le Classi ''Sound'' e ''Channels'' | + | Mostriamo un semplice esempio in un'applicazione ''a riga di comando'', nel quale viene eseguito un file audio: |
− | La classe '''''Sound''''' consente di ascoltare <SPAN style="text-decoration:underline">contemporaneamente</span> due o più (fino a 32) file sonori (<SPAN style="text-decoration:underline">solo di tipo | + | Public Sub Main() |
+ | |||
+ | Dim sn As Sound | ||
+ | |||
+ | sn = Sound.Load("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | ||
+ | |||
+ | sn.Play | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | =Gestione di un solo file audio mediante l'uso congiunto delle Classi ''Sound'' e ''Channel''= | ||
+ | Se si deve far eseguire <SPAN Style="text-decoration:underline">un solo</span> file audio AIFF, FLAC, MP3, OGG e WAV, 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 e variare il volume dell'audio. | ||
+ | <BR>Inoltre al termine dell'esecuzione del file audio verrà sollevato l'Evento "_Finish()" della Classe ''Channel''. | ||
+ | Private <FONT Color=#B22222>cn</font> As New Channel As "Canale" | ||
+ | |||
+ | |||
+ | Public Sub Form_Open() | ||
+ | |||
+ | With Slider1 | ||
+ | .MaxValue = Sound.MaxVolume | ||
+ | .Value = 100 | ||
+ | End With | ||
+ | |||
+ | Me.Text = CStr(Slider1.Value) | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
+ | If ToggleButton1.Value Then | ||
+ | Dim <FONT Color=blue>sn</font> As Sound | ||
+ | Me.Text = CStr(Slider1.Value) | ||
+ | <FONT Color=blue>sn</font> = Sound.Load("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | ||
+ | <FONT Color=#B22222>cn</font>.Play(<FONT Color=blu>sn</font>) | ||
+ | Else | ||
+ | <FONT Color=#B22222>cn</font>.Stop | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub ToggleButton2_Click() | ||
+ | |||
+ | If ToggleButton2.Value Then | ||
+ | <FONT Color=#B22222>cn</font>.Pause | ||
+ | Else | ||
+ | <FONT Color=#B22222>cn</font>.Play | ||
+ | Endif | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Slider1_Change() | ||
+ | |||
+ | <FONT Color=#B22222>cn</font>.Volume = Slider1.Value | ||
+ | Me.Value = CStr(Slider1.Value) | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Canale_<FONT Color=darkorange>Finish</font>() | ||
+ | |||
+ | ToggleButton1.Value = False | ||
+ | Me.Text = "Esecuzione terminata !" | ||
+ | |||
+ | End | ||
+ | In quest'altro esempio l'esecuzione avviene in un'applicazione ''a riga di comando'', nella quale sarà visibile in console il tempo trascorso dall'inizio dell'esecuzione del file audio. Inoltre, sarà possibile arrestare l'esecuzione cliccando sul tasto "Invio" della tastiera. | ||
+ | Private bo As Boolean | ||
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
+ | Dim <FONT Color=blue>sn</font> As Sound | ||
+ | Dim <FONT Color=#B22222>cn</font> As New Channel As "Canalis" | ||
+ | Dim tempus As Date | ||
+ | |||
+ | <FONT Color=blue>sn</font> = Sound.Load("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | ||
+ | |||
+ | <FONT Color=gray>' ''Si imposta a piacere il volume audio:''</font> | ||
+ | <FONT Color=blue>sn</font>.Volume = 100 | ||
+ | |||
+ | <FONT Color=#B22222>cn</font>.Play(<FONT Color=#B22222>sn</font>) | ||
+ | |||
+ | tempus = Now | ||
+ | |||
+ | <FONT Color=gray>' ''Il ciclo consente di vedere in console il tempo trascorso dall'inizio dell'esecuzione del file audio:''</font> | ||
+ | While Not bo | ||
+ | Write "\r" & Str(Time(0, 0, 0, DateDiff(tempus, Now, gb.Millisecond))) | ||
+ | Flush | ||
+ | Wait 0.1 | ||
+ | Wend | ||
+ | |||
+ | <FONT Color=#B22222>cn</font>.Stop | ||
+ | |||
+ | <FONT Color=gray>' ''Avendo sollevato l'Evento "Application.Read( )", è necessario invocare la funzione "Quit" per poter chiudere il programma:''</font> | ||
+ | Quit | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Canalis_Finish() | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Application_Read() <FONT Color=gray>' ''Cliccando sul tasto "Invio" si solleverà questo Evento''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | =Gestione dei file audio mediante le Classi ''Sound'' e ''Channels''= | ||
+ | La classe '''''Sound''''' congiuntamente con la Classe ''Channels'' consente di ascoltare <SPAN style="text-decoration:underline">contemporaneamente</span> due o più (fino a 32) file sonori (<SPAN style="text-decoration:underline">solo di tipo AIFF, FLAC, MP3, OGG e WAV</span>). | ||
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. | 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. | ||
Riga 14: | Riga 135: | ||
Channels.Count = ''numero canali utilizzabili'' (<=32) | Channels.Count = ''numero canali utilizzabili'' (<=32) | ||
− | La | + | 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, si potrà utilizzare o la Classe "''Sound''", oppure la Classe statica "''Channels''". | + | Quindi, per eseguire i file audio AIFF, FLAC, MP3, OGG e WAV, si potrà utilizzare o la Classe "''Sound''", oppure la Classe statica "''Channels''". |
− | + | ====Eseguire due o più file audio==== | |
− | Nell'esempio che segue saranno eseguiti ''contemporaneamente'' due file | + | Nell'esempio che segue saranno eseguiti ''contemporaneamente'' due file audio in un'applicazione in ambiente grafico. Si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file audio, nonché variare manualmente il volume di ogni singolo canale di uscita: |
− | + | Public Sub Form_Open() | |
− | |||
+ | Dim sn1, sn2 As Sound | ||
− | |||
− | |||
− | |||
− | |||
<FONT Color=gray>' ''Si stabilisce il numero di canali da utilizzare:''</font> | <FONT Color=gray>' ''Si stabilisce il numero di canali da utilizzare:''</font> | ||
− | + | Channels.Count = 2 | |
<FONT Color=gray>' ''Si imposta a piacere il volume audio di ciascun canale:''</font> | <FONT Color=gray>' ''Si imposta a piacere il volume audio di ciascun canale:''</font> | ||
− | + | With Slider1 | |
− | + | .MaxValue = Sound.MaxVolume | |
− | + | .MinValue = 0 | |
− | + | .Value = 110 | |
− | + | End With | |
− | + | ValueBox1.Value = Slider1.Value | |
+ | Channels[0].Volume = Slider1.Value | ||
+ | With Slider2 | ||
+ | .MaxValue = Sound.MaxVolume | ||
+ | .MinValue = 0 | ||
+ | .Value = 40 | ||
+ | End With | ||
+ | ValueBox2.Value = Slider2.Value | ||
+ | Channels[1].Volume = Slider2.Value | ||
<FONT Color=gray>' ''Si carica per ciascun canale un file WAV:''</font> | <FONT Color=gray>' ''Si carica per ciascun canale un file WAV:''</font> | ||
− | + | sn1 = Sound.Load("<FONT Color=darkgreen>''/percorso/del/primo/file/audio''</font>") | |
− | + | sn2 = Sound.Load("<FONT Color=darkgreen>''/percorso/del/secondo/file/audio''</font>") | |
− | |||
<FONT Color=gray>' ''Si eseguono contemporaneamente i file WAV dei due canali.'' | <FONT Color=gray>' ''Si eseguono contemporaneamente i file WAV dei due canali.'' | ||
Riga 48: | Riga 172: | ||
' ''Usando la Classe "Sound":''</font> | ' ''Usando la Classe "Sound":''</font> | ||
− | + | sn1.Play() | |
− | + | sn2.Play() | |
<FONT Color=gray>' ''Oppure usando la Classe statica Channels:'' | <FONT Color=gray>' ''Oppure usando la Classe statica Channels:'' | ||
Riga 55: | Riga 179: | ||
' '''Channels[1].Play(sn2)'''</font> | ' '''Channels[1].Play(sn2)'''</font> | ||
− | + | End | |
− | + | Public Sub ToggleButton1_Click() | |
Select Case ToggleButton1.Value | Select Case ToggleButton1.Value | ||
Riga 64: | Riga 188: | ||
Channels[0].Pause | Channels[0].Pause | ||
Case False | Case False | ||
− | Channels[0].Play | + | Channels[0].Play |
End Select | End Select | ||
− | + | End | |
− | + | Public Sub ToggleButton2_Click() | |
Select Case ToggleButton2.Value | Select Case ToggleButton2.Value | ||
Riga 76: | Riga 200: | ||
Channels[1].Pause | Channels[1].Pause | ||
Case False | Case False | ||
− | Channels[1].Play | + | Channels[1].Play |
End Select | End Select | ||
− | + | End | |
− | + | Public Sub Button1_Click() | |
Channels[0].Stop | Channels[0].Stop | ||
− | + | End | |
− | + | Public Sub Button2_Click() | |
Channels[1].Stop | Channels[1].Stop | ||
− | + | End | |
− | + | Public Sub Slider1_Change() | |
Channels[0].Volume = Slider1.Value | Channels[0].Volume = Slider1.Value | ||
ValueBox1.Value = CStr(Slider1.Value) | ValueBox1.Value = CStr(Slider1.Value) | ||
− | + | End | |
− | + | Public Sub Slider2_Change() | |
Channels[1].Volume = Slider2.Value | Channels[1].Volume = Slider2.Value | ||
ValueBox2.Value = CStr(Slider2.Value) | ValueBox2.Value = CStr(Slider2.Value) | ||
− | + | End | |
− | + | Nell'esempio che segue saranno eseguiti ''contemporaneamente'' due file audio in un'applicazione ''a riga di comando'': | |
− | + | Public Sub Main() | |
− | |||
− | Nell'esempio che segue saranno eseguiti ''contemporaneamente'' due file | ||
− | |||
Dim sn1, sn2 As Sound | Dim sn1, sn2 As Sound | ||
<FONT Color=gray>' ''Si stabilisce il numero di canali da utilizzare:''</font> | <FONT Color=gray>' ''Si stabilisce il numero di canali da utilizzare:''</font> | ||
− | + | Channels.Count = 2 | |
<FONT Color=gray>' ''Si imposta a piacere il volume audio di ciascun canale:''</font> | <FONT Color=gray>' ''Si imposta a piacere il volume audio di ciascun canale:''</font> | ||
− | + | Channels[0].Volume = 110 | |
− | + | Channels[1].Volume = 80 | |
− | |||
− | |||
− | |||
− | |||
+ | <FONT Color=gray>' ''Si carica per ciascun canale un file audio:''</font> | ||
+ | sn1 = Sound.Load("<FONT Color=darkgreen>''/percorso/del/primo/file/audio''</font>") | ||
+ | sn2 = Sound.Load("<FONT Color=darkgreen>''/percorso/del/secondo/file/audio''</font>") | ||
<FONT Color=gray>' ''Si eseguono contemporaneamente i file WAV dei due canali.'' | <FONT Color=gray>' ''Si eseguono contemporaneamente i file WAV dei due canali.'' | ||
Riga 134: | Riga 254: | ||
' ''Usando la Classe "Sound":''</font> | ' ''Usando la Classe "Sound":''</font> | ||
− | + | sn1.Play() | |
− | + | sn2.Play() | |
<FONT Color=gray>' ''Oppure usando la Classe statica Channels:'' | <FONT Color=gray>' ''Oppure usando la Classe statica Channels:'' | ||
Riga 141: | Riga 261: | ||
' '''Channels[1].Play(sn2)'''</font> | ' '''Channels[1].Play(sn2)'''</font> | ||
− | + | End | |
− | + | =Gestione dei file audio mediante la Classe ''Music''= | |
− | + | La Classe statica ''Music'' consente di eseguire i seguenti tipi di file audio: AIFF, FLAC, MOD, MP3, OGG e WAV. Inoltre, consente di eseguire <SPAN Style="text-decoration:underline">un solo</span> file audio per volta. | |
− | 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: | + | ===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 | With Slider1 | ||
− | .MaxValue = | + | .MaxValue = Sound.MaxVolume |
.Value = 100 | .Value = 100 | ||
End With | End With | ||
− | + | ||
− | ValueBox1. | + | With ValueBox1 |
+ | .Alignment = Align.Right | ||
+ | .Value = Slider1.Value | ||
+ | End With | ||
+ | |||
+ | ToggleButton1.Text = "Esegui" | ||
+ | ToggleButton2.Enabled = False | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | |||
+ | Public Sub ToggleButton1_Click() | ||
+ | |||
Select Case ToggleButton1.Value | Select Case ToggleButton1.Value | ||
Case True | Case True | ||
− | + | With Music | |
+ | .Load("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | ||
+ | .Play | ||
+ | End With | ||
+ | ToggleButton1.Text = "Stop" | ||
+ | With ToggleButton2 | ||
+ | .Enabled = True | ||
+ | .Text = "Pausa" | ||
+ | End With | ||
Case False | Case False | ||
− | + | Music.Stop | |
+ | ToggleButton1.Text = "Esegui" | ||
+ | With ToggleButton2 | ||
+ | .Value = False | ||
+ | .Enabled = False | ||
+ | .Text = Null | ||
+ | End With | ||
End Select | End Select | ||
+ | |||
+ | End | ||
− | |||
− | + | Public Sub ToggleButton2_Click() | |
− | + | ||
− | + | Select Case ToggleButton2.Value | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Select Case | ||
Case True | Case True | ||
Music.Pause | Music.Pause | ||
+ | ToggleButton2.Text = "Riprendi" | ||
Case False | Case False | ||
Music.Play | Music.Play | ||
+ | ToggleButton2.Text = "Pausa" | ||
End Select | End Select | ||
+ | |||
+ | End | ||
− | |||
− | + | Public Sub Slider1_Change() | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Music.Volume = Slider1.Value | Music.Volume = Slider1.Value | ||
+ | |||
+ | ValueBox1.Value = Slider1.Value | ||
− | + | End | |
− | |||
− | |||
− | |||
− | |||
===Esempi di esecuzione con un'applicazione a riga di comando=== | ===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. | 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.Load("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") |
Music.Play | Music.Play | ||
− | + | While Music.State == Music.Playing | |
− | While Music.State = Music.Playing | + | <FONT Color=gray>' ''Mostra il tempo trascorso dall'inizio dell'esecuzione:''</font> |
− | <FONT Color=gray>' ''Mostra | + | Write "\r" & Str(Time(0, 0, 0, Music.Pos * 1000)) |
− | + | Wait 0.01 | |
Wend | Wend | ||
− | + | Print "Esecuzione terminata" | |
− | + | ||
− | + | End | |
− | In questo secondo esempio di esecuzione di un file audio con un'applicazione ''a riga di comando'' si potrà interagire con essa | + | In questo secondo esempio di esecuzione di un file audio con un'applicazione ''a riga di comando'' si potrà interagire con essa tramite console/Terminale terminando arbitrariamente l'esecuzione del file audio con la semplice pressione del tasto "Invio" della tastiera. |
− | + | Public Sub Main() | |
+ | |||
+ | Dim s As String | ||
+ | |||
+ | Music.Load("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") | ||
+ | |||
+ | Music.Play | ||
+ | |||
+ | <FONT Color=gray>' ''Resta in attesa, consentendo così l'esecuzione del file audio, fino alla pressione del tasto "Invio":''</font> | ||
+ | Input s | ||
+ | |||
+ | Music.Stop | ||
+ | Print "Esecuzione terminata" | ||
+ | |||
+ | End | ||
+ | In quest'altro esempio si potranno inviare 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.Load("<FONT Color=darkgreen>''/percorso/del/file/audio''</font>") |
Music.Play | Music.Play | ||
− | ''' | + | Repeat |
+ | <FONT Color=gray>' ''Una brevissima attesa consente di inviare i previsti caratteri/comandi allo standard Input:''</font> | ||
+ | <FONT Color=gray>' ''Mostra nello standard output il tempo trascorso dall'inizio dell'esecuzione:''</font> | ||
+ | Write "\r" & CStr(Time(0, 0, 0, Music.Pos * 1000)) | ||
+ | Wait 0.01 | ||
+ | Until Music.State == Music.Stopped | ||
+ | |||
+ | <FONT Color=gray>' ''Poiché è stato sollevato l'Evento "Application_Read()", è necessaro invocare la funzione "Quit" per chiudere il programma:''</font> | ||
+ | Quit | ||
+ | |||
+ | End | ||
+ | |||
− | + | Public Sub Application_Read() | |
− | |||
Dim s As String | Dim s As String | ||
Riga 309: | Riga 398: | ||
Music.Stop | Music.Stop | ||
Print "Esecuzione fermata." | Print "Esecuzione fermata." | ||
− | + | Music.Stop | |
Case "p" | Case "p" | ||
Music.Pause | Music.Pause | ||
− | Print "Pausa..." | + | Print "Pausa......." |
Case "r" | Case "r" | ||
Music.Play | Music.Play | ||
− | Print "...continua" | + | Print "....continua" |
Case "+" | Case "+" | ||
Music.Volume += 1 | Music.Volume += 1 | ||
Riga 322: | Riga 411: | ||
Music.Volume -= 1 | Music.Volume -= 1 | ||
Print Music.Volume | Print Music.Volume | ||
− | |||
− | |||
End Select | End Select | ||
− | + | End | |
− | |||
− | |||
===Modificare il volume=== | ===Modificare il volume=== | ||
Riga 336: | Riga 421: | ||
Music.Volume = 110 | Music.Volume = 110 | ||
+ | ===Uso della libreria esterna "libmpeg3" in ausilio=== | ||
+ | Per ottenere la durata del file audio MP3 da usare con la funzione ''Wait'' o con un ciclo, informazione necessaria per consentire l'esecuzione completa del file audio, è possibile usare alcune risorse del API di "mpeg3". | ||
+ | |||
+ | Per vedere un esempio pratico di esecuzione di un file audio MP3 con le risorse della Classe ''Music'' del Componente ''gb.sdl2.audio'' e della libreria esterna ''libmpeg3'': | ||
+ | [[Eseguire un file mp3 usando le risorse del API di Mpeg3 e della Classe "Music" del Componente gb.sdl2.audio]] | ||
=Errore "Module format not recognized" con un file .mp3= | =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 | + | Se, leggendo un file .mp3, viene sollevato l'errore: "''Module format not recognized'' ", è molto probabile che non sia riconosciuto il bitrate o la frequenza di campionamento del file. Si dovrà, allora, modificare il bitrate, 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. |
Versione attuale delle 02:16, 9 gen 2024
Le risorse della libreria SDL2 per la gestione dell'audio sono state implementate in Gambas attraverso il Componente gb.sdl2.audio, il quale può essere attivato anche indipendentemente dal componente gb.sdl2 .
Le Classi fondamentali e basilari del componente gb.sdl2.audio sono: Sound, Channels, Channel e Music, le quali opportunamente combinate consentono di gestire l'esecuzione dei file audio supportati.
Indice
- 1 Gestione dei file audio mediante la sola Classe Sound
- 2 Gestione di un solo file audio mediante l'uso congiunto delle Classi Sound e Channel
- 3 Gestione dei file audio mediante le Classi Sound e Channels
- 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 AIFF, FLAC, MP3, OGG e WAV).
In questo caso, per eseguire un file sonoro, è necessario caricarlo in memoria mediante il Metodo ".Load()" della Classe Sound. Detto Metodo restituirà un Oggetto (istanza) della Classe Sound che sarà assegnato e gestito mediante apposita variabile del medesimo tipo.
Mostriamo un semplice esempio in un'applicazione a riga di comando, nel quale viene eseguito un file audio:
Public Sub Main() Dim sn As Sound sn = Sound.Load("/percorso/del/file/audio") sn.Play 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 AIFF, FLAC, MP3, OGG e WAV, 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 e variare il volume dell'audio.
Inoltre al termine dell'esecuzione del file audio verrà sollevato l'Evento "_Finish()" della Classe Channel.
Private cn As New Channel As "Canale" Public Sub Form_Open() With Slider1 .MaxValue = Sound.MaxVolume .Value = 100 End With Me.Text = CStr(Slider1.Value) End Public Sub ToggleButton1_Click() If ToggleButton1.Value Then Dim sn As Sound Me.Text = CStr(Slider1.Value) sn = Sound.Load("/percorso/del/file/audio") cn.Play(sn) Else cn.Stop Endif End Public Sub ToggleButton2_Click() If ToggleButton2.Value Then cn.Pause Else cn.Play Endif End Public Sub Slider1_Change() cn.Volume = Slider1.Value Me.Value = CStr(Slider1.Value) End Public Sub Canale_Finish() ToggleButton1.Value = False Me.Text = "Esecuzione terminata !" End
In quest'altro esempio l'esecuzione avviene in un'applicazione a riga di comando, nella quale sarà visibile in console il tempo trascorso dall'inizio dell'esecuzione del file audio. Inoltre, sarà possibile arrestare l'esecuzione cliccando sul tasto "Invio" della tastiera.
Private bo As Boolean Public Sub Main() Dim sn As Sound Dim cn As New Channel As "Canalis" Dim tempus As Date sn = Sound.Load("/percorso/del/file/audio") ' Si imposta a piacere il volume audio: sn.Volume = 100 cn.Play(sn) tempus = Now ' Il ciclo consente di vedere in console il tempo trascorso dall'inizio dell'esecuzione del file audio: While Not bo Write "\r" & Str(Time(0, 0, 0, DateDiff(tempus, Now, gb.Millisecond))) Flush Wait 0.1 Wend cn.Stop ' Avendo sollevato l'Evento "Application.Read( )", è necessario invocare la funzione "Quit" per poter chiudere il programma: Quit End Public Sub Canalis_Finish() bo = True End Public Sub Application_Read() ' Cliccando sul tasto "Invio" si solleverà questo Evento bo = True 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 AIFF, FLAC, MP3, OGG e WAV).
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 AIFF, FLAC, MP3, OGG e WAV, si potrà utilizzare o la Classe "Sound", oppure la Classe statica "Channels".
Eseguire due o più file audio
Nell'esempio che segue saranno eseguiti contemporaneamente due file audio in un'applicazione in ambiente grafico. Si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file audio, nonché variare manualmente il volume di ogni singolo canale di uscita:
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: With Slider1 .MaxValue = Sound.MaxVolume .MinValue = 0 .Value = 110 End With ValueBox1.Value = Slider1.Value Channels[0].Volume = Slider1.Value With Slider2 .MaxValue = Sound.MaxVolume .MinValue = 0 .Value = 40 End With ValueBox2.Value = Slider2.Value Channels[1].Volume = Slider2.Value ' Si carica per ciascun canale un file WAV: sn1 = Sound.Load("/percorso/del/primo/file/audio") sn2 = Sound.Load("/percorso/del/secondo/file/audio") ' 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 audio 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 audio: sn1 = Sound.Load("/percorso/del/primo/file/audio") sn2 = Sound.Load("/percorso/del/secondo/file/audio") ' 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 dei file audio mediante la Classe Music
La Classe statica Music consente di eseguire i seguenti tipi di file audio: AIFF, FLAC, MOD, MP3, OGG e WAV. 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 = 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() Select Case ToggleButton1.Value Case True With Music .Load("/percorso/del/file/audio") .Play End With ToggleButton1.Text = "Stop" With ToggleButton2 .Enabled = True .Text = "Pausa" End With Case False Music.Stop ToggleButton1.Text = "Esegui" With ToggleButton2 .Value = False .Enabled = False .Text = Null End With End Select End Public Sub ToggleButton2_Click() Select Case ToggleButton2.Value Case True Music.Pause ToggleButton2.Text = "Riprendi" Case False Music.Play ToggleButton2.Text = "Pausa" End Select End Public Sub Slider1_Change() Music.Volume = Slider1.Value ValueBox1.Value = 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 "\r" & Str(Time(0, 0, 0, Music.Pos * 1000)) Wait 0.01 Wend Print "Esecuzione terminata" End
In questo secondo esempio di esecuzione di un file audio con un'applicazione a riga di comando si potrà interagire con essa tramite console/Terminale terminando arbitrariamente l'esecuzione del file audio con la semplice pressione del tasto "Invio" della tastiera.
Public Sub Main() Dim s As String Music.Load("/percorso/del/file/audio") Music.Play ' Resta in attesa, consentendo così l'esecuzione del file audio, fino alla pressione del tasto "Invio": Input s Music.Stop Print "Esecuzione terminata" End
In quest'altro esempio si potranno inviare 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 Repeat ' Una brevissima attesa consente di inviare i previsti caratteri/comandi allo standard Input: ' Mostra nello standard output il tempo trascorso dall'inizio dell'esecuzione: Write "\r" & CStr(Time(0, 0, 0, Music.Pos * 1000)) Wait 0.01 Until Music.State == Music.Stopped ' Poiché è stato sollevato l'Evento "Application_Read()", è necessaro invocare la funzione "Quit" per chiudere il programma: 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." Music.Stop 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
Uso della libreria esterna "libmpeg3" in ausilio
Per ottenere la durata del file audio MP3 da usare con la funzione Wait o con un ciclo, informazione necessaria per consentire l'esecuzione completa del file audio, è possibile usare alcune risorse del API di "mpeg3".
Per vedere un esempio pratico di esecuzione di un file audio MP3 con le risorse della Classe Music del Componente gb.sdl2.audio e della libreria esterna libmpeg3:
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 bitrate o la frequenza di campionamento del file. Si dovrà, allora, modificare il bitrate, 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.