Ich hoffe dass ich hier richtig bin, ansonsten bitte ins richtige Forum verschieben.
Ich bastle seit einiger Zeit mit der fmod.dll herum, und hab fast nichts aktuelles gefunden.
Deshalb stelle ich hier einen Aktuellen Source zur Verfügung, damit andere die sich auch mit FMOD
beschäftigen wollen, nicht soooo viele Stunden beim suchen und kombinieren verschwenden.
Hier der dazupassende Wrapper:
http://www.music-convoy.at/PB/FMOD01/newfmodex2010a.pb
Die fmod.dll giebt bei:
http://www.fmod.org/
Wo es auch ein brauchbares Forum giebt, wenn man speziellere Fragen hat!
Bitte verzeiht den Programmierstiel, es ist nur ein Beispiel...
Code: Alles auswählen
; Erneuert am 15.April.2010
; Author: Arrag0n
; fmod.dll Version: 0.4.30.1
; PB Version: 4.40 Beta 6
; Zum Kompilieren braucht Ihr den FMOD-Wrapper von Perkin und die fmod.dll
; Zum Testen hab ich auch einige anderen DSP-Effekte dazugepackt(es giebt noch mehrere...)
;
; Damit man dieses Beispiel wirklich versteht, braucht man auf jeden Fall die Doku zu FMOD.
; Dies soll nur eine kleine Hilfestellung für dijenigen sein, die neu sind und sich mit
; Soundprogrammierung beschäftigen wollen.
;
; Zur Spectrumanzeige mit FMOD ist noch folgendes zu sagen:
; (Dieser Text ist aus dem FFT-Exampel von Froggerprogger)
; Das Spektrum wird direkt so wie es von Fmod zurückgeliefert wird anzeigt.
; Zur Optimierung könntest Du auch lediglich die Werte 0-255 anzeigen (also nur bis etwa 11kHz).
;
; Generell ist da das Problem, das die x-Achse lieber logarithmisch visualisiert sein sollte, da ja eine
; Oktave eine Verdopplung der Frequenz bedeutet und man somit einen gleichwertigen und vernünftigeren
; Überblick hätte.
; Die FFT kann jedoch nur linear arbeiten. D.h. für das Intervall von z.B. 20Hz - 1280 Hz (6 Oktaven)
; erhalten wir genausoviele Testergebnisse, wie für den Bereich 10020 Hz - 11280 (ca. 1 Halbton).
; Diese Ergebnisse mußt Du auf der x-Achse also noch dementsprechend stauchen und ggf. interpolieren.
; Die Y-Achse sollte villeicht mit Steigender Frequenz Logarithmisch verstärkt werden.
; Bringt die besten Ergebnisse...
;
; Ach noch was...
; Fehlermeldung:An invalid speaker was passed to this function based on the current speaker mode.
; Hat nichts mit dem Speakermode zu tun, sondern heist, dass statt eines Pointers, Null Übergeben wurde.
; ---------------------------------------------------------------------------------------------------
; Originalbeispiel von...
; Author: nicolaus
; Date: 21. Januar 2005
; um das beispiel zu kompilieren und zu starten braucht ihr die FMOD-Wrapper-LIB
; und die fmod.dll (getestet wurde mit dll-version 3.7.4.0)
XIncludeFile "newfmodex2010a.pb"
Enumeration
#TrackBar_80
#TrackBar_170
#TrackBar_310
#TrackBar_600
#TrackBar_1000
#TrackBar_3000
#TrackBar_6000
#TrackBar_12000
#TrackBar_14000
#TrackBar_16000
#chk_dsplowpass
#chk_dsphighpass
#chk_dspecho
#chk_dspflange
#chk_dspdistortion
#chk_dspchorus
#chk_dspparameq
EndEnumeration
Global HardCh_1.l
Global system.l, Sound.l, channel.l, dsplowpass.l, dsphighpass.l, dspecho.l
Global dspflange.l, dspdistortion.l, dspchorus.l, dspparameq.l
Global system.l, sound.l, channel.l
Global result.l, FFTCounter.l
active.l
Global Dim EQBand.l(9)
Global Dim eqFreq.l(9)
eqFreq(0) = 80
eqFreq(1) = 170
eqFreq(2) = 310
eqFreq(3) = 600
eqFreq(4) = 1000
eqFreq(5) = 3000
eqFreq(6) = 6000
eqFreq(7) = 12000
eqFreq(8) = 14000
eqFreq(9) = 16000
Procedure.f Calculate_EQ_Gain(Value.f)
If Value < 5: Value = 5: EndIf
If Value > 100 ; Von 100 - 200 steigt der Wert von 1 auf 3 an
temp_value.f = Value * ((Value-100)*0.01)
ProcedureReturn (temp_value/100)+1
ElseIf Value <= 100 ; Von 5 - 100 steigt der Wert von 0,05 - 1 an (1 ist unverändert)
temp_value.f = Value / 100
ProcedureReturn temp_value
EndIf
EndProcedure
Procedure DrawSpectrum()
Protected Numchannels.l, count.l, count2.l
Protected PeakValue.f, actfftvalue.f, FFTGain.f
Protected Color.l = RGB(51,51,51)
Dim Spectrum1.f(256)
Dim Spectrum2.f(256)
Result = FMOD_System_GetSoftwareFormat(system, 0, 0, @Numchannels, 0, 0, 0)
FMOD_ErrCheck(Result, "FFT-Get Numchannels")
result = FMOD_System_GetSpectrum(system, @Spectrum1(0), 256, 0, FMOD_DSP_FFT_WINDOW_TRIANGLE)
FMOD_ErrCheck(Result, "FFT-Get Spectrum Channel: L")
If Numchannels > 1
result = FMOD_System_GetSpectrum(system, @Spectrum2(0), 256, 1, FMOD_DSP_FFT_WINDOW_TRIANGLE)
FMOD_ErrCheck(Result, "FFT-Get Spectrum Channel: R")
EndIf
StartDrawing(SpriteOutput(1)) ;Starts Drawing on the sprite
Box(0,0,512,200,RGB(88,99,114))
For a = 1 To 255
actfftvalue = ((Spectrum1(a) + Spectrum2(a)) / 2)*800
Box(a, (200 - actfftvalue), 1, actfftvalue, RGB(250,50,50))
Next a
StopDrawing() ; Stops drawing on the sprite
FlipBuffers()
DisplaySprite(1,0,0) ; Display the sprite
EndProcedure
;- INITIALISIERUNG
soundfile.s = OpenFileRequester("Wähle eine Musikdatei (wav, mp3,....)","","",0)
If soundfile = ""
End
EndIf
Result = FMOD_System_Create(@system)
FMOD_ErrCheck(Result, "System Create")
Result = FMOD_System_Init(system, 32, #FMOD_INIT_NORMAL , 0)
FMOD_ErrCheck(Result, "System Init")
Result = FMOD_System_CreateStream(system,@soundfile, #FMOD_SOFTWARE | #FMOD_2D | #FMOD_CreateSTREAM, 0, @sound) ; | #FMOD_2D | #FMOD_CreateSTREAM
FMOD_ErrCheck(Result, "CreateStream")
Result = FMOD_System_PlaySound(system, #FMOD_CHANNEL_FREE, sound, 0, @channel) ; | #FMOD_NONBLOCKING | #FMOD_ACCURATETIME
FMOD_ErrCheck(Result, "PlaySound")
If Result = #FMOD_OK
result = FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_LOWPASS, @dsplowpass)
FMOD_ErrCheck(result, "Create DSP")
result = FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_HIGHPASS, @dsphighpass)
FMOD_ErrCheck(result, "Create DSP")
result = FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_ECHO, @dspecho)
FMOD_ErrCheck(result, "Create DSP")
result = FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_FLANGE, @dspflange)
FMOD_ErrCheck(result, "Create DSP")
result = FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_DISTORTION, @dspdistortion)
FMOD_ErrCheck(result, "Create DSP")
result = FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_CHORUS, @dspchorus)
FMOD_ErrCheck(result, "Create DSP")
For i = 0 To 9
result = FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_PARAMEQ, @EQBand(i))
FMOD_ErrCheck(Result, "Create DSPa")
result = FMOD_System_AddDSP(system, EQBand(i), 0)
FMOD_ErrCheck(Result, "Create DSPb")
result = FMOD_DSP_SetParameter(EQBand(i), #FMOD_DSP_PARAMEQ_CENTER, eqFreq(i))
FMOD_ErrCheck(Result, "Create DSPc")
result = FMOD_DSP_SetParameter(EQBand(i), #FMOD_DSP_PARAMEQ_BANDWIDTH, 1)
FMOD_ErrCheck(Result, "Create DSPd")
result = FMOD_DSP_SetParameter(EQBand(i), #FMOD_DSP_PARAMEQ_GAIN, 1.0)
FMOD_ErrCheck(Result, "Create DSPe")
Next i
Else
End
EndIf
;- FENSTER
If OpenWindow(0, 216, 0, 820, 250, "FMOD Equalizer", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar )
TrackBarGadget(#TrackBar_80, 20, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_170, 60, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_310, 95, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_600, 130, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_1000, 165, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_3000, 200, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_6000, 235, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_12000, 270, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_14000, 305, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
TrackBarGadget(#TrackBar_16000, 340, 30, 20, 200, 0, 200, #PB_TrackBar_Vertical)
SetGadgetState(#TrackBar_80,100)
SetGadgetState(#TrackBar_170,100)
SetGadgetState(#TrackBar_310,100)
SetGadgetState(#TrackBar_600,100)
SetGadgetState(#TrackBar_1000,100)
SetGadgetState(#TrackBar_3000,100)
SetGadgetState(#TrackBar_6000,100)
SetGadgetState(#TrackBar_12000,100)
SetGadgetState(#TrackBar_14000,100)
SetGadgetState(#TrackBar_16000,100)
CheckBoxGadget(#chk_dsplowpass, 400, 35, 150,20, "DSP-Lowpass")
CheckBoxGadget(#chk_dsphighpass, 400, 60, 150,20, "DSP-Highpass")
CheckBoxGadget(#chk_dspecho, 400, 85, 150,20, "DSP-Echo")
CheckBoxGadget(#chk_dspflange, 400, 110, 150,20, "DSP-Flange")
CheckBoxGadget(#chk_dspdistortion, 400, 135, 150,20, "DSP-Distortion")
CheckBoxGadget(#chk_dspchorus, 400, 160, 150,20, "DSP-Chorus")
;CheckBoxGadget(#chk_dspparameq, 400, 185, 150,20, "DSP-Parameq")
InitSprite()
OpenWindowedScreen(WindowID(0),550,25,256,200,0,0,0) ; opens a screen on the window
CreateSprite(1,256,200,0) ; creates a temporarily sprite
StartDrawing(SpriteOutput(1)) ;Starts Drawing on the sprite
Box(0,0,256,200,RGB(88,99,114))
StopDrawing() ; Stops drawing on the sprite
FlipBuffers()
DisplaySprite(1,0,0) ; Display the sprite
EndIf
;- HAUPTSCHLEIFE
Repeat
Delay(1)
DrawSpectrum()
EventID = WindowEvent()
If EventID = #PB_Event_Gadget
gadget = EventGadget()
If gadget = #TrackBar_80
result = FMOD_DSP_SetParameter(EQBand(0), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_80)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_170
result = FMOD_DSP_SetParameter(EQBand(1), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_170)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_310
result = FMOD_DSP_SetParameter(EQBand(2), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_310)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_600
result = FMOD_DSP_SetParameter(EQBand(3), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_600)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_1000
result = FMOD_DSP_SetParameter(EQBand(4), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_1000)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_3000
result = FMOD_DSP_SetParameter(EQBand(5), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_3000)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_6000
result = FMOD_DSP_SetParameter(EQBand(6), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_6000)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_12000
result = FMOD_DSP_SetParameter(EQBand(7), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_12000)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_14000
result = FMOD_DSP_SetParameter(EQBand(8), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_14000)))
FMOD_ErrCheck(Result, "Set DSP-Parameter")
ElseIf gadget = #TrackBar_16000
result = FMOD_DSP_SetParameter(EQBand(9), #FMOD_DSP_PARAMEQ_GAIN, 2)
FMOD_ErrCheck(Result, "Set DSP-Parameter")
; DSP-Effekte ein/ausschalten
ElseIf gadget = #chk_dsplowpass
result = FMOD_DSP_GetActive(dsplowpass, @active)
FMOD_ErrCheck(result, "Swith DSPlowbass")
If active
result = FMOD_DSP_Remove(dsplowpass)
FMOD_ErrCheck(result, "Swith DSPlowbass")
Else
result = FMOD_System_AddDSP(system, dsplowpass, 0)
FMOD_ErrCheck(result, "Swith DSPlowbass")
;result = FMOD_DSP_SetParameter(dsplowpass, 0, 2)
EndIf
ElseIf gadget = #chk_dsphighpass
result = FMOD_DSP_GetActive(dsphighpass, @active)
FMOD_ErrCheck(result, "Swith DSPhighpass")
If active
result = FMOD_DSP_Remove(dsphighpass)
FMOD_ErrCheck(result, "Swith DSPhighpass")
Else
result = FMOD_System_AddDSP(system, dsphighpass, 0)
FMOD_ErrCheck(result, "Swith DSPhighpass")
EndIf
ElseIf gadget = #chk_dspecho
result = FMOD_DSP_GetActive(dspecho, @active)
FMOD_ErrCheck(result, "Swith DSPecho")
If active
result = FMOD_DSP_Remove(dspecho)
FMOD_ErrCheck(result, "Swith DSPecho")
Else
result = FMOD_System_AddDSP(system, dspecho, 0)
FMOD_ErrCheck(result, "Swith DSPecho")
EndIf
ElseIf gadget = #chk_dspflange
result = FMOD_DSP_GetActive(dspflange, @active)
FMOD_ErrCheck(result, "Swith DSPflange")
If active
result = FMOD_DSP_Remove(dspflange)
FMOD_ErrCheck(result, "Swith DSPflange")
Else
result = FMOD_System_AddDSP(system, dspflange, 0)
FMOD_ErrCheck(result, "Swith DSPflange")
EndIf
ElseIf gadget = #chk_dspdistortion
result = FMOD_DSP_GetActive(dspdistortion, @active)
FMOD_ErrCheck(result, "Swith DSPdistortion")
If active
result = FMOD_DSP_Remove(dspdistortion)
FMOD_ErrCheck(result, "Swith DSPdistortion")
Else
result = FMOD_System_AddDSP(system, dspdistortion, 0)
FMOD_ErrCheck(result, "Swith DSPdistortion")
EndIf
ElseIf gadget = #chk_dspchorus
result = FMOD_DSP_GetActive(dspchorus, @active)
FMOD_ErrCheck(result, "Swith DSPchorus")
If active
result = FMOD_DSP_Remove(dspchorus)
FMOD_ErrCheck(result, "Swith DSPchorus")
Else
result = FMOD_System_AddDSP(system, dspchorus, 0)
FMOD_ErrCheck(result, "Swith DSPchorus")
EndIf
ElseIf gadget = #chk_dspparameq
; result = FMOD_DSP_GetActive(EQBand(0), @active)
; FMOD_ErrCheck(result, "Swith DSPparameqa")
; If active
; For i = 0 To 9
; result = FMOD_DSP_SetActive(EQBand(i), #False)
; FMOD_ErrCheck(result, "Swith DSPparameqb")
; Next i
; ;result = FMOD_DSP_Remove(dspparameq)
; ;FMOD_ErrCheck(result, "Swith DSPparameq")
; Else
; For i = 0 To 9
; result = FMOD_DSP_SetActive(EQBand(i), #True)
; FMOD_ErrCheck(result, "Swith DSPparameqc")
; Next i
; ;result = FMOD_System_AddDSP(system, dspparameq, 0)
; ;FMOD_ErrCheck(result, "Swith DSPparameq")
; EndIf
EndIf
EndIf
;- BEENDEN
If EventID = #PB_Event_CloseWindow
If sound
Result = FMOD_Sound_Release(Sound)
FMOD_ErrCheck(Result, "Sound - Close")
EndIf
If system
Result = FMOD_System_Close(system)
FMOD_ErrCheck(Result, "System - Close")
Result = FMOD_System_Release(system)
FMOD_ErrCheck(Result, "System - Release")
EndIf
Quit = 1
EndIf
Until Quit = 1
End
Arrag0n