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?
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
;====================================