Autore Topic: gb.sdl.sound per riprodurre una playlist: si può?  (Letto 15449 volte)

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
gb.sdl.sound per riprodurre una playlist: si può?
« il: 29 Giugno 2012, 11:03:09 »
Ho visto che ci sono diversi modi per riprodurre dei suoni, qualcuno preferisce il metodo music, altri il sound.
Comunque, negli esempi di Gambas viene riprodotto un singolo file.
Io vorrei effettuare la riproduzione di una playlist.
Nella documentazione si parla di riprodurre fino a 32 "suoni" dalla memoria, ma solo uno da file: cosa vuol dire?
Come posso caricare le mie 32 tracce in memoria?
Oppure, se gestisco un file alla volta, come posso creare un evento quando il file ha finito di suonare, per caricarne un'altro?
Qual'è il metodo più veloce per caricare un file: music o sound?
Grazie.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #1 il: 30 Giugno 2012, 03:31:08 »
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:
Codice: gambas [Seleziona]

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:
Codice: gambas [Seleziona]

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..........
« Ultima modifica: 01 Luglio 2012, 01:03:52 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #2 il: 30 Giugno 2012, 17:40:04 »
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:
Codice: gambas [Seleziona]

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
« Ultima modifica: 08 Settembre 2014, 12:22:24 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #3 il: 30 Giugno 2012, 21:24:57 »
Ok, grazie dell'approfondimento.
Però mi sembra di aver capito che eseguire più "brani" contemporaneamente è come sentire più persone che parlano contemporaneamente....
C'è un interrupt o qualcosa che mi "avverte" che è finito il branno?
Se io tolgo il WAIT ed eseguo un fille .WAV che contiene un sigolo tono, mi accorgo che c'è stato il passaggio?
« Ultima modifica: 30 Giugno 2012, 21:39:00 da El Berto »

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #4 il: 30 Giugno 2012, 23:17:07 »
ciao, scusate se mi intrometto ma ho fatto delle prove, vi risulta che associando il volume ad uno slider, al cambio volume il file in riproduzione si ferma?

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"
« Ultima modifica: 30 Giugno 2012, 23:19:16 da doublemm »
Matteo DoubleMM Mion

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #5 il: 01 Luglio 2012, 01:03:26 »
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:
Codice: gambas [Seleziona]

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 ?
« Ultima modifica: 01 Luglio 2012, 14:35:06 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #6 il: 01 Luglio 2012, 12:15:35 »

C'è un interrupt o qualcosa che mi "avverte" che è finito il brano?
Ritengo sia possibile, però con la proprietà Pos della classe "Music".

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...



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 ?

Quando ascolti, per esempio, una compilation su un cd, non ti accorgi del passaggio da un brano all'altro, è come sentire un singolo file .WAV.
Con Windows Media Player riesco a estrarre le tracce dal cd, convertirle in .WAV che li riproduce senza interruzzioni udibili, come se si trattasse di una singola traccia.
Se invece ascolti un album, tra un brano e l'altro vengono solitamente inserite delle pause, cosa che non è accettabile se ascolti una compilation....
Quindi mi rimane da provare, appena posso, se due tracce .WAV di una compilation vengono eseguite senza interruzione (pausa) togliendo il comando WAIT.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #7 il: 01 Luglio 2012, 14:51:37 »
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:
Codice: gambas [Seleziona]

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.
« Ultima modifica: 14 Marzo 2015, 01:57:35 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #8 il: 01 Luglio 2012, 19:06:21 »

[/quote]

Quando ascolti, per esempio, una compilation su un cd, non ti accorgi del passaggio da un brano all'altro, è come sentire un singolo file .WAV.
Con Windows Media Player riesco a estrarre le tracce dal cd, convertirle in .WAV che li riproduce senza interruzzioni udibili, come se si trattasse di una singola traccia.
Se invece ascolti un album, tra un brano e l'altro vengono solitamente inserite delle pause, cosa che non è accettabile se ascolti una compilation....
Quindi mi rimane da provare, appena posso, se due tracce .WAV di una compilation vengono eseguite senza interruzione (pausa) togliendo il comando WAIT.
[/quote]

se vuoi lo stesso effetto lo puoi ottenere anche masterizzando un cd. Ormai quasi tutti i software di masterizzazione ti danno la possibilità di togliere i 2 secondi di 'silenzio' tra una traccia e l'altra
Matteo DoubleMM Mion

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #9 il: 01 Luglio 2012, 19:22:52 »
Comunque sia, guardate... fino a quando si devono fare delle cose semplici, può andare bene pure questo componente, ma se si devono fare cose più complesse, a mio avviso bisogna farsi il sederino così (   )  :hard: studiando come gestire i dati audio attraverso le funzioni esterne delle API di Alsa.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #10 il: 01 Luglio 2012, 22:58:16 »
se vuoi lo stesso effetto lo puoi ottenere anche masterizzando un cd. Ormai quasi tutti i software di masterizzazione ti danno la possibilità di togliere i 2 secondi di 'silenzio' tra una traccia e l'altra

Forse non mi soono spiegato bene: io voglio farmi un'interfaccia per conto mio.
Finora ho usato Windows Media Player SDK (lavorando in Visual Basic) perchè se riproducoo le tracce .WAV di una compilation (ho il CD originale, estraggo le tracce in .WAV e mi faccio la playlist) non si sente la pausa (che normalmente non c'è) tra una traccia e l'altra.
Con altre componenti (sempre per riprodurre files audio) viene inserita, seppur brevissima, una pausa che però si sente.
Poi, usando gli altri formati, la pausa si sente anche in Windows Media Player.

Il mio problema non centra niente con la masterizzazione.

Quello che non sono ancora riuscito a provare (anzi,  grazie per tutto l'aiuto) è quello di provare a riprodurre con Gambas 2 tracce .WAV estratte da una compilation.

 
Citazione
attraverso le funzioni esterne delle API di Alsa.

Potresti tradurre in linguaggio per i comuni mortali che sono solo diplomati in elettronica?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #11 il: 02 Luglio 2012, 00:05:32 »
Potresti tradurre in linguaggio per i comuni mortali che sono solo diplomati in elettronica?

Ahééééé ! L'hai trovato qua l'esperto in informatica !  :rotfl:
Io, l'informatica, non l'ho manco studiata a scuola ! Sono un semianalfabeta programmatore della "domenica" !

Comunque sia, io volevo intendere di utilizzare direttamente le funzioni esterne di Alsa mediante la loro chiamata con Extern.



Sotto potete vedere un immagine medioevale di tre programmatori di Gambas-it che cercano di usare le... api.
« Ultima modifica: 02 Luglio 2012, 00:22:58 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #12 il: 02 Luglio 2012, 13:09:03 »
Citazione
Ho visto che ci sono diversi modi per riprodurre dei suoni, qualcuno preferisce il metodo music, altri il sound.
Comunque, negli esempi di Gambas viene riprodotto un singolo file.
Io vorrei effettuare la riproduzione di una playlist.
Nella documentazione si parla di riprodurre fino a 32 "suoni" dalla memoria, ma solo uno da file: cosa vuol dire?
Come posso caricare le mie 32 tracce in memoria?
Oppure, se gestisco un file alla volta, come posso creare un evento quando il file ha finito di suonare, per caricarne un'altro?
Qual'è il metodo più veloce per caricare un file: music o sound?
Grazie.
prova a guardarti il mio gplay magari potrebbe esserti utile
http://www.tutto-opensource.org/software/sorgenti/gplay-0.0.14.tar.gz

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 148
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #13 il: 02 Luglio 2012, 15:04:44 »
Niet da fare: ho provato a utilizzare il metodo Music per la riproduzione, per rilevare la fine del brano ho abilitato un timer (intervallo 10ms) che legge continualmente la posizione. Quando la posizione è minore di 0.010 (quindi sono arrivato alla fine) carico e riproduco la seconda traccia e disabilito il timer.
Si sente lo stesso l'interruzione.

Però ho verificato che anche con il player di Ubuntu "riproduttore multimediale" si sente la pausa.

Poi ho scoperto che la posizione non è disponiblie per il metodo Sound, e che nel metodo Music non funziona con i files WAV (set Music.Pos).

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: gb.sdl.sound per riprodurre una playlist: si può?
« Risposta #14 il: 02 Luglio 2012, 18:40:15 »
Niet da fare: ........
Si sente lo stesso l'interruzione.
....devi "inseguire le Api".......  :-[

Non so se mi spiego.


.... il mio gplay magari potrebbe esserti utile
Caro fsurfing devo dirti che il tuo applicativo (c'ho aggiunto qualche tastino funzionale) lo uso regolarmente per ascoltare i .wav ed .mp3 .  :D
« Ultima modifica: 02 Luglio 2012, 18:44:24 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »