Page 1 sur 1

Afficher une forme d'onde d'un fichier ogg.

Publié : jeu. 26/août/2021 7:35
par hub73
Bonjour à tous.

Afin d'améliorer notre logiciel webradio de diffusion maison, ce serait cool de pouvoir travailler plus finement sur les transitions de fichiers sonores lus.
D'ou l'idée de pouvoir afficher la forme d'onde d'un fichier sonore au format OGG, pour faciliter le choix de positionnement d'un 'fade in ou fade out'. Egalement positionner un marqueur pour indiquer à l'animateur quand commence le chant (pour éviter qu'il parle dessus). Cela dans le logiciel d'édition de la playliste de la webradio, antérieur à celui de diffusion, si le code de génération de la forme d'onde est un peu lent, ce n'est pas trop grave.

pour vous donner une idée : https://www.radiodj.ro/wp-content/uploa ... editor.png

Je recherche sur les forums mais je ne trouve rien. Peut être est-t-il temps de passer via une librairie tierce genre FMOD ou BASS ?
D'ailleurs pensez vous que çà vaille le coup d'utiliser FMOD ou BASS en 'inclusion' du code purebasic pour lire les sons plutôt que la librairie 'sound' interne ?

Merci à vous. Notre webradio associative vous remercie de toute l'aide que vous nous apportez, cela à fait avancer le projet.

http://www.radiolesfloralies.fr

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : jeu. 26/août/2021 17:05
par hub73
Je tente de remplacer dans mon code les commandes de la librairie interne 'sound' par celles de FMOD.
(https://github.com/pbcodex/FMODEX)

Savez-vous quelle commande FMOD remplace :

if IsSound (Son) <> 0

et

SoundStatus(Son)

?

Merci.

Code initial :

Code : Tout sélectionner

     If IsSound (gSonLu) <> 0
     
       Select SoundStatus(gSonLu)
           
         Case #PB_Sound_Stopped
           
               Phrase$ = Phrase$ + " Son arrêté "
           
         Case #PB_Sound_Playing
           
             Position = GetSoundPosition(gSonlu, #PB_Sound_Millisecond)
             TempsTotal = SoundLength(gSonlu, #PB_Sound_Millisecond)
             Phrase$ = Phrase$ + "Lecture en cours : " + Convertion_affichage_temps(Position) + " - Total : " + Convertion_affichage_temps(TempsTotal) + " - " + "Reste : " + Convertion_affichage_temps(TempsTotal-Position)   
           
         Case #PB_Sound_Paused 
           
             Position = GetSoundPosition(gSonlu, #PB_Sound_Millisecond)
             TempsTotal = SoundLength(gSonlu, #PB_Sound_Millisecond)
             Phrase$ = Phrase$ + "Lecture en pause : " + Convertion_affichage_temps(Position) + " - Total : " + Convertion_affichage_temps(TempsTotal) + " - " + "Reste : " + Convertion_affichage_temps(TempsTotal-Position)  
             
       EndSelect
       
     EndIf

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : jeu. 26/août/2021 18:07
par venom
Bonjour,

Falsam a donner un lien pour utiliser fmod / PB. Je sais qu'il y a des exemples fourni. Mais afficher l'onde directement avec PB, je ne sais pas si ça a déjà était fait.

Je sais qu'à l'époque zapman avait commencé un soft de musique. A voir sur le forum Français ou anglais.







@++

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : jeu. 26/août/2021 21:30
par hub73
Merci Venom. J'ai testé SoundEditor de Zapman. Un éditeur de Son, cela fonctionnait avec des fichier WAV. Le Ogg semble plus difficile à analyser. J'ai effectué des recherches toute l'après midi et je n'ai rien trouvé de probant à exploiter. Donc je vais renoncer.

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : jeu. 26/août/2021 21:43
par venom
hub73 a écrit : jeu. 26/août/2021 21:30J'ai testé SoundEditor de Zapman.
Ah merci du nom. C'était ça :D






@++

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : mer. 01/sept./2021 16:03
par jmg49
Bonjour,

j'avais fait ça avec le fmodex(short).pbi il y a un moment, je te mets l'extrait du code si ça peut aider,

Code : Tout sélectionner


FMOD_System_Create(@fmodsystem)

FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
File.s = "myfile.mp3"

Dim WaveArray.f(1024)
FMOD_System_CreateStream(fmodsystem, @File, #FMOD_SOFTWARE, 0, @sound)
FMOD_System_PlaySound(fmodsystem, #FMOD_CHANNEL_FREE, sound, 0, @channel)

;----MainLoop---------------------------------------------------------------


Repeat
  
  event=WindowEvent()         
  
 FMOD_Channel_GetWaveData(Channel, WaveArray(), 1024, 0)
   
   
 StartDrawing(CanvasOutput(#spectrum))
    
     
  DrawingMode(#PB_2DDrawing_Transparent) 
  Box(0, 0, 1026, 500,0) 
    
    
  DrawingMode(#PB_2DDrawing_Default)
    For i=1 To 1024
      YOldWave=(WaveArray(i-1)+1)*250
      YCurrentWave=(WaveArray(i)+1)*250
      LineXY(i-1,YOldWave,i,YCurrentWave,RGB(0,200,50))
      LineXY(i-1,YOldWave+1,i,YCurrentWave+1,RGB(0,90,50))
      LineXY(i-1,YOldWave-1,i,YCurrentWave-1,RGB(0,110,50))
    Next 
    
    StopDrawing()
    
          
 
 
 
 
 Until GetAsyncKeyState_(#VK_ESCAPE)

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : ven. 03/sept./2021 7:15
par hub73
Merci jmg49. J'ai testé le programme de l'oscillo et j'ai regardé son code source, c'est vraiment utile.
Par contre je ne sais pas pourquoi je ne parviens pas à faire fonctionner l'extrait ce code (modifié) pour tester. J'ai complété un peu, réalisé un formulaire avec un canvas appelé 'spectrum' . Mais aucun son et affichage se produit. (fichier ogg ou mp3). Si quelqu'un peut m'indiquer si le code suivant est correct ou pas et fonctionne pour lui (en changeant le fichier lu). Merci.

Code : Tout sélectionner

XIncludeFile "formulaire_onde.pbf"

IncludeFile "fmodex(short).pbi"

Global fmodsystem.i, Channel.i, Sound.i, Volume.f = 0.5, PauseStatus.b,Analyse,Mutex,Length.i,Name.s,CurrentPos.i
Global File.s,thBSWContinue,PinState

FMOD_System_Create(@fmodsystem)

FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
File.s = "C:\Users\Borne\Documents\Developpement\radio_programmation_purebasic\prod01.mp3"

Dim WaveArray.f(1024)

;----MainLoop---------------------------------------------------------------

OpenWindow_0 (0,0)

FMOD_System_CreateStream(fmodsystem, @File, #FMOD_SOFTWARE, 0, @sound)
FMOD_System_PlaySound(fmodsystem, #FMOD_CHANNEL_FREE, sound, 0, @channel)

FMOD_Channel_SetVolume(Channel, 1.0)

Repeat
  
  event=WindowEvent()         
  
 FMOD_Channel_GetWaveData(Channel, WaveArray(), 1024, 0)
   
   
 StartDrawing(CanvasOutput(spectrum))
    
     
  DrawingMode(#PB_2DDrawing_Transparent) 
  Box(0, 0, 1026, 500,0) 
    
    
  DrawingMode(#PB_2DDrawing_Default)
    For i=1 To 1024
      YOldWave=(WaveArray(i-1)+1)*250
      YCurrentWave=(WaveArray(i)+1)*250
      LineXY(i-1,YOldWave,i,YCurrentWave,RGB(0,200,50))
      LineXY(i-1,YOldWave+1,i,YCurrentWave+1,RGB(0,90,50))
      LineXY(i-1,YOldWave-1,i,YCurrentWave-1,RGB(0,110,50))
    Next 
    
    StopDrawing()
 
  Until GetAsyncKeyState_(#VK_ESCAPE)
  

Code : Tout sélectionner

;
; This code is automatically generated by the FormDesigner.
; Manual modification is possible to adjust existing commands, but anything else will be dropped when the code is compiled.
; Event procedures needs to be put in another source file.
;

Global Window_0

Global Spectrum


Procedure OpenWindow_0(x = 0, y = 0, width = 600, height = 400)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  Spectrum = CanvasGadget(#PB_Any, 10, 70, 570, 210)
EndProcedure

Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : ven. 03/sept./2021 8:07
par Marc56
Je n'ai aps exploré ton code, mais en attendant, ici, tu trouveras un autre exemple de spectro utilisant Fmodex
(c'est pour les webradio, mais le principe est identique))
https://www.purebasic.fr/french/viewtop ... =6&t=16135
Dans l'archive: Fmod Ex - Play Shoutcast(Add tags & Spectrum).pb
:wink:

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : mer. 22/sept./2021 19:04
par hub73
MErci !

Re: Afficher une forme d'onde d'un fichier ogg.

Publié : lun. 11/oct./2021 17:08
par hub73
Finalement je n'ai pas eu besoin de l'onde sonore pour déterminer le point d'entrée et de sortie lorsqu'une personne chante sur un morceau. C'est aussi bien à l'oreille. Par contre j'ai bien examiné le code et j'ai pu inclure un visuel dans le programme de diffusion de la webradio qui utilise maintenant FMOD. Trop bien, merci encore !