Page 1 sur 2

Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 11:25
par JohnJohnsonSHERMAN
Enflammez vos hauts-parleur !!

Quoi de mieux qu'un joli effet de musique incandescente pour ca?
Bon allez on revient sur Terre : ce petit code tiré d'un exemple d'effet de feu (de Flype il me semble) affiche un effet d'incendie en fonction du spectre en fréquences de la musique en cours de lecture, avec des couleurs incandescentes... Joli non? 8) :lol:

Code : Tout sélectionner

;=================================================================
;= SoundFlame par JohnJohnsonSherman, inspiré d'un code de Flype.=
;=================================================================

EnableExplicit

#W = 200
#H = 200
#Z = 2

IncludeFile "fmodex(short).pbi"

Global Dim pix.l(#W+2, #H+2),Channel.l,Sound.l,FmodSystem.l,File.s

File = OpenFileRequester("Selectionner un fichier mp3","","Musique|*.mp3;*.wav;*.ogg;*.flac",0)
;====================================

Procedure FireEffect_Calc()
  Protected x, y
  For y = 0 To #H + 1
    For x = 1 To #W - 1
      pix(x, y) = (pix(x-1, y) + pix(x+1, y) + pix(x, y+1) + pix(x, y+1)) >> 2
    Next
  Next
EndProcedure

Procedure FireEffect_Draw()
  Protected x, y, res, red, green, blue
  If StartDrawing(CanvasOutput(0))
    For y = 0 To #H - 1
      For x = 0 To #W - 1
        res=pix(x, y)
        If res > 255 ;Incandescence : plus la valeur est élevée, pluson ajoute du vert (>jaune) puis du bleu (>blanc).
          red=255
          green=res-255
          If green > 255
            blue=green-255
            green=255
            If blue > 255
              blue = 255
            EndIf
          Else
            blue=0
          EndIf 
        Else
          red=res
          green=0
        EndIf
        ;Box(x*#Z, y*#Z, #Z, #Z, RGB(red,green,0))
        Box(x*#Z, y*#Z, #Z, #Z, RGB(red,green,blue));(Pow(2,255)/Pow(2,red))*255,0))
      Next
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure FireEffect_Feed()
  Protected i,Dim Spectrum.f(256),corr.f
  FMOD_Channel_GetSpectrum(Channel,Spectrum(),256,0,1)

  For i = 1 To 200 Step 1
    corr=3.5/(1+4.43*Exp(-0.037*i)) ;Fonction logarithme amorti ou logistique (f(x)=b/(1+a e^-cx)).
    pix(i, #H+2) =(Spectrum(i)*25500)*corr;corr perment de corriger rapidement la trop forte représentation des basses par le FFT de Fmod. (FFT = Fourier Frequency Transformation, il me semble).
  Next
EndProcedure

Procedure FireEffect_Update()
  FireEffect_Calc()
  FireEffect_Feed()
  FireEffect_Draw()
EndProcedure

;====================================

If OpenWindow(0, 0, 0, #W*#Z, #H*#Z, "Fire Effect", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, #W*#Z, #H*#Z)
  AddWindowTimer(0, 0, 5)
  BindEvent(#PB_Event_Timer, @FireEffect_Update(), 0, 0)
  ;Tout le blabla pour Fmod
  FMOD_System_Create(@FmodSystem)
  FMOD_System_Init(FmodSystem,16,#FMOD_INIT_NORMAL,0)
  FMOD_System_CreateStream(FmodSystem,@File,#FMOD_SOFTWARE,0,@Sound)
  FMOD_System_PlaySound(FmodSystem,#FMOD_CHANNEL_FREE,Sound,0,@Channel)
  FMOD_Channel_SetVolume(Channel,80)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  FMOD_Channel_Stop(Channel)
  FMOD_System_Release(FmodSystem)
EndIf

;====================================
Et voila pour aujourd'hui ! 8)

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 11:55
par Micoute
ça ne fonctionne pas chez moi.

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 12:18
par JohnJohnsonSHERMAN
Précise? :? Il met quoi comme erreur?

:idea: :idea: Attention , toujours compiler sans l'unicode quand on utilise FMOD ! Cf topic de falsam la dessus... http://www.purebasic.fr/french/viewtopi ... 5&start=45 (pages 3, 4 et 5)

(je suis quasiment sûr a 100% que t'est en unicode :mrgreen: )

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 14:52
par Micoute
Ce n'est pas une question d'Unicode puisque je suis en version 5.50.

Le seul problème qui se présente, c'est quand je charge un fichier mp3, on a l'impression qu'il n'est pas lu, car il ne se passe rien sans que le programme ne soit planté, alors qu'avec ton programme Oscillo_2_0, c'est magique.

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 15:57
par falsam
je pense qu'il manque la procédure MeasureHiResIntervalStart()

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 17:02
par Ar-S
JohnJohnsonSHERMAN a écrit :Précise? :? Il met quoi comme erreur?

:idea: :idea: Attention , toujours compiler sans l'unicode quand on utilise FMOD ! Cf topic de falsam la dessus... http://www.purebasic.fr/french/viewtopi ... 5&start=45 (pages 3, 4 et 5)

(je suis quasiment sûr a 100% que t'est en unicode :mrgreen: )
J'ai pas testé mais si micoute utilise la 5.50, il faut le fmodex_min de falsam et adapter le code en 5.50. Sinon Micoute, tu dois le tester en 5.42 sans unicode.

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 17:27
par JohnJohnsonSHERMAN
Exactement...

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 17:27
par falsam
Micoute a écrit :Ce n'est pas une question d'Unicode puisque je suis en version 5.50.
Je confirme ce que dit Ar-S et JohnJohnsonSHERMAN. Le code proposé n'est pas compatible avec la version 5.50 Beta.

Vas dans les paramètres de compilation et décoche la case de prise en charge unicode.

Ceci dit, sans la procédure MeasureHiResIntervalStop(), le code ne fonctionnera pas.

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 17:35
par JohnJohnsonSHERMAN
MeasureHiResIntervalStop()? Elle y est, regarde un peu plus haut, dans mon code...

Récapitulons : MeasureHiResIntervalStart() et MeasureHiResIntervalStop() sont toutes les deux présentes dans mon code... ca fait partie de la Droopy lib, si tu ne la posséde pas, supprime ces deux fonctions. Elles ne servent a rien, si ce n'est que j'ai remarqué qu'elles accéléraient mon code quand j'utilise FMOD_Channel_GetSpectrum().

PB 5.50 ne supporte plus l'Ascii. Si tu veux compiler en Ascii, il faut reprendre PB 5.42, ou utiliser le fmod mini.pbi (sur ce même forum), qui te permet d'utiliser FMOD avec l'unicode (cela dit je ne sait pas si tout y est). En tout cas impossible d'utiliser FMOD avec l'include classique (celui que je fournis dans le zip, cf Analyse de son avec Fmodet mon Oscillo) tout en restant avec PB 5.50 ou en Unicode... Je ne sait pas si vous avez suivi, mais moi, si ... :mrgreen:

Edit : OOOps :oops: j'ai pas mis le zip avec l'include et les dlls... Enregistrez le code dans le même répertoire que là ou vous avec décompressé le Zip de l'Oscillo, si vous ne l'avez pas, téléchargez le...

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 17:54
par falsam
JohnJohnsonSHERMAN a écrit :MeasureHiResIntervalStop()? Elle y est, regarde un peu plus haut, dans mon code...
Ben non cette procédure ne se trouve pas dans ton code figurant dans le premier message.

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 18:07
par JohnJohnsonSHERMAN
Excuse moi du quiproco, :oops: je pensais que tu diasait que ces fonctions manquaient, masi non, en fait tu pensait qu'il s'agissait de procédures... Et bien non :
MeasureHiResIntervalStart() et MeasureHiResIntervalStop() sont toutes les deux présentes dans mon code... ca fait partie de la Droopy lib
Ce ne sont pas des fonctions indispensables, tu peux les virer, ca fonctionnera toujours...

Ah au fait, il y a un timer de 5ms dans mon code. Mettez 50 ou 25 ms a la place, sinon ca bouffe tout le proco :roll:

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 18:09
par GallyHC
Bonjour,

Comme le dit "Falsam", je ne vois pas non plus la procédure "MeasureHiResIntervalStop()" dans le code de début. Après un Zip complet serait surement le bienvenu (Si on doit tout chercher copier coller, ect...), ça donne pas envi de faire le test.

Cordialement,
GallyHC

Ré-edit :

Si tu ne le dit pas, comment veux tu que l'on sache que tu utilise la "Droopy-Lib"? A utiliser des lib comme cela, ça empêchera certain comme moi pour faire le test.

Re: Enflammez vos haut-parleurs !

Publié : ven. 24/juin/2016 18:39
par JohnJohnsonSHERMAN

Code : Tout sélectionner

Procedure FireEffect_Feed()
  MeasureHiResIntervalStart();je ne sait pas pourquoi mais chez moi ca accélére l'appel au spectre par Fmod.
  Protected i,Dim Spectrum.f(256),corr.f
  FMOD_Channel_GetSpectrum(Channel,Spectrum(),256,0,1)

  For i = 1 To 200 Step 1
    If i<20
      corr=0.5
    Else
      corr=1.4
    EndIf
    pix(i, #H+2) =(Spectrum(i)*25500)*corr;corr perment de corriger rapidement la trop forte représentation des basses par le FFT de Fmod. (FFT = Fourier Frequency Transformation, il me semble).
  Next
  MeasureHiResIntervalStop()<<<<Juste ici...
EndProcedure
 
Et j'avais oublié au moment où j'ai posté mon code que ca venait de la Droopy lib...

Quant au zip si je ne l'ais pas mis, c'est que je préfére avoir à bouger ma souris de quelques centimétres de plus pour aller en chercher un autre, plutôt que de se retrouver avec 36000 fois les mêmes includes et les mêmes dlls de FMOD un peu partout sur mon ordi... Je vais faire un zip universel de FMOD et je reviens avec...

Edit : Le zip qui fournit tout ce qui est nécessaire à FMOD est ici (en bas de page).
Edit 2 : Le code a été corrigé sans les deux fonctions de la Droopy Lib.

Re: FmodEx Minimum Unicode

Publié : sam. 25/juin/2016 12:46
par JohnJohnsonSHERMAN
Bon, concernant les petits problémes quil y a eu hier soir pour tester certains de mes exemples, dûs au manque de zips appropriés, j'ai posté sur mon site un zip qui contient les deux dlls de FMOD, l'include complet (a compiler en Ascii), mon include réduit (celui du zip de l'oscillo, en Ascii aussi), et l'include qui fait l'objet de ce sujet (en Unicode, PB 5.50). L'aide de Fmod y est aussi.
Il est ici (en bas).
(en gros c'est le même zip que celui de falsam en haut, avec mon include réduit perso en plus :D )

Faudrait se faire un include complet, avec toutes les fonctions de Fmod, en Unicode et tout, comme ca ce serait plus simple... mais ca risque d'être loong :roll:

Re: Enflammez vos haut-parleurs !

Publié : sam. 25/juin/2016 13:15
par falsam
JohnJohnsonSHERMAN a écrit :Faudrait se faire un include complet, avec toutes les fonctions de Fmod, en Unicode et tout, comme ca ce serait plus simple... mais ca risque d'être loon
PureBasic 5.50 n'étant qu'en phase Beta, je pense qu'il vaudrait mieux attendre la version définitive de cette nouvelle version.