La gestione mediante il componente gb.sdl.sound

Da Gambas-it.org - Wikipedia.

Va premesso che il componente gb.sdl.sound è ormai obsoleto, ed è stato sostituito dal componente gb.sdl2.audio.


Ne riportiamo di seguito la pagina, che fu scritta quando il Componente era attivo, per una mera curiosità storica.




Il componente gb.sdl.sound permette di riprodurre i suoni in Gambas, riuscendo a seconda delle sue specifiche Classi a gestire in tempo reale fino a 32 tracce audio caricate in memoria, oppure un file audio.

Per fare questo il componente si avvale delle seguenti Classi: Sound, Music, Channel, Channels.


Uso della Classe Sound

La classe Sound consente di ascoltare contemporaneamente due o più (fino a 32) file sonori (di tipo .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.
Il numero di canali predefinito è 8. Se si intende variare questo valore, e quindi stabilire il numero di canali utilizzabili, bisognerà impostare 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.00 e 1 .

Per comprendere meglio quanto detto sopra, facciamo eseguire tre file sonori:

Public Sub Button1_Click()

' dichiariamo tre variabili del tipo "Sound":
Dim s1, s2, s3 As Sound

' Attiviamo, però, soltanto 2 canali.
' Questo determinerà l'esecuzione di solo due file sonori:
  Channels.Count = 2
 ' Impostiamo il volume di quei 2 canali attivati a metà:
  Channels.Volume = 0.5

' ...carichiamo "in memoria" (come dice la documentazione) tre file sonori.
' Dovremo caricarli ciascuno in una singola variabile di tipo della classe "Sound":
  s1 = New Sound("percorso_del_primo_file.wav")
  s2 = New Sound("percorso_del_secondo_file.wav")
  s3 = New Sound("percorso_del_terzo_file.wav")

' Li andiamo a far eseguire... "contemporaneamente":
  s1.Play()
  s2.Play()
  s3.Play()

' ...ma poiché abbiamo attivato solo due canali,
' sentiremo soltanto i primi due file sonori.

End


Un approfondimento sulle classi Channels e Channel

Queste Classi funzionano congiuntamente con la Classe "Sound".

Abbiamo già visto nel paragrafo dedicato a Sound l'uso ed il comportamento di "Channels": in sostanza con questa classe si gestistono in blocco un numero - stabilito da noi - di canali sonori.

L'uso, invece, di "Channel" - come è intuibile - ci consente di gestire un singolo canale. Inoltre, con l'uso della classe "Channel" possiamo far eseguire un file audio direttamente mediante il suo metodo Play. "Channel" attiverà automaticamente il canale prescelto all'interno dell'array "Channels".


Quindi, ricapitolando, "Channels" ci consente di gestire contemporaneamente più canali in blocco; "Channel", invece, ci consente di operare singolarmente su ciascun canale.

Esempio pratico. Eseguiamo tre volte separatamente un medesimo file audio mediante la classe "Channel" impostando con intensità diversa il volume di ciascuno di essi:

Public Sub Button1_Click()

Dim s1, s2, s3 As Sound

' Impostiamo il volume ad intensità bassissima del 1° canale,
' ossia il num. 0 all'interno dell'array "Channels":
 Channels[0].Volume = 0.03
  s1 = New Sound("percorso_del_file_audio.wav")
' Attiviamo il "1°" canale ed eseguiamo il file audio:
  Channel(Channels[0]).Play(s1)

Wait 1
 Channels[1].Volume = 0.1
  s2 = New Sound("percorso_del_file_audio.wav")
  Channel(Channels[1]).Play(s2)

Wait 1
 Channels[2].Volume = 1
  s3 = New Sound("percorso_del_file_audio.wav")
  Channel(Channels[2]).Play(s3)

End

Ovviamente, anche la classe "Channel" ci consente di far eseguire due o più (fino a 32) file audio contemporaneamente.

Ad ogni modo, più semplicemente si può utilizzare la sola Classe Channels così:

Public Sub Main()

 Dim sn As Sound

  Channels[0].Volume = 1

  sn = New Sound("/percorso/del/file.wav")

  Channels[0].Play(sn)

  While True
 
  Wend

End


Cambio del Volume

Poiché la gamma è compresa tra 0.00 ed 1, dovremo inviare un valore di tipo Float. Il cambio di volume di un file .wav, eseguito con la classe Sound, è possibile usando la classe "Channels", senza, però, specificare il numero di canale altrimenti l'ascolto si blocca. L'uso di "Channels" significa, però, che saranno modificati, ovviamente, tutti i canali attivi, e quindi tutti i file audio eseguiti.

Public Sub Button1_Click()

Dim s1 As Sound

 s1 = New Sound("percorso_del_file_audio.wav")
  Channel(Channels[0]).Play(s1)

' al posto della riga: "Channel(Channels[0]).Play(s1)"
' potremo usare:  s1.Play()

End


' Avremo impostato lo Slider con le proprietà
' MaxValue = 100 e MinValue = 0
Public Sub Slider1_Change()

Dim a As Float

 a = Slider1.Value / 100

 Channels.Volume = a

End


Arresto e Pausa dell'esecuzione di un file

La classe "Sound" consente di fermare e di porre in pausa un singolo file audio .wav .

Public Sub Button1_Click()


Dim s2, s3 As Sound

 s1 = New Sound("percorso_del_file_audio1.wav")
 Channel(Channels[0]).Play(s1)

 s2 = New Sound("percorso_del_file_audio2.wav")
 Channel(Channels[1]).Play(s2)

End


Public Sub Button2_Click()

' Fermiamo il file eseguito sul canale zero:
 Channel(Channels[0]).Stop

' oppure:  Channel(Channels[0]).Pause

End


Uso della Classe Music

La classe Music, invece, consente di ascoltare un solo file sonoro (.wav, .mp3, .ogg) per volta. |1|

Mostriamo un semplice esempio per eseguire un file audio con un'applicazione in ambiente grafico:

Public Sub Button1_Click()

 Music.Load("/percorso/del/file/audio")

 Music.Play


 Do
' Mostra il tempo trascorso durante l'esecuzione:
   Print Cstr(Date(0, 0, 0, 0, 0, 0, Music.Pos * 1000))
' Una brevissima attesa consente di agire sugli eventuali oggetti posti sul Form:
   Wait 0.001
 Loop Until Music.State = Music.Stopped

End

Indicazione del tempo trascorso di un file audio

La classe "Music" consente di verificare il tempo trascorso dall'inizio dell'escuzione di un file audio mediante l'uso del metodo "Pos".

Indicazione dello Stato

La proprietà .State della Classe Music ci informa lo stato della risorsa, restituendo un intero.

Music.State As Integer

Se il valore ritornato è 1, allora la risorsa sta eseguendo il file audio; se il valore ritornato è zero, allora il suo stato è "fermo".


Uso della Classe Music con un'applicazione a riga di comando

In questo caso bisognerà dopo il metodo .Play() della Classe Music attivare un ciclo, che avrà termine solo quando lo status della Classe Music si troverà nella situazione rappresentata dalla costante Stopped:

Public Sub Main()

 With Music
   .Load("percorso/del/file/audio")
   .Play()
 End With

 Do
' Mostra il tempo trascorso durante l'esecuzione:
   Print Cstr(Date(0, 0, 0, 0, 0, 0, Music.Pos * 1000))
 Loop Until Music.State = Music.Stopped

End


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.




Note

[1] Per far suonare due o più file .mp3 contemporaneamente, è necessario utilizzare le funzionalità di gstreamer mediante l'attivazione del componente gb.media, anziché il presente componente gb.sdl.sound .