FMOD mit Equalizer und Spectrum-Analyzer via DSP

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Arrag0n
Beiträge: 32
Registriert: 24.06.2005 20:49
Wohnort: Austria
Kontaktdaten:

FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von Arrag0n »

Hallo Zusammen!
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
Viele Grüße
Arrag0n :allright:
Aus den Steinen, die einem in den Weg gelegt werden, kann man Schönes bauen.
Benutzeravatar
kayfr72
Beiträge: 129
Registriert: 12.09.2004 19:13
Wohnort: Ansbach/Weihenzell
Kontaktdaten:

Re: FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von kayfr72 »

Arrag0n hat geschrieben:Hallo Zusammen!

http://www.music-convoy.at/PB/FMOD01/newfmodex2010a.pb

Arrag0n :allright:
Seite ist nicht mehr erreichbar: Wo bekommt man jetzt den Wrapper her?
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von Then »

Hat mal jemand den Wrapper ?? ich brauche einen SpektrumAnalyzer..... oder hätte da jemand einen passenden Code für mich ? Gehts auch ohne FMOD ??
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von Kiffi »

Then hat geschrieben:ich brauche einen SpektrumAnalyzer...
ist hier was für Dich dabei? http://www.purebasic.fr/english/search. ... m+analyzer

Grüße ... Peter
Hygge
Benutzeravatar
Grillmeister
Beiträge: 23
Registriert: 17.04.2008 09:54
Wohnort: Hannover
Kontaktdaten:

Re: FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von Grillmeister »

Hi,
habe hier die aktuelle Include für die letzte fmodex.dll gepostet: http://forums.purebasic.com/german/view ... clude+file

Damit, der fmodex.dll, der fmodex_vc.lib und dem folgenden angepassten Code funktioniert das Beispiel wieder:

Code: Alles auswählen

; Erneuert am 19.März 2015
; Author: Grillmeister
; fmod.dll Version: 0.4.44.51
; PB Version: 5.24 LTS(x86)
;
; Zusätzlich benötigt werden:
; fmodex.dll     Download hier: http://www.fmod.org/download/fmodex/tool/win/fmoddesigner44451win-installer.exe
; fmodex_vc.lib  Ist im Fmod Ex Designer enthalten.
; fmodex.pbi für fmodex 4.44.51

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


IncludeFile "fmodex.pbi"

If Not Init_FMOD() 
  MessageRequester("Error", "FModEx dll not found!")
  End
EndIf

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
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 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)
 
  FMOD_System_GetSoftwareFormat(system, 0, 0, @Numchannels, 0, 0, 0)
   
  FMOD_System_GetSpectrum(system, @Spectrum1(0), 256, 0, #FMOD_DSP_FFT_WINDOW_TRIANGLE)
  
  If Numchannels > 1
    FMOD_System_GetSpectrum(system, @Spectrum2(0), 256, 1, #FMOD_DSP_FFT_WINDOW_TRIANGLE)
  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

FMOD_System_Create(@system)
FMOD_System_Init(system, 32, #FMOD_INIT_NORMAL , 0)
FMOD_System_CreateStream(system,@soundfile, #FMOD_SOFTWARE | #FMOD_2D | #FMOD_CreateSTREAM, 0, @sound)   ; | #FMOD_2D | #FMOD_CreateSTREAM
Result = FMOD_System_PlaySound(system, #FMOD_CHANNEL_FREE, sound, 0, @channel) ; | #FMOD_NONBLOCKING | #FMOD_ACCURATETIME

If Result = #FMOD_OK

  FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_LOWPASS, @dsplowpass)
  FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_HIGHPASS, @dsphighpass)
  FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_ECHO, @dspecho)
  FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_FLANGE, @dspflange)
  FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_DISTORTION, @dspdistortion)
  FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_CHORUS, @dspchorus)
 
  For i = 0 To 9
    FMOD_System_CreateDSPByType(system, #FMOD_DSP_TYPE_PARAMEQ, @EQBand(i))
    FMOD_System_AddDSP(system, EQBand(i), 0)
    FMOD_DSP_SetParameter(EQBand(i), #FMOD_DSP_PARAMEQ_CENTER, eqFreq(i))
    FMOD_DSP_SetParameter(EQBand(i), #FMOD_DSP_PARAMEQ_BANDWIDTH, 1)
    FMOD_DSP_SetParameter(EQBand(i), #FMOD_DSP_PARAMEQ_GAIN, 1.0)
  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")
   
  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
      FMOD_DSP_SetParameter(EQBand(0), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_80)))
    ElseIf gadget = #TrackBar_170
      FMOD_DSP_SetParameter(EQBand(1), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_170)))
    ElseIf gadget = #TrackBar_310
      FMOD_DSP_SetParameter(EQBand(2), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_310)))     
    ElseIf gadget = #TrackBar_600
      FMOD_DSP_SetParameter(EQBand(3), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_600)))     
    ElseIf gadget = #TrackBar_1000
      FMOD_DSP_SetParameter(EQBand(4), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_1000)))     
    ElseIf gadget = #TrackBar_3000
      FMOD_DSP_SetParameter(EQBand(5), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_3000)))     
    ElseIf gadget = #TrackBar_6000
      FMOD_DSP_SetParameter(EQBand(6), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_6000)))     
    ElseIf gadget = #TrackBar_12000
      FMOD_DSP_SetParameter(EQBand(7), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_12000)))     
    ElseIf gadget = #TrackBar_14000
      FMOD_DSP_SetParameter(EQBand(8), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_14000)))     
    ElseIf gadget = #TrackBar_16000
      FMOD_DSP_SetParameter(EQBand(9), #FMOD_DSP_PARAMEQ_GAIN, Calculate_EQ_Gain(GetGadgetState(#TrackBar_16000)))
     
     
    ; DSP-Effekte ein/ausschalten
    ElseIf gadget = #chk_dsplowpass
       FMOD_DSP_GetActive(dsplowpass, @active)
      If active
        FMOD_DSP_Remove(dsplowpass)
      Else
        FMOD_System_AddDSP(system, dsplowpass, 0)
      EndIf
     
    ElseIf gadget = #chk_dsphighpass
       FMOD_DSP_GetActive(dsphighpass, @active)
      If active
        FMOD_DSP_Remove(dsphighpass)
      Else
        FMOD_System_AddDSP(system, dsphighpass, 0)
      EndIf
     
    ElseIf gadget = #chk_dspecho
       FMOD_DSP_GetActive(dspecho, @active)
      If active
        FMOD_DSP_Remove(dspecho)
      Else
        FMOD_System_AddDSP(system, dspecho, 0)
      EndIf
     
    ElseIf gadget = #chk_dspflange
       FMOD_DSP_GetActive(dspflange, @active)
      If active
        FMOD_DSP_Remove(dspflange)
      Else
        FMOD_System_AddDSP(system, dspflange, 0)
      EndIf
     
    ElseIf gadget = #chk_dspdistortion
       FMOD_DSP_GetActive(dspdistortion, @active)
      If active
        FMOD_DSP_Remove(dspdistortion)
      Else
        FMOD_System_AddDSP(system, dspdistortion, 0)
      EndIf
     
    ElseIf gadget = #chk_dspchorus
       FMOD_DSP_GetActive(dspchorus, @active)
      If active
        FMOD_DSP_Remove(dspchorus)
      Else
        FMOD_System_AddDSP(system, dspchorus, 0)
      EndIf
     
    EndIf
  EndIf
 
;- BEENDEN
  If EventID = #PB_Event_CloseWindow
    If sound
      FMOD_Sound_Release(Sound)
    EndIf
    If system
      FMOD_System_Close(system)
      FMOD_System_Release(system)
    EndIf
   
    Quit = 1
  EndIf
Until Quit = 1
End
Viel Spaß damit :D

Edit sagt: "War wohl etwas arg quick&dirty, deshalb noch mal ein klein wenig angepasst/korrigiert"
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von funkheld »

Hallo, guten Tag.
Wo liegt die dazugehörige fmod.dll bitte?
http://www.fmod.org/ ???

Danke.
Gruss
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von NicTheQuick »

funkheld hat geschrieben:Wo liegt die dazugehörige fmod.dll bitte?
http://www.fmod.org/ ???
Genau.
Bild
Benutzeravatar
Grillmeister
Beiträge: 23
Registriert: 17.04.2008 09:54
Wohnort: Hannover
Kontaktdaten:

Re: FMOD mit Equalizer und Spectrum-Analyzer via DSP

Beitrag von Grillmeister »

funkheld hat geschrieben: Wo liegt die dazugehörige fmod.dll bitte?
Nabend :)

...steht auch in der 7. Zeile des von mir leicht modifizierten Codes :wink:
Antworten