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

Codes specifiques à Windows
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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

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







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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.
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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

Message 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






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
jmg49
Messages : 153
Inscription : mer. 26/févr./2014 8:53

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

Message 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)
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

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

Message 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:
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message par hub73 »

MErci !
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

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

Message 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 !
Répondre