FMOD Spectrum und EQ was ist falsch?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

FMOD Spectrum und EQ was ist falsch?

Beitrag von nicolaus »

Hi
Da ich jetzt in meinem player ein prob habe mit dem anzeigen des Spectrums in verbindung mit dem EQ den ich gebastelt hatte muß ich mal wieder zm hilfe bitte (Froggeproger ?)

Hier mal der code wo der EQ zwar geht aber die Spectrumanzeige nicht mehr.

Code: Alles auswählen

Declare updateFFT() ; declares the Proc

Structure fftarray ;the structure for the FSOUND_DSP_GetSpectrum()
  Value.f[512]
EndStructure

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

If InitSprite() = 0 ; Try to open DirectX
  MessageRequester("","Sorry, problem with InitSprite() - no DirectX 7.0 ?",0):End
EndIf

hwnd=OpenWindow(1,0,0,520,264,#PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Mini-FFT-Spectrum Visualization using FMOD")
OpenWindowedScreen(hwnd,4,60,512,200,0,0,0) ; opens a screen on the window

CreateSprite(1,512,200,0) ; creates a temporarily sprite

;FSOUND_SetBufferSize(125) ;in- or decrease, if you want to

;initialize FMOD and create menu + gadgets
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 = 32
HardCh_1 = numSoftChannels + 1
If hwnd <> 0 And FSOUND_Init(44100, numSoftChannels, 0) And CreateMenu(1,hwnd) And CreateGadgetList(hwnd)
  MenuItem(1, "open")
  MenuItem(2, "play")
  MenuItem(3,"stop")
  MenuItem(4, "eq")
  TextGadget(1,5,10,512,20,"Music-File:   " + soundfile.s,0) 
  resume.b=1
EndIf

;_____________  Main Prog ::
While resume
  updateFFT()
  Delay(1)
  Select WindowEvent()
    Case #PB_EventMenu ; (select a menu item...)
      Select EventMenuID()
        Case 1 ;(Open)
          temp_filename.s = OpenFileRequester("Choose a music-file...","C:\","PCM-MusicFiles (*.mp3, *.wav, *.mp2, *.ogg, *.raw)|*.mp3;*.wav;*.mp2;*.ogg;*.raw|*.*|*.*",0,0)
          If temp_filename 
            soundfile.s = temp_filename 
            SetGadgetText(1,soundfile) 
          EndIf
        Case 2 ;(Play)
          hstream = FSOUND_Stream_Open(soundfile,#FSOUND_LOOP_NORMAL | #FSOUND_HW2D | #FSOUND_ENABLEFX,0,0) ;open the soundfile
          If hstream <> 0
            dsp_unit = FSOUND_DSP_GetFFTUnit()
            FSOUND_DSP_SetActive(dsp_unit, #True) ;activate the FastFourierTransformation-DSP-Unit
            channel = FSOUND_Stream_PlayEx(HardCh_1,hstream,0,#True) ;play the stream on channel 1
            InitEQ()
            FSOUND_SetPaused(channel, #False) 
          EndIf
        Case 3 ;(Stop)
          For I=255 To 0 Step -1 ;a small fast fade-out to prevent a clipping-sound
            FSOUND_SetVolume(1,I)
          Next
          FSOUND_Stream_Stop(hstream) ;stop playing the stream
          FSOUND_SetVolume(1,255) ;reset volume to max
        Case 4 ;(Equalizer)
          Open_Equalizer() 
      EndSelect
    Case #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
      
    Case #PB_Event_CloseWindow ; (systemmenu close...)
      If EventWindowID() = 0
        CloseWindow(0)
      Else
        resume=0
        FSOUND_Stream_Stop(hstream) ;stop playing the stream
        FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), #False) ;set the FFT-DSP-Unit inactive
        FSOUND_Close() ;shut down FSOUND
      EndIf
  EndSelect
Wend

;The following procedure updates and displays the fft-visualisation
Procedure updateFFT()
  If FSOUND_DSP_GetActive(FSOUND_DSP_GetFFTUnit())
    CopyMemory(FSOUND_DSP_GetSpectrum(), hfft.fftarray, 4*512)
  EndIf
  StartDrawing(SpriteOutput(1)) ;Starts Drawing on the sprite
  Box(0,0,512,200,$000000)
  For I=0 To 511
    actfftvalue.f = hfft\Value[I]*199 ;linear y-scale
    Box(I,200,1,-1-actfftvalue, (255-actfftvalue) * $000100 + actfftvalue * $000001) ;Draw a line with various colors, linear x-scale
    DrawingMode(1) ; sets Text background transparent
    FrontColor(255,255,255) ;white of course
    cpuusage.s="CPU: "+StrF(FSOUND_GetCPUUsage(),1)+" %" ;create CPU-String
    Locate(508 - TextLength(cpuusage), 4) ;position upper right
    DrawText(cpuusage) ;draw the text
  Next
  StopDrawing() ;Stops drawing on the sprite
  FlipBuffers()
  DisplaySprite(1,0,0) ; display the sprite
EndProcedure
hoffe ihr könnt mir helfen ich weiss gerade einfach nich weiter Bild
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Hab leider keine Soundkarte mit Hardwarechanneln zur Verfügung, aber die fmod-Hilfe liefert:
To use the FSOUND_FX api to do fx on channels requires FSOUND_HW2D or FSOUND_HW3D (and FSOUND_ENABLEFX) flags to work.
You may notice if you do this, you will lose the ability to do FSOUND_DSP_GetSpectrum or any DSP unit will not register, because FSOUND_FX channels play in hardware, and don't run through the FMOD DSP Engine.

There is a way to do this though. Instead of performing EQ on a channel by channel basis, perform it on the global software mix output.

This means you can't have per channel control, but if you are just looking for a way to do EQ on your audio for example, then use the following method.
Falls Du kein Englisch kannst, übersetze ichs.
!UD2
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Ich danke dir erst mal.
Jetzt werd ich mal in der hilfe suchen wo du das rausgesucht hast. So wie ich das jetzt verstanden habe kann ich aber die DSP nich mit FX verwenden?! Find ich aber schade und auch ein wenig komisch. Muß ich halt mal sehen wie ich auf nem anderen weg beides hin bekomme also EQ und Spectrum denn es muß ja irgendwie gehen.

Bin natürlich für jede hilfe dankbar
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Gefunden unter Tutorials -> DX8 FX Support -> FSOUND_FX + Spectrum and DSP?.

Ist aber verständlich: Normalerweise ist ja der Signalfluss: Sound/Sample -> Kanal -> Mixer -> DSP-chain (mit FFT gegen Ende) -> BufferCopy zu Soundkarte
Die DirectX-Effekte nutzen aber die Hardwarekanäle der Soundkarte und werden direkt darin abgespielt und lediglich ferngesteuert, d.h. sie werden gar nicht im internen Mixer und danach der DSP-chain von fmod behalten.

Als Lösung wird dort angeboten, nicht kanalweise Effekte einzusetzen, sondern auf den globalen Output. Dann läßt sich die FFT von vor den Effekten nutzen, aber man kann nur noch Effekte auf den gesamten Summenoutput legen.

Ich glaube, sobald die Sounddaten einmal im Hardwarebuffer der Soundkarte sind, kommst Du an die Daten nicht mehr ran, also kannst Du die FFT generell nicht nach den DX8-Effekten nutzen.
!UD2
Antworten