Pagina 1 di 1

python - passaggio graduale da un brano musicale ad un altro

Inviato: mercoledì 10 giugno 2015, 1:45
da maresama
In un programma Python dovrei mandare in ascolto un brano musicale e dopo un certo tempo passare ad un altro.
Per la gestione della musica avrei pensato a VLC (comunque andrebbe bene qualunque altra soluzione) ma non so come fare per iniziare gradualmente e come terminare gradualmente iniziando il successivo
Qualcuno ha già un'esperienza in questo da suggerirmi come fare? (attualmente lancio VLC con il brano da ascoltare , e lo interrompo con un kill, ma naturalmente non c'è gradualità.)
Grazie.

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: mercoledì 10 giugno 2015, 13:05
da crap0101
hai guardato le opzioni da command line di vlc? se, come mi sembra di capire, non è una cosa interattiva, potresti passargli tutti i brani da subito e forse si può scegliere se usare la dissolvenza tra l'uno e l'altro.
Se invce vuoi interromperli a una durata arbitraria che non perforza coincide con la fine del brano (o altre operazioni non "standard") è meglio usare una lib tipo gstreamer, sdl o simili.

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: giovedì 11 giugno 2015, 21:46
da maresama
grazie Crap
Cercherò di capire come usare gstreamer (o sdl) ma penso che si una cosa piuttosto difficile (Mp3, Ogg e tanti altri formati.. )
Ciao.

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: giovedì 11 giugno 2015, 21:53
da crap0101
con gstreamer e sdl non hai problemi, puoi gestire tranquillamente wav, mp3, ogg, forse anche flac (non ricordo se sdl li supporta). Con gst mi pare di ricordare che ci sia già tutto di default, per sdl invece al massimo dovrai installare uno o due pacchetti in più.

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: giovedì 11 giugno 2015, 22:23
da rai
Ma, a meno di volere stare in puro python (magari per essere multipiattaforma?), per
mandare in ascolto un brano musicale e dopo un certo tempo passare ad un altro.
io me la sbrigherei così:

Codice: Seleziona tutto

sudo apt-get-install moc
uso moc perché è leggerissimo ... e perchè lo conosco ;-)

Codice: Seleziona tutto

#!/usr/bin/env python

import subprocess, time
DurataAscolto = 10

def fade( segno ):
    for volta in range(10):
        time.sleep(.5)
        subprocess.call("amixer set Master 2%{}".format(segno), shell=True)

subprocess.call("amixer set Master 100% unmute", shell=True) # attiva l'audio e regola il volume iniziale
subprocess.call("mocp -S; mocp -cap '/dati/Musica/Lou Reed - Vicious.mp3'", shell=True)
time.sleep( DurataAscolto )
fade('-')
subprocess.call("mocp -cap /dati/Musica/'Ray Charles - Hit the Road Jack.MP3'", shell=True)
fade('+')
forse rozzo ma immediato

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: venerdì 12 giugno 2015, 16:16
da maresama
Grazie anche a te, rai
Non conosco moc ma mi sembra semplice da usare
Il tuo esempio, mi sembra di capire a prima vista, che lanci moc e termina dopo un certo tempo
Per me invece Il cambio del brano musicale è legato ad una proiezione di foto
Quando arriva in proiezione una determinata foto, in base ad una lista nome foto-brano da ascoltare deve avvenire la chiusura graduale del brano precedente e l'inizio del nuovo brano (la partenza non è necessario che sia graduale)
Quindi dovrei lanciare moc con il brano (o meglio con più brani consecutivi). Ma all'arrivo della foto devo farlo chiudere in dissolvenza, per poi subito rilanciare moc con altri brani. E' possibile?

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: venerdì 12 giugno 2015, 19:19
da crap0101
ma questa cosa la devi fare "live"? Come sincronizzi il sonoro e la proiezione delle immagini? Queste ultime sono visualizzate tramite un altro programma eseguito esternamente? (forse potrebbe tornati utile il modulo pexpect). btw, mi viene il dubbio che, piuttosto di python, ti serva un editor video!

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: venerdì 12 giugno 2015, 22:47
da maresama
x Crap
la gestione delle foto è fatta dal mio programma Python. (Prima usavo FEH e non avrei potuto fare nulla) e posso agire tranquillamente alla proiezione di una determinata foto (ad essere precisi durante la proiezione della foto precedente a quella del cambio)
Certamente non esiste una sincronizzazione foto-musica e non è quello che voglio fare..
Però, al cambio di ambiente o scena, sarebbe ottimo risincronizzare musica-scena.
Ad esempio (semplifico):
- viaggio verso la montagna: varie foto del viaggio con musica adatta
- arrivo in montagna: foto dell'ambiente circostante e musica adatta alla montagna (cori di montagna ecc.)
- ritorno in città: chiusura dei cori (che sarebbe fuori luogo) e partenza di nuovi brani più adatti
Quindi la sincronizzazione non esiste: è solo un riallineamento in determinati punti (adattamento della musica alle scene visualizzate).
Visto in questo modo è anche facile fare l'abbinamento perchè essendo molto 'grossolano' (è solo legato a intere sequenze) è facile fare la colonna sonora (in pratica una colonna sonora per ogni lunga sequenza)
Spero di essermi spiegato....
Ciao

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: sabato 13 giugno 2015, 11:47
da rai
Prima di tutto voglio ripetere che ho messo MOC nell'esempio solo perchè già lo uso mentre non conosco le librerie/moduli python consigliati da crap0101. Sta a te valutare cosa si adatta meglio nel tuo caso
Comunque, a prescindere da come farai a visualizzare le foto e riprodurre la musica, se ho capito bene quello che ti serve è:
Quando arriva in proiezione una determinata foto, in base ad una lista nome foto-brano da ascoltare deve avvenire la chiusura graduale del brano precedente e l'inizio del nuovo brano
Se l'elenco delle foto è noto a priori, potrebbe bastare una lista ordinata di tuple (immagine, musica) in un modo simile a questo

