Seite 1 von 2

Parametrischer Equalizer mit der FMOD-DLL

Verfasst: 21.01.2005 17:48
von nicolaus
Nachfolgend mal ein code um zu sehen wie man sich mit FMOD einen Equalizer bastel kann.
Ihr braucht zum kompilieren die FMOD-Wrapper-LIB von Froggerprogger (zu finden auf PureArea.net) und die fmod.dll.
Ich habe das mit der fmod.dll version 3.7.4.0 getestet.

Code: Alles auswählen

; 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)

Enumeration 
  #TrackBar_80
  #TrackBar_170
  #TrackBar_310
  #TrackBar_600
  #TrackBar_1000
  #TrackBar_3000
  #TrackBar_6000
  #TrackBar_12000
  #TrackBar_14000
  #TrackBar_16000
EndEnumeration

Global HardCh_1.l
Dim EQBand.l(10)

Procedure InitEQ() 
  Protected I.l 
  For  I=0 To 10 
    EQBand(I)= FSOUND_FX_Enable(HardCh_1, #FSOUND_FX_PARAMEQ)
    Debug EQBand(I)
  Next
    FSOUND_FX_SetParamEQ(EQBand(0), 80, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(1), 170, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(2), 310, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(3), 600, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(4), 1000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(5), 3000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(6), 6000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(7), 12000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(8), 14000, 10, 0) 
    FSOUND_FX_SetParamEQ(EQBand(9), 16000, 10, 0)  
EndProcedure 
Procedure Open_Equalizer()
  If OpenWindow(0, 216, 0, 376, 250,  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar , "FMOD Equalizer")
    If CreateGadgetList(WindowID())
      TrackBarGadget(#TrackBar_80, 20, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_170, 60, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_310, 95, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_600, 130, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_1000, 165, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_3000, 200, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_6000, 235, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_12000, 270, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_14000, 305, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      TrackBarGadget(#TrackBar_16000, 340, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical)
      SetGadgetState(#TrackBar_80,120)
      SetGadgetState(#TrackBar_170,120)
      SetGadgetState(#TrackBar_310,120)
      SetGadgetState(#TrackBar_600,120)
      SetGadgetState(#TrackBar_1000,120)
      SetGadgetState(#TrackBar_3000,120)
      SetGadgetState(#TrackBar_6000,120)
      SetGadgetState(#TrackBar_12000,120)
      SetGadgetState(#TrackBar_14000,120)
      SetGadgetState(#TrackBar_16000,120)
    EndIf
  EndIf
EndProcedure
Procedure Set_EQ_Value(ID.l,Value.f)
  Select ID
    Case 0
      FSOUND_FX_SetParamEQ(EQBand(0), 80, 10, Value)
    Case 1
      FSOUND_FX_SetParamEQ(EQBand(1), 170, 10, Value) 
    Case 2
      FSOUND_FX_SetParamEQ(EQBand(2), 310, 10, Value) 
    Case 3
      FSOUND_FX_SetParamEQ(EQBand(3), 600, 10, Value) 
    Case 4
      FSOUND_FX_SetParamEQ(EQBand(4), 1000, 10, Value) 
    Case 5
      FSOUND_FX_SetParamEQ(EQBand(5), 3000, 10, Value) 
    Case 6  
      FSOUND_FX_SetParamEQ(EQBand(6), 6000, 10, Value) 
    Case 7
      FSOUND_FX_SetParamEQ(EQBand(7), 12000, 10, Value) 
    Case 8  
      FSOUND_FX_SetParamEQ(EQBand(8), 14000, 10, Value) 
    Case 9
      FSOUND_FX_SetParamEQ(EQBand(9), 16000, 10, Value) 
  EndSelect
EndProcedure
Procedure.f Calculate_EQ_Gain(Value.f)
  If Value > 15.00
    temp_value.f = 15.00
    Gain = Value - temp_value
    ProcedureReturn Gain
  ElseIf Value < 15.00
    temp_value.f = -15.00
    Gain = Value + temp_value
    ProcedureReturn Gain
  EndIf
EndProcedure

soundfile.s = OpenFileRequester("Wähle eine Musikdatei (wav, mp3,....)","","",0)
If soundfile = "" 
  End 
EndIf

FSOUND_SetOutput(#FSOUND_OUTPUT_DSOUND) 

Init_OK = #False
For I=0 To FSOUND_GetNumDrivers() - 1
  FSOUND_GetDriverCaps(I, @caps)
  If caps & #FSOUND_CAPS_HARDWARE
    Init_OK = #True
    FSOUND_SetDriver(I)
    Break
  EndIf
Next
If Init_OK = #False
  MessageRequester("","Es wurde kein Soundtreiber mit Hardwarechannel gefunden", #MB_ICONERROR)
  End
EndIf

numSoftChannels = 2 
HardCh_1 = numSoftChannels + 1 
FSOUND_Init(44100, numSoftChannels,0)
sample = FSOUND_Sample_Load(#FSOUND_FREE, soundfile, #FSOUND_LOOP_NORMAL | #FSOUND_HW2D | #FSOUND_ENABLEFX, 0, 0) 
channel = FSOUND_PlaySoundEx(HardCh_1, sample, 0, #True)
InitEQ() 
FSOUND_SetPaused(channel, #False)

Open_Equalizer()
  Repeat
    Delay(1)
    EventID = WindowEvent()
    If EventID = #PB_EventGadget
      gadget = EventGadgetID()
      If gadget = #TrackBar_80
        Set_EQ_Value(0,Calculate_EQ_Gain(GetGadgetState(#TrackBar_80)/8)) 
      ElseIf gadget = #TrackBar_170
        Set_EQ_Value(1,Calculate_EQ_Gain(GetGadgetState(#TrackBar_170)/8)) 
      ElseIf gadget = #TrackBar_310
        Set_EQ_Value(2,Calculate_EQ_Gain(GetGadgetState(#TrackBar_310)/8)) 
      ElseIf gadget = #TrackBar_600
        Set_EQ_Value(3,Calculate_EQ_Gain(GetGadgetState(#TrackBar_600)/8)) 
      ElseIf gadget = #TrackBar_1000
        Set_EQ_Value(4,Calculate_EQ_Gain(GetGadgetState(#TrackBar_1000)/8)) 
      ElseIf gadget = #TrackBar_3000
        Set_EQ_Value(5,Calculate_EQ_Gain(GetGadgetState(#TrackBar_3000)/8)) 
      ElseIf gadget = #TrackBar_6000
        Set_EQ_Value(6,Calculate_EQ_Gain(GetGadgetState(#TrackBar_6000)/8)) 
      ElseIf gadget = #TrackBar_12000
        Set_EQ_Value(7,Calculate_EQ_Gain(GetGadgetState(#TrackBar_12000)/8)) 
      ElseIf gadget = #TrackBar_14000
        Set_EQ_Value(8,Calculate_EQ_Gain(GetGadgetState(#TrackBar_14000)/8)) 
      ElseIf gadget = #TrackBar_16000
        Set_EQ_Value(9,Calculate_EQ_Gain(GetGadgetState(#TrackBar_16000)/8)) 
      EndIf 
    EndIf 
    If EventID = #PB_Event_CloseWindow
      FSOUND_Close()
      Quit = 1
    EndIf
  Until Quit = 1
End
viel spaß damit
gruß nico

Verfasst: 03.03.2005 23:00
von 125
Kann man das auch mit Streams nutzen?
Ich schuster gerade nen Mp3 Player aus 50 % Codeschnipseln und 50 % Selbstprogrammierten zusammen aber irgendwie bekomm ich bei der Debug Message wenn ich das in mein Prog einbau immer -1 back :(
Du benutzts ja die Sample funcs...

Plz Help

mfg
125

Verfasst: 04.03.2005 07:58
von nicolaus
Ja geht auch mit streams.
Hier ein beispiel

Code: Alles auswählen

; 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) 

Enumeration 
  #TrackBar_80 
  #TrackBar_170 
  #TrackBar_310 
  #TrackBar_600 
  #TrackBar_1000 
  #TrackBar_3000 
  #TrackBar_6000 
  #TrackBar_12000 
  #TrackBar_14000 
  #TrackBar_16000 
EndEnumeration 

Global HardCh_1.l 
Dim EQBand.l(10) 

Procedure InitEQ() 
  Protected I.l 
  For  I=0 To 10 
    EQBand(I)= FSOUND_FX_Enable(HardCh_1, #FSOUND_FX_PARAMEQ) 
    Debug EQBand(I) 
  Next 
  FSOUND_FX_SetParamEQ(EQBand(0), 80, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(1), 170, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(2), 310, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(3), 600, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(4), 1000, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(5), 3000, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(6), 6000, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(7), 12000, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(8), 14000, 10, 0) 
  FSOUND_FX_SetParamEQ(EQBand(9), 16000, 10, 0)  
EndProcedure 
Procedure Open_Equalizer() 
  If OpenWindow(0, 216, 0, 376, 250,  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar , "FMOD Equalizer") 
    If CreateGadgetList(WindowID()) 
      TrackBarGadget(#TrackBar_80, 20, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_170, 60, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_310, 95, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_600, 130, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_1000, 165, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_3000, 200, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_6000, 235, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_12000, 270, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_14000, 305, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      TrackBarGadget(#TrackBar_16000, 340, 30, 20, 200, 0, 240, #PB_TrackBar_Vertical) 
      SetGadgetState(#TrackBar_80,120) 
      SetGadgetState(#TrackBar_170,120) 
      SetGadgetState(#TrackBar_310,120) 
      SetGadgetState(#TrackBar_600,120) 
      SetGadgetState(#TrackBar_1000,120) 
      SetGadgetState(#TrackBar_3000,120) 
      SetGadgetState(#TrackBar_6000,120) 
      SetGadgetState(#TrackBar_12000,120) 
      SetGadgetState(#TrackBar_14000,120) 
      SetGadgetState(#TrackBar_16000,120) 
    EndIf 
  EndIf 
EndProcedure 
Procedure Set_EQ_Value(id.l,Value.f) 
  Select id 
    Case 0 
      FSOUND_FX_SetParamEQ(EQBand(0), 80, 10, Value) 
    Case 1 
      FSOUND_FX_SetParamEQ(EQBand(1), 170, 10, Value) 
    Case 2 
      FSOUND_FX_SetParamEQ(EQBand(2), 310, 10, Value) 
    Case 3 
      FSOUND_FX_SetParamEQ(EQBand(3), 600, 10, Value) 
    Case 4 
      FSOUND_FX_SetParamEQ(EQBand(4), 1000, 10, Value) 
    Case 5 
      FSOUND_FX_SetParamEQ(EQBand(5), 3000, 10, Value) 
    Case 6  
      FSOUND_FX_SetParamEQ(EQBand(6), 6000, 10, Value) 
    Case 7 
      FSOUND_FX_SetParamEQ(EQBand(7), 12000, 10, Value) 
    Case 8  
      FSOUND_FX_SetParamEQ(EQBand(8), 14000, 10, Value) 
    Case 9 
      FSOUND_FX_SetParamEQ(EQBand(9), 16000, 10, Value) 
  EndSelect 
EndProcedure 
Procedure.f Calculate_EQ_Gain(Value.f) 
  If Value > 15.00 
    temp_value.f = 15.00 
    Gain = Value - temp_value 
    ProcedureReturn Gain 
  ElseIf Value < 15.00 
    temp_value.f = -15.00 
    Gain = Value + temp_value 
    ProcedureReturn Gain 
  EndIf 
EndProcedure 

soundfile.s = OpenFileRequester("Wähle eine Musikdatei (wav, mp3,....)","","",0) 
If soundfile = "" 
  End 
EndIf 

FSOUND_SetOutput(#FSOUND_OUTPUT_DSOUND) 

Init_OK = #False
For I=0 To FSOUND_GetNumDrivers() - 1
  FSOUND_GetDriverCaps(I, @caps)
  If caps & #FSOUND_CAPS_HARDWARE
    Init_OK = #True
    FSOUND_SetDriver(I)
    Break
  EndIf
Next
MaxChannels = 32
MixRate = 44100
HartChan = MaxChannels+1
If Init_OK = #False
  MessageRequester("Error","No DirectX-Sound driver with hardwarechannels found. Cannot continue.", #MB_ICONERROR)
EndIf  
  
FSOUND_SetMixer(#FSOUND_MIXER_QUALITY_AUTODETECT)
FSOUND_Init(MixRate, MaxChannels, 0 )


numSoftChannels = 2 
HardCh_1 = numSoftChannels + 1 
FSOUND_Init(44100, numSoftChannels,0) 
sample = FSOUND_Stream_Open(soundfile,#FSOUND_NORMAL | #FSOUND_HW2D | #FSOUND_ENABLEFX, 0, 0)
channel = FSOUND_Stream_PlayEx(HardCh_1, sample,0, #True) 
InitEQ()
FSOUND_SetPaused(channel,#False)


Open_Equalizer() 
Repeat 
  Delay(1) 
  EventID = WindowEvent() 
  If EventID = #PB_EventGadget 
    gadget = EventGadgetID() 
    If gadget = #TrackBar_80 
      Set_EQ_Value(0,Calculate_EQ_Gain(GetGadgetState(#TrackBar_80)/8)) 
    ElseIf gadget = #TrackBar_170 
      Set_EQ_Value(1,Calculate_EQ_Gain(GetGadgetState(#TrackBar_170)/8)) 
    ElseIf gadget = #TrackBar_310 
      Set_EQ_Value(2,Calculate_EQ_Gain(GetGadgetState(#TrackBar_310)/8)) 
    ElseIf gadget = #TrackBar_600 
      Set_EQ_Value(3,Calculate_EQ_Gain(GetGadgetState(#TrackBar_600)/8)) 
    ElseIf gadget = #TrackBar_1000 
      Set_EQ_Value(4,Calculate_EQ_Gain(GetGadgetState(#TrackBar_1000)/8)) 
    ElseIf gadget = #TrackBar_3000 
      Set_EQ_Value(5,Calculate_EQ_Gain(GetGadgetState(#TrackBar_3000)/8)) 
    ElseIf gadget = #TrackBar_6000 
      Set_EQ_Value(6,Calculate_EQ_Gain(GetGadgetState(#TrackBar_6000)/8)) 
    ElseIf gadget = #TrackBar_12000 
      Set_EQ_Value(7,Calculate_EQ_Gain(GetGadgetState(#TrackBar_12000)/8)) 
    ElseIf gadget = #TrackBar_14000 
      Set_EQ_Value(8,Calculate_EQ_Gain(GetGadgetState(#TrackBar_14000)/8)) 
    ElseIf gadget = #TrackBar_16000 
      Set_EQ_Value(9,Calculate_EQ_Gain(GetGadgetState(#TrackBar_16000)/8)) 
    EndIf 
  EndIf 
  If EventID = #PB_Event_CloseWindow 
    FSOUND_Close() 
    Quit = 1 
  EndIf 
Until Quit = 1 
End
hoffe das hilft dir wenn du noch fragen hast melde dich einfach

gruss nico

Verfasst: 04.03.2005 16:40
von 125
Hi,
hab immernoch das Problem beim initieren gibt er -1 aus obwohl ich fast alles so gelassen hab wie es war habs nur auf meine playfuncs angepasst :( ... Hab den Code ma in ne zip gepackt weil Teilausschnitte warscheinlich nichts bringen würden wichtig sind die funktionen die mit Play anfangen in proces.pbi.
Damit ihr mit den Dateien klarkommt:
in player.pb liegt meine hauptschleife mit den Cases für die Trackbars. in proces.pbi sind meine proceduren. player.pbi ist der visualdesiogner include. consts.pbi = constanten und in vars.pbi sind die variablen und Arrays in menu.pbi hab ich meine popupmenus.

http://fighter125.fi.funpic.de/purebasic/fmodamp.zip

Plz Help :(

Schomal THX in voraus :)

mfg
125

Verfasst: 04.03.2005 17:05
von nicolaus
hi du leider kann ich die zip nich downloaden bekomme da nen linkfehler. sag bescheid wenn du es noch mal wo anders hochgeladen hast dann schau ich mal

Verfasst: 04.03.2005 17:59
von 125
Edit *ARGH* *kopf gegen wand klatsch* Falschen chan angegeben... :mrgreen:

Verfasst: 04.03.2005 20:06
von nicolaus
gehts jetzt? habs mir gerade mal angeschaut und habe deine fehler gefunden. wenn du willst kann ich dir die geänderte zip auf meinen server stellen und du kannst sie dir downloaden

Verfasst: 04.03.2005 20:12
von 125
jop funktioniert jetzt :) THX THX THX :) *freu*
Eine Sache ist mir noch aufgefallen: Wenn man die Regler sehr schnell verschiebt oder Plötzlich alles wieder auf 0 Stellt und die werte fmodtechnisch aktualisiert Hängt sich das Programm auf oder es kommt einfach kein Sound mehr. Aber ich Schätze das liegt an der Fmod.dll die wird wohl mit der Berechnung nicht mitkommen :|

Naja Hauptsache es läuft :)
Ganz Großes THX :)

mfg
125

Verfasst: 04.03.2005 21:15
von nicolaus
dann setzt doch ein delay() nach jeder berechnung so hat fmod ein wenig zeit das zu übernehmen. ich muß aber sagen das ich damit keine probs in meinem player habe und die regler alle richtig schnell verschieben kann und da keine störungen auftauchen.

Verfasst: 27.03.2005 21:30
von Gamer
Also bei beiden Versionen kommt bei mir eine Fehlermeldung das keine Soundhardware verfügbar ist - danach spielt er aber komischerweise trotzdem ab...