Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Utilisation de PLAY | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Utilisation de PLAY Sam 19 Sep 2009 - 15:47 | |
| J'utilise la séquence suivante pour jouer un morceau de musique mp3: - Code:
-
Sound 1 File_Load 1, "Musik.mp3" Play 1 et ça marche. Maintenant je veux enchaîner une série de morceaux (une liste .m3u), je mets donc le code ci-dessus en sous-programme, je lis le fichier liste et j'appelle le s/p à partir d'une boucle en donnant le nom du fichier à jouer. Ca ne marche pas: le PLAY commence à jouer et rend la main tout de suite à l'appelant, et la 2ème demande arrivant immédiatement derrière je pars en erreur avec un numéro d'objet (Sound) déjà utilisé. J'ai essayé en changeant le numéro d'objet Sound à chaque appel mais ça plante: - Code:
-
Jouer: n = n + 1 Sound n File_load n, fs$ Play n Return Y a-t-il un moyen de savoir quand le Play est terminé pour attendre et enchaîner seulement à ce moment-là ? ou quelque chose m'échappe... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Possible comme ça Sam 19 Sep 2009 - 18:11 | |
| J'ai essayé avec des wav et en modifiant un peu le programme de départ(ça devrait marcher pareil avec des mp3) et ça a marché. Le code, c'est : dim a$(3),i a$(1)="APPLAUS.WAV" a$(2)="baille2.wav" a$(3)="bins.wav" sound 1 for i=1 to 3 file_load 1,a$(i) play 1 wait 2000 next i On entend les trois sons les uns après les autres, mais cela ne garantit pas que tous avaient fini de jouer. A ma connaissance, il n'y a pas de moyen de savoir à l'avance combien de temps va durer un son et d'adapter la durée du Wait en conséquence. Mais peut-être y-a-t-il un moyen que je ne connais pas... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: ou alors Sam 19 Sep 2009 - 18:27 | |
| Ou alors, si on sait à l'avance quelles musiques vont être jouées, on mesure chacune leur longueur, mais c'est un peu galère... Nouveau code : dim a$(3),a(3),i a$(1)="APPLAUS.WAV" : a(1)=6 a$(2)="baille2.wav" : a(2)=2 a$(3)="bins.wav" : a(3)=3 sound 1 for i=1 to 3 file_load 1,a$(i) play 1 wait a(i)*1000 next i (dites donc, comment vous faites pour faire apparaître ces petites fenêtres blanches où vous insérer votre code ?) | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: fin Sam 19 Sep 2009 - 19:22 | |
| J'espère que ça répond à la question posée. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilisation de PLAY Dim 20 Sep 2009 - 17:45 | |
| Merci Jean Jacques pour tes efforts, mais ta réponse ne me satisfait pas complètement. En effet ça marche pour jouer un son bref, on estime à peu près la durée, mais moi je parle de morceaux mp3, par exemple une chanson qui dure 2 ou 3 minutes, impossible de faire un wait approximatif pour ça, il faudrait connaître la durée exacte de chaque morceau (d'ailleurs peut-être qu'elle est écrite quelque part dans le fichier mp3, il faudrait savoir où). Déjà mon sous-programme n'est pas correct, le Sound devrait être défini en dehors et une fois pour toutes. Je vais continuer à chercher, merci en tout cas...
Pour insérer le code, en cours de saisie tu sélectionnes la zone qui contient le code, puis tu cliques en haut sur le bouton "Code". De même pour faire Gras, Italiques, souligné etc... | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Autre solution Dim 20 Sep 2009 - 20:30 | |
| Pour les musique plus longues, je vois bien une solution. Elle est un peu tordue et les puristes de la programmation sophistiquée crieraient certainement au scandale, mais ça marche, je l'ai essayée : - Code:
-
rem j'ai une musique mp3 qui dure un peu moins de 2 min 10 sec, soit 130 sec rem (si on peut appeler ça une musique, c'est la sirène des pompiers, mais bon) rem sachant que wait dure au maximum 30 sec, cela fait 4*wait(max) + 10 sec dim a : a=130 sound 1 file_load 1,"XXXXDOC-Pompiers.mp3" play 1 while a>30 wait 30000 a=a-30 end_while wait a*1000 print "fini" file_load 1,"APPLAUS.WAV" play 1 print "Terminé"
Bien sûr, ce serait mieux si M. PANORAMIC nous créait une possibilité de gérer la file sonore, mais on va pas être trop exigeant. J'espère que ça pourra te servir. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilisation de PLAY Dim 20 Sep 2009 - 20:54 | |
| D'accord, mais ça ne résout pas du tout mon problème, le wait a une durée fixe. Si j'enchaîne un morceau de 1'30" puis un de 3'15", puis un de 2', etc., je mets le Wait à combien ? On pourrait peut-être évaluer la durée du morceau en fonction de la taille du fichier, mais je crois que ce n'est pas aussi simple, ça fait intervenir d'autres éléments: le bitrate, le taux d'échantillonnage... Il faudrait surtout un moyen de savoir quand le fichier a été entièrement traité et attendre ce temps-là, mais pas sûr que ce soit possible. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilisation de PLAY Dim 20 Sep 2009 - 22:00 | |
| Bon, j'ai fait un truc empirique qui tourne chez moi: - Code:
-
Rem **** Play.bas jouer un MP3 ou une liste (M3U) de MP3 dim p$, fs$, n, lof, duree, s, ops, j, reste Label Jouer, Carfic Sound 1
ops = 16049: rem **** octets de fichier par seconde (approx.)
If Param_Number > 0 p$ = Param_Value$(1) n = 1 If upper$(Right$(p$, 3)) = "M3U" Rem liste File_Open_Read 1, p$ While File_Eof(1) = 0 File_Readln 1, fs$: fs$ = "C:\Mesdoc\Mp3\Compil1\" + fs$ Gosub Carfic Gosub Jouer rem **** attente de la fin du morceau j = int(duree/25): reste = 25*Frac(duree/25) If j > 0 For s = 1 to j Wait 25000 Next s End_If Wait reste*1000 End_While Else fs$ = p$: Gosub Carfic Gosub Jouer End_If End_If TERMINATE
Jouer: File_load 1, fs$ Play 1 Return
Carfic: Filebin_Open_Read 2, fs$ lof = Filebin_Size(2): rem **** taille du fichier mp3 Filebin_Close 2 duree = INT(lof/ops) + 2: rem **** ajout 2 secondes de battement par sécurité Return Remarques: - Sur un certain nombre de mp3 j'ai fait la moyenne du nombre d'octets de fichier pour 1 seconde de musique: constante ops = 16049. Je calcule la durée en fonction de la taille du fichier et j'ajoute 2 secondes de sécurité (S/P Carfic). - Le Wait étant limité à 30s j'ai fait des morceaux de 25s. - Le programme ( Play.exe) est lancé avec en paramètre le nom du fichier .m3u - le chemin indiqué ligne 15 est évidemment à adapter pour chacun, c'était juste pour un essai (mon fichier liste ne contient que le nom du fichier, pas son chemin complet). - La valeur ops doit sans doute être adaptatée en fonction du type d'encodage des mp3, bitrate etc., c'est empirique et ça ne vaut pas un calcul exact en fonction des paramètres qui figurent dans le fichier, mais je ne sais pas où. EDIT: J'ai continué mes investigations (Google) et j'ai trouvé un petit soft, Tag.exe, qui permet entre une multitude de possibilités de lister les caractéristiques ('tags') d'un fichier mp3, en ligne de commande. Pour ceux que ça intéresse, c'est là: http://www.softpedia.com/progDownload/Tag-Download-21935.htmlIl suffit donc de lancer Tag.exe avec Execute, avec en paramètre le fichier mp3: - Code:
-
EXECUTE "ChemindeTag.exe Chemindemonfichier.mp3 >Fichresul.txt" et de rechercher dans le fichier résultat entre autres la durée du morceau. Au moins la durée est exacte, et non plus approximative. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilisation de PLAY Lun 21 Sep 2009 - 17:14 | |
| J'ai refait avec l'utilisation de Tag.exe (voir ci-dessus) pour la durée. Et pour l'attente j'ai mis une boucle de n secondes avec 1 seconde à chaque fois, pour pouvoir arrêter le programme (sinon je pense qu'il attend la fin de la boucle pour prendre le click en compte). Sur le click de fin prématurée ('Quitter'), on part en erreur 'Access violation at address 48. Read of address 48'qui est un bug connu de Jack crois-je me souvenir. Je redonne tout le code (il a pris un peu d'embonpoint): - Code:
-
Rem **** Play.bas jouer un MP3 ou une liste (M3U) de MP3 Dim Fichtag$, Fichresul$, rep$, a$, b$, d$ dim p$, fs$, duree, s, i, j Dim tag$(10), tagl$(10) tag$(1) = "Format:": tag$(2) = "Details:": tag$(3) = "Tags:" tag$(4) = "Title:": tag$(5) = "Artist:": tag$(6) = "Album:" tag$(7) = "Year:": tag$(8) = "Track:": tag$(9) = "Genre:" tag$(10) = "Comment:" Label Jouer, Carfic, Fin
Fichtag$ = "C:\Util\Tag.exe": Rem **** pour récupérer la durée Fichresul$ = "Z:\Temp.txt": Rem **** fichier temporaire quelconque rep$ = "C:\Mesdoc\Mp3\Compil1\": Rem **** répertoire des musiques (à ajuster)
Width 0, 280: Height 0, 210 Sound 1 Button 3: Top 3, 140: Left 3, 75: Width 3, 100: Height 3, 24: Caption 3, "Quitter" On_Click 3, Fin List 4: Top 4, 10: Left 4, 10: Width 4, 245: Height 4, 120
If Param_Number > 0 p$ = Param_Value$(1) If upper$(Right$(p$, 3)) = "M3U" p$ = rep$ + p$: Rem **** Fichier 'liste' (.m3u) File_Open_Read 1, p$: Rem **** Prise en compte des fichiers mp3 à jouer While File_Eof(1) = 0 File_Readln 1, fs$: fs$ = rep$ + fs$ Gosub Carfic Gosub Jouer For j = 1 To duree: Wait 1000: Next j: Rem **** attente de la fin End_While Else fs$ = p$: Gosub Carfic Gosub Jouer End_If End_If Fin: TERMINATE
Jouer: File_load 1, fs$ Play 1 Return
Carfic: If File_Exists(Fichresul$) = 1 Then File_Delete Fichresul$ Execute chr$(34) + Fichtag$ + " --tofilen " + Fichresul$ + " " + fs$ + chr$(34): Rem caractéristiques du MP3 wait 1000 File_Open_Read 2, Fichresul$ File_Readln 2, a$: Rem nom du fichier While File_Eof(2) = 0 File_Readln 2, a$: a$ = Rtrim$(a$) b$ = Trim$(left$(a$, 8)): rem print b$ for i = 1 to 10 If Len(a$) > Len(tag$(i)) if b$ = tag$(i) then tagl$(i) = mid$(a$, 10, len(a$) - 9): Exit_For End_If next i End_While File_Close 2 File_Delete Fichresul$ d$ = right$(tagl$(2), 5) duree = 2 + 60*val(left$(d$, 2)) + val(right$(d$, 2)): rem durée en secondes Print_Target_Is 4 Clear 4 Print fs$ Print "Artiste: " + tagl$(5) Print "Titre : " + tagl$(4) Print "Durée : " + d$ Print "Album : " + tagl$(6) Print "Année : " + tagl$(7) Print "Piste : " + tagl$(8) Print "Genre : " + tagl$(9) Return | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilisation de PLAY Lun 21 Sep 2009 - 17:58 | |
| Salut JL35, Jai essayer ton code, mais il plante immédiatement (il y a une fin de processus, gerée par Windows, immédiate). A+ | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilisation de PLAY Lun 21 Sep 2009 - 20:29 | |
| Salut Jean Claude, merci d'avoir essayé.
Je précise que le code doit être compilé en .exe et lancé comme tel, puisqu'il attend un paramètre, Param_Value$(1) qui doit être soit un fichier mp3, soit une liste (.m3u) de fichiers mp3. Sans paramètre donné il va tout de suite au Terminate. J'ai supposé également que ces fichiers sont tous dans un même répertoire qu'il faut préciser dans rep$, qu'il faut avoir installé quelque part Tag.exe et préciser son chemin d'accès dans Fichtag$, et donner le chemin d'accès à un fichier temporaire dans Fichresul$
Certes, il faudrait paramétrer tout ça, mais c'était surtout pour faire un essai, l'environnement est facile à modifier.
Pour faire un essai sans compiler, il faut ôter le If Param_Number et son End_If, et remplacer le p$ = Param_Value par p$ = le nom d'un fichier mp3 ou m3u. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Utilisation de PLAY Mar 22 Sep 2009 - 9:00 | |
| - Citation :
- Y a-t-il un moyen de savoir quand le Play est terminé pour attendre et enchaîner seulement à ce moment-là ?
Dans l'état actuel, il n'y a aucun moyen. - Citation :
- Bien sûr, ce serait mieux si M. PANORAMIC nous créait une possibilité de gérer la file sonore, mais on va pas être trop exigeant.
J'ai codé et testé une commande PLAY_WAIT qui joue le son et qui attend la fin pour redonner la main à l'application. - Code:
-
sound 1 file_load 1,"son1.wav" play_wait 1 file_load 1,"son2.wav" play_wait 1:rem ou play 1 tout simplement Les 2 sons son1.wav et son2.wav sont joués l'un après l'autre. Cette commande sera disponible dans une version de travail (version "instantanée") qui sortira dans quelques jours. Je ne veux pas anticiper, mais cette version aura aussi: - le point-virgule utilisable dans print (print a;b;"aaa";c$ qui équivaut à print str$(a)+str$(b)+"aaa"+c$), - l'apostrophe pour mettre un commentaire (tout comme rem), - deux nouvelles commandes Excel, - un input modifié (affichage sur la ligne de saisie), - peut-être un nouvel objet: SPIN (si le codage est suffisamment avancé), etc. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilisation de PLAY Mar 22 Sep 2009 - 14:18 | |
| Je crois comprendre que le PLAY était plutôt dans l'esprit de jouer un fond sonore pendant qu'on faisait autre chose (jeux par exemple), dans ce cas on s'en fiche de savoir quand c'est fini. Mais dans mon cas, le Play_Wait devrait me convenir tout à fait et simplifier mon programme au maximum. PS ce que je ne saisis pas bien, c'est comment tu gères le play_wait s'il n'y a aucun moyen de savoir quand le play est terminé ?
Bonnes nouvelles aussi pour le ';', l'apostrophe etc. Que du bon, comme toujours, merci Jack. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Utilisation de PLAY Mar 22 Sep 2009 - 16:40 | |
| - Citation :
- ce que je ne saisis pas bien, c'est comment tu gères le play_wait s'il n'y a aucun moyen de savoir quand le play est terminé ?
C'est archi simple. Pour jouer un son (ou une musique), j'appelle des API Windows. Pour PLAY, je demande à Windows lors de l'appel qu'il rende la main immédiatement à l'application. Le son ou la musique sont alors joués "en arrière plan". Dans le cas de PLAY_WAIT, je demande à Windows de ne rendre la main à l'application que lorsque le son ou la musique est terminé. Je ne connais pas du tout la durée pendant laquelle le son ou la musique sera joué, c'est Windows qui se débrouille: on demande un "service" et c'est Windows qui gère. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Utilisation de PLAY Mar 22 Sep 2009 - 16:57 | |
| D'accord, je comprends. Question à mille francs: et si on voulait interrompre le morceau en cours, un genre de PLAY_STOP (attention, j'ai pas dit PLAY_MATE mais ça pourrait, comme mat aux échecs), par exemple pour faire une pause, ou passer au suivant, ou revenir au précédent, ou simplement tout arrêter prématurément ? | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Utilisation de PLAY Mar 22 Sep 2009 - 17:10 | |
| Pourtant PLAY_MATE c'était sympa. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Super Mer 23 Sep 2009 - 19:20 | |
| Super, les perspectives ! J'attend avec impatience la version 9.15 ! | |
| | | Contenu sponsorisé
| Sujet: Re: Utilisation de PLAY | |
| |
| | | | Utilisation de PLAY | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |