Il tuo messaggio mi ha costretto ;D ad inseguire il tentativo di approfondire la conoscenza del componente gb.sdl.sound...
Dopo varie prove ecco di seguito cosa ne ho ricavato.
Allora... bisogna distinguere la classe Music dalla classe Sound.
La classe Music consente di ascoltare un solo file sonoro (.wav, .mp3, .ogg) per volta.
La classe Sound consente, invece, di ascoltare contemporaneamente 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.
La classe "Channels" ci consente, inoltre, di impostare il volume all'interno di una gamma tra 0.00 e 1 .
Dalla teoria alla pratica.....
Per comprendere meglio quanto detto sopra, facciamo questo test: tentiamo di far eseguire tre file sonori ad entrambe le Classi prima descritte.
Prova con la Classe Sound:
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("/alibaba.wav")
s2 = New Sound("/aladino.wav")
s3 = New Sound("/simbad.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
Prova con la Classe Music:
Public Sub Button1_Click()
'...nel tentativo disperato di far eseguire contemporaneamente
' anche qui tre file sonori, li carichiamo tutti e tre:
Music.Load("/alibaba.wav")
Music.Load("/aladino.wav")
Music.Load("/simbad.wav")
' Poi, come vada vada, cerchiamo di eseguirli contemporaneamente:
Music.Play
Music.Play
Music.Play
'...non c'è niente da fare, ahimé: sarà eseguito soltanto l'ultimo file sonoro del gruppo !
' Ugualmente si fa cilecca, anche provando ad usare (come abbiamo fatto per la Classe "Sound")
' delle variabili di tipo "Music".
End
segue..........
Le Classi "Channels" e "Channel".
Queste Classi funzionano congiuntamente con la Classe "Sound".
Abbiamo già visto sopra 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, possiamo far eseguire un file audio direttamente con l'uso della classe "Channel" 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" 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("alibaba.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("alibaba.wav")
Channel(Channels[1]).Play(s2)
Wait 1
Channels[2].Volume = 1
s3 = New Sound("alibaba.wav")
Channel(Channels[2]).Play(s3)
End
Ovviamente, anche "Channel" ci consente di far eseguire duo o più (fino a 32) file audio contemporaneamente.
Comunque, da tutta questa storia ho scritto un nuovo capitolo nelle Guide della Comunità della nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=La_gestione_mediante_il_componente_gb.sdl.sound
ciao, scusate se mi intrometto...
Ciao doublemm, non capisco :-\ perché tu debba scusarti: al forum possono partecipare tutti gli iscritti !
...ho fatto delle prove, vi risulta che associando il volume ad uno slider, al cambio volume il file in riproduzione si ferma?
Poiché la gamma è compresa tra 0.00 ed 1, devi inviare un valore di tipo Float. Va precisato che - secondo i risultati da me ottenuti - 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 - sì, hai ragione - 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("alibaba.wav")
Channel(Channels[0]).Play(s1)
' al posto della riga: "Channel(Channels[0]).Play(s1)"
' possiamo 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
Ho fatto anche delle prove con la classe music. La classe music mi riprodice degli mp3 che con sound mi danno errore al momento del caricamento "unrecognized sound file type"
Sì, ti dò conferma. Vado a modificare al riguardo il mio primo intervento. Non avevo fatto la prova con gli .mp3.
Però mi sembra di aver capito che eseguire più "brani" contemporaneamente è come sentire più persone che parlano contemporaneamente....
....be'...sì... significa - ovviamente - far eseguire, e quindi ascoltare due o più file .wav (al di là di quali suoni contengono) contemporaneamente.
C'è un interrupt o qualcosa che mi "avverte" che è finito il brano?
Ritengo sia possibile, però con la proprietà Pos della classe "Music".
Se io tolgo il WAIT ed eseguo un fille .WAV che contiene un sigolo tono, mi accorgo che c'è stato il passaggio?
Cosa intendi dire con precisione ? Se puoi sapere, forse, se è stata avviata l'esecuzione del file ? O intendi un'altra cosa ?
Vorrei, per completezza e sempre in riferimento alla classe "Sound", ricordare che con Channel è possibile fermare o mettere in pausa l'esecuzione di un singolo file .wav.
Esempio:
Private s1 As Sound
Public Sub Button1_Click()
Dim s2 As Sound
s1 = New Sound("alibaba.wav")
Channel(Channels[0]).Play(s1)
s2 = New Sound("simbad.wav")
Channel(Channels[1]).Play(s2)
End
Public Sub Button2_Click()
' Fermiamo l'esecuzione del "solo" file .wav
' eseguito sul primo canale (il num. 0):
Channel(Channels[0]).Stop
End
Allora, Music.Pos mi restituisce un float, quindi per sapere se il brano è finito suppongo debba fare continuamente una comparazione tra il tempo attuale e la durata del brano.
Suppongo si possa rilevare la durata di un brano, ma penso debba fare continuamente la comparazione...
Ti basta piazzare un Timer, ed andare a vedere ogni tot millisecondi (lo stabilirai tu) il valore che ti restituisce il metodo "Pos", ossia quanto tempo è trascorso dall'inizio. Questo inoltre ti consentirà di applicare anche una ProgressBar o uno Slider per indicare, appunto, il tempo trascorso.
Quando il brano sarà terminato, "Pos" ti restituirà un valore zero; e pertanto tu saprai che il brano è appunto terminato.