Codice: Seleziona tutto

$ python
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> media = [('immagine1', 'musica1'), ('immagine2', 'musica1'), ('immagine3', 'musica1'), ('immagine4', 'musica2'), ('immagine5', 'musica2'), ('immagine6', 'musica2'), ('immagine7', 'musica3'), ('immagine8', 'musica3'), ('immagine9', 'musica3')]
>>> sound = media[0][1]
>>> for t in media:
...     if sound != t[1]:
...             print "fade-out di {} dopo averlo suonato un tot".format(sound)
...     print "mostro {} e suono {}".format(t[0], t[1])
...     if sound != t[1]:
...             print "fade-in di {}".format(t[1])
...     sound = t[1]
... 
mostro immagine1 e suono musica1
mostro immagine2 e suono musica1
mostro immagine3 e suono musica1
fade-out di musica1 dopo averlo suonato un tot
mostro immagine4 e suono musica2
fade-in di musica2
mostro immagine5 e suono musica2
mostro immagine6 e suono musica2
fade-out di musica2 dopo averlo suonato un tot
mostro immagine7 e suono musica3
fade-in di musica3
mostro immagine8 e suono musica3
mostro immagine9 e suono musica3
>>> 

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: domenica 14 giugno 2015, 20:02
da maresama
x rai.

Ho installato moc ed ho letto il manuale.
Ho già fatto qualche prova e mi sembra che tutto vada bene ed è quello che mi serve.
Unica cosa che non ho capito è come fare per sapere se moc è gia attivo o no. Ho comunque visto che se tento di attivarlo ed è gia attivo, non sucede nessun guaio, però preferirei evitarlo.
Anche per il volume: prima di eseguire la playlist c'è modo di sapere il volume a quanto impostato? (ho visto invece come fare per riimpostarlo con -v)

Grazie. Mi hai consigliato il programma giusto.....

Re: python - passaggio graduale da un brano musicale ad un a

Inviato: domenica 14 giugno 2015, 21:56
da rai
maresama ha scritto:Unica cosa che non ho capito è come fare per sapere se moc è gia attivo o no.

Codice: Seleziona tutto

pidof mocp >/dev/null && echo MOC è attivo || echo MOC non è attivo
maresama ha scritto:Ho comunque visto che se tento di attivarlo ed è gia attivo, non sucede nessun guaio,
infatti per lanciare moc io mi limito a evitare
mocp -S && altro comando
in favore di
mocp -S ; altro comando
per essere sicuro che altro comando venga eseguito anche se mocp da errore di già in esecuzione

Comunque per `spegnere' MOC
-x, --exit
Bring down the server.
EDIT
hai modificato il post mentre rispondevo oppure non avevo visto questo:
Anche per il volume: prima di eseguire la playlist c'è modo di sapere il volume a quanto impostato? (ho visto invece come fare per riimpostarlo con -v)
avrai visto che per regolare il volume non uso moc (adesso non ricordo ma in passato ho avuto qualche problema con l'opzione -v)
preferisco intervenire più direttamente sul driver della scheda audio con amixer

riguardo alla domanda: non so se quello che chiedi si possa ottenere senza una pipe, p.es. con grep:

Codice: Seleziona tutto

amixer get Master | grep -om1 [0-9]*%
così ottieni il valore percentuale del volume (e stai presupponendo che left e right siano settati allo stesso livello ;))