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 |
|
|
| Lecteur de musique | |
| | Auteur | Message |
---|
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Lecteur de musique Sam 1 Juil 2023 - 20:13 | |
| Ce programme est plutôt un exercice de style, pour s'amuser. Une sorte de devoir de vacances, pour ne pas perdre la main. C'est l'équivalent d'un lecteur de CD, sauf que les CD ont été enregistrés sur disque dur ou clé USB. Et ça a l'avantage d'être en langage panoramic ! Choisissez un répertoire où il y a des mp3, et c'est parti pour l'écoute votre musique préférée ! Si vous ne trouvez pas un tel répertoire dans votre machine, j'ai inclu une douzaine de morceaux qui accompagne ce pg. (il est sur le website d'identifiant panoramic@jjn42) Bonne relaxation musicale ! PS: Et souvenez-vous à quel point j'adore les tiroirs secrets de façon immodérée...
Dernière édition par jjn4 le Mar 12 Sep 2023 - 17:59, édité 3 fois | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Lecteur de musique Sam 1 Juil 2023 - 21:06 | |
| En fait, ce programme comporte un petit problème que je ne sais pas résoudre : J'ai applique ce qu'on m'a conseillé, remplaçant le play_wait par un simple play avec calcul de la durée du mp3 afin d'arrêter l'écoute au bon moment tout en pouvant faire plein d'autres opérations (arrêter, passer au suivant...). Pour cela, j'ai repris la formule que Marc m'avait donnée durant la construction du programme Philharmusique - voir l'adresse suivante : https://panoramic.1fr1.net/t6763-defi-mp3J'y avais déjà remarqué qu'il y avait quelquefois des erreurs, mais comme c'était rare et que cela ne faisait que rajouter à des faibles durées, j'avais trouvé cela sans importance. Mais là, pour des mp3 plus longs, je me retrouve avec des différences de temps importantes, ce qui est plus gênant. Par exemple : (j'ai accompagné mon logiciel de 12 mp3 à titre d'illustration) et j'en ai rajouté deux autres pour montrer l'inconvénient décrit ci-dessus : Albrechtsberger Johann Georg 12 Préludes.mp3 Hear my prayer by Mendelssohn.mp3 Le premier dure 19 min 52 sec et le deuxième : 11 min 56 sec. Mais la formule utilisée donne : 31 min 49 sec pour le premier et 19 min 07 sec pour le second, 11 min et 57 sec de différence pour le premier et 07 min 11 sec de trop pour le 2°. Et le pire est que cela arrive très souvent ! (je me demande si ceux avec qui cela fait cela ne sont pas des mp3 que j'ai chopés sur Internet ?) J'ai beau essayer de voir comment résoudre ce problème, mais... Le problème a l'air de venir de la routine suivante : (voir le listing de Lecteur-musique) - Code:
-
sub calcul() : rem Calcul de la durée du morceau de musique =================== dim_local octet1$, octet2$, octet3$, octet4$, index% dim_local quartet$, debit%, longueurAudio%, duree% filebin_open_read 1,CDR$+caption$(150) while octet1$ <> "FF" filebin_hexa_read 1,1,octet1$ if octet1$ = "FF" filebin_hexa_read 1,1,octet2$ if left$(octet2$,1) = "E" or left$(octet2$,1) = "F" filebin_hexa_read 1,1,octet3$ filebin_hexa_read 1,1,octet4$ exit_while end_if end_if octet1$ = "" end_while index% = filebin_pos(1) longueurAudio% = filebin_size(1) - index% filebin_close 1 quartet$ = left$(octet3$,1) debit% = BITRATE%(hex(quartet$)) * 1000 duree% = int(longueurAudio% * 8 / debit%) DT%=duree% M% = int(duree%/60) S% = ((duree%/60)-M%) * 60 caption 200,str$(M%)+" Min "+str$(S%)+" Sec"+string$(20," ")+"N° 1/"+str$(count(50)) end_sub | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Lecteur de musique Dim 2 Juil 2023 - 0:02 | |
| Bonsoir à tous ! - JJN4 a écrit:
- Mais là, pour des mp3 plus longs, je me retrouve avec des différences de temps importantes,
ce qui est plus gênant. Oui, c’est normal ! Dans l’article https://panoramic.1fr1.net/t6763-defi-mp3, j’ai bien précisé que : - Marc a écrit:
- Le programme ne fonctionne qu’avec un MP3 contenant qu’un seul et unique fichier audio de type MPEG version 1 (ISO/IEC 11172-3) layer III.
Or, le fichier « Albrechtsberger Johann Georg 12 Préludes.mp3 » est un MPEG version 1 layer I. Ce n’est pas la même table de débit binaire ce qui explique le mauvais calcul de durée. Pour remédier à cela, je vais ajouter la prise en charge des : - MPEG 1 layer I - MPEG 1 layer II - MPEG 2 layer I - MPEG 2 layer II - MPEG 2 layer III - MPEG 2.5 layer I - MPEG 2.5 layer II - MPEG 2.5 layer III ... et, si je ne me trompe pas, tout devrait rentrer dans l'ordre ! Je suis absent dimanche, je le ferai lundi. Bon week-end à tous ! EDIT :@JJN4 J’ai essayé ton nouveau programme. Bravo ! il est sympa avec une belle présentation. Le légende «Volume» serait à supprimer, je pense : A bientôt ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Lecteur de musique Dim 2 Juil 2023 - 14:37 | |
| - Marc a écrit:
- Le légende «Volume» serait à supprimer
Effectivement, petit oubli de remise à zéro d'une variable... Je corrigerai à la prochaine version. Merci de tes remarques et aussi d'avance pour ton aide ! | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Lecteur de musique Lun 3 Juil 2023 - 18:22 | |
| Bonjour à tous ! @JJN4 Voici une nouvelle version pour le calcul de la durée d’un fichier MP3. A tester ! - Code:
-
' Durée fichier audio MP3 ' Marc - Juillet 2023 ' Ecrit en langage PANORAMIC 0.9.29.i9
dim buffer%(32), bitRate%(16,2), l%, c%, stringHexa$, nomFichier$, tailleFichier%, index% dim longueurTagID3v1%, longueurTagID3v2%
label ouvrirFichierMP3
' MPEG 1 layer III data 0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0
' MPEG 2 et 2.5 layer III data 0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0
' Charger les datas ci-dessus dans le tableau bitRate%(a,b) for c% = 1 to 2 for l% = 0 to 15 read bitRate%(l%,c%) next l% next c%
interfaceUtilisateur()
end ' ------------------------------------------------------------------------------ sub interfaceUtilisateur() button 1 top 1,20 left 1,200 caption 1,"MP3" on_click 1,ouvrirFichierMP3 open_dialog 2 filter 2,"Fichier MP3 (*.mp3)|*.mp3" end_sub ' ------------------------------------------------------------------------------ ouvrirFichierMP3: nomFichier$ = file_name$(2)
if nomFichier$ = "_" return end_if
' ouvrir le fichier sélectionné en lecture filebin_open_read 10,nomFichier$
RechercherPresenceTagID3v1() RechercherPresenceTagID3v2() RechercherEnteteMPEG() return ' ------------------------------------------------------------------------------ sub RechercherPresenceTagID3v1() longueurTagID3v1% = 0 index% = filebin_size(10) - 128 filebin_position 10,index% stringHexa$ = filebin_hexa_read$(10,128)
if left$(stringHexa$,6) = "544147" longueurTagID3v1% = 128 end_if end_sub ' ------------------------------------------------------------------------------ sub RechercherPresenceTagID3v2() index% = 0 longueurTagID3v2% = 0 filebin_position 10,index% stringHexa$ = filebin_hexa_read$(10,10)
if left$(stringHexa$,6) = "494433" :' "ID3" en hexa ' calcul de la longueur du tag ID3v2. 4 octets codés sur 7 bits. Big-endian longueurTagID3v2% = hex(mid$(stringHexa$,13,2)) * power(128,3) longueurTagID3v2% = longueurTagID3v2% + hex(mid$(stringHexa$,15,2)) * power(128,2) longueurTagID3v2% = longueurTagID3v2% + hex(mid$(stringHexa$,17,2)) * 128 longueurTagID3v2% = longueurTagID3v2% + hex(mid$(stringHexa$,19,2)) longueurTagID3v2% = longueurTagID3v2% + 10 :' (10 = les dix octets de l'entête) end_if end_sub ' ------------------------------------------------------------------------------ sub RechercherEnteteMPEG() dim_local octet1$, octet2$, octet3$, octet4$, longueurAudio%, quartet$, debit%, duree%, mn%, sec%, versionMPEG% ' sauter un éventuel tag IDV3 v2 index% = longueurTagID3v2% filebin_position 10,index%
' recherche de la séquence de synchronisation composée de 11 bits successifs à 1 while octet1$ <> "FF" filebin_hexa_read 10,1,octet1$ if octet1$ = "FF" :' les huit premiers bits sont à 1 filebin_hexa_read 10,1,octet2$ if left$(octet2$,1) = "E" or left$(octet2$,1) = "F" :' les 3 bits de poids fort sont à 1 filebin_hexa_read 10,1,octet3$ filebin_hexa_read 10,1,octet4$ exit_while end_if end_if octet1$ = "" end_while
' calcul de la longueur des données audio MP3 index% = filebin_pos(10) longueurAudio% = filebin_size(10) - index% - longueurTagID3v1%
' déterminer la version de MPEG (1, 2 ou 2.5, codée par les bits 3 et 4 de l'octet 2) ' test uniquement du bit 3 : s'il est à 0 c'est un MPEG v2 ou v2.5 versionMPEG% = (bin_and(hex(octet2$),8)) if versionMPEG% = 8 versionMPEG% = 1 else versionMPEG% = 2 end_if ' Déterminer la version de layer (I, II ou III, codée par les bits 1 et 2 de l'octet 2) ' La version de layer n'est pas recherchée : la norme MP3 impose le layer III
' Déterminer le débit binaire quartet$ = left$(octet3$,1) debit% = bitRate%(hex(quartet$),versionMPEG%) * 1000
' calcul de la durée duree% = longueurAudio% * 8 / debit%
mn% = int(duree%/60) sec% = ((duree%/60)-mn%) * 60 print "Durée estimée : " + str$(mn%) + "min " + str$(sec%) + "s"
' fermer le fichier binaire filebin_close 10
end_sub ' ------------------------------------------------------------------------------
EDIT ce jour à 21h40 :J’ai modifié le code source ci-dessus pour pouvoir effectuer plusieurs mesures d’affilées (remise à zéro de deux variables). Dans la SUB RechercherPresenceTagID3v1() => Ajout en début de sub : longueurTagID3v1% = 0 Dans la SUB RechercherPresenceTagID3v2() => Ajout en début de sub : longueurTagID3v2% = 0 | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Lecteur de musique Mar 4 Juil 2023 - 16:12 | |
| | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Lecteur de musique Mer 5 Juil 2023 - 18:53 | |
| Bravo JJN 4 !
C’est un bel utilitaire ! Je l’ajouterai à la logithèque Panoramic.
| |
| | | Contenu sponsorisé
| Sujet: Re: Lecteur de musique | |
| |
| | | | Lecteur de musique | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |