Seite 1 von 2

FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spielen

Verfasst: 11.07.2010 21:27
von Lebostein
Hallo,

habe für ein Spiel ein Musikstück komponiert. Jetzt sollen je nach Situation im Spiel andere Instrumente bzw. Instrumentenspuren in das stetig laufende Musikstück zugeschaltet oder ausgeblendet werden (die Musik läuft quasi ununterbrochen, auch im Hauptmenü usw.). Wie und mit welcher Bibliothek (FMOD zum Beispiel) könnte ich das am besten anstellen? Ich habe hier nun 6 einzelne mp3/ogg-Dateien (wahrscheinlich werden es noch mehr) mit den einzelnen Instrumenten bzw. Instrumentengruppen vorliegen. Eine Möglichkeit wäre, alle 6 gleichzeitig zu starten und je nach Situation einzelne Kanäle stumm zu schalten. Aber: Starten die Dateien auch alle gleichzeitig und ohne Versatz? Bleiben sie auch nach 10 min Abspielzeit immer noch synchron? Geht dabei die Hardware in die Knie, da eigentlich immer nur 1 bis 3 Spuren gleichzeitig zu hören sein sollen? Man könnte auch beim Zuschalten eines Instruments erst mit dem Starten der zugehörigen Datei beginnen und die aktuelle Abspielposition setzen...

Ich weiß nicht so recht, wie ich da rangehen soll. Vielleicht habt ihr eine Idee. Vielleicht bietet ja FMOD oder ein ähnliche Bibliothek eine Funktion, die genau so was macht...

Re: Mehrere Musikdateien gleichzeitig und synchron abspielen

Verfasst: 13.07.2010 12:18
von Lebostein
Hab gestern mal mit FMOD Ex ein wenig herumgespielt und ein kleines Beispiel gebastelt:

http://www.lebostein.de/download/FMOD_Beispiel.zip (3 MB)

Bild
Mit Windows und Mac OS X sollte das Programm (beispiel.pb) ohne Probleme starten (Fmod-Libs liegen alle mit drin), Linux konnte ich noch nicht testen, sollte aber eigentlich auch funktionieren. Jedenfalls werden hier 6 ogg-Dateien als Stream geladen und gestartet. Mit den Häkchen kann man die einzelnen Spuren zuschalten. Hier auf meinem Mac blieben die Spuren immer synchron, auch wenn im Hintergrund zum Beispiel ein Film gestartet wurde. Auf meiner Windows XP Kiste liefen die Spuren aber schon nach ein paar Durchläufen auseinander und man hörte das auch. Scheint also doch nicht so einfach zu funktionieren.

Was bewirkt denn der Befehl "FMOD_Sound_AddSyncPoint"? Könnte das was für mich sein?

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 16:19
von Rings
Läuft hier absolut syncron auf der XP-Kiste ;)

Danke für das bereitstellen des Codes

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 16:33
von helpy
Ich bekomme folgende Meldung:

"Die Anwendung konnte nicht gestartet werden, weil fmodex.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."

cu, helpy

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 16:46
von Lebostein
helpy hat geschrieben:"Die Anwendung konnte nicht gestartet werden, weil fmodex.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."
So ganz steig ich mit den verschiedenen DLL's und LIB's in Verbindung mit OpenLibrary + CallFunction bzw. Import selber noch nicht durch. Erfordert denn die fmodex.lib in Verbindung mit Import trotzdem die fmodex.dll? Ich dachte immer, man nimmt eine DLL oder eine LIB....

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 18:57
von bobobo
ma ehrlich jez .. ich hab mir mal die mühe gemacht und versucht das mit pb-boardmitteln nachzubauen.

ich hör da mal hin und hör ohne merklichen versatz und eigentlich auch irgendwie synchron.
will aber auch nun nicht drauf bestehen, vielleicht hab ich ja auch schon das, was da als letztes
ausgegeben wird .. und hier noch ein kleines Leckerli

Code: Alles auswählen

Enumeration 1
  #s_drm
  #s_bss
  #s_org
  #s_gt1
  #s_gt2
  #s_tut
EndEnumeration
InitSound()
Global quit,l,quitted.l
Global.l c_drm,c_bss,c_gt1,c_gt2,c_org,c_tut
Global.l v_drm,v_bss,v_org,v_gt1,v_gt2,v_tut

v_drm=0
v_bss=100
v_gt1=0
v_gt2=0
v_tut=0
v_org=0

UseOGGSoundDecoder()
Procedure playall(haurein)
  LoadSound(#s_drm,"HDL_schlagwerk.ogg")
  LoadSound(#s_bss,"HDL_basslauf.ogg")
  LoadSound(#s_org,"HDL_orgel.ogg")
  LoadSound(#s_gt1,"HDL_gitarre1.ogg")
  LoadSound(#s_gt2,"HDL_gitarre2.ogg")
  LoadSound(#s_tut,"HDL_floete.ogg")
  Repeat
    c_drm=PlaySound(#s_drm,#PB_Sound_MultiChannel)
    SoundVolume(#s_drm,v_drm,c_drm)
    
    c_org = PlaySound(#s_org,#PB_Sound_MultiChannel)
    SoundVolume(#s_org,v_org,c_org)
    
    c_gt1 = PlaySound(#s_gt1,#PB_Sound_MultiChannel)
    SoundVolume(#s_gt1,v_gt1,c_gt1)
    
    c_gt2 = PlaySound(#s_gt2,#PB_Sound_MultiChannel)
    SoundVolume(#s_gt2,v_gt2,c_gt2)
    
    c_tut = PlaySound(#s_tut,#PB_Sound_MultiChannel)
    SoundVolume(#s_tut,v_tut,c_tut)
    
    c_bss = PlaySound(#s_bss,#PB_Sound_MultiChannel)
    SoundVolume(#s_bss,v_bss,c_bss)
    
    startit.l=ElapsedMilliseconds()
    While ElapsedMilliseconds()<startit+16695
      Delay(10)
      If quit
        Break
      EndIf
    Wend
    
  Until quit
  
  For v=0 To 100 Step 2
    SoundVolume(#s_tut,v,c_tut)
    SoundVolume(#s_gt1,v,c_gt2)
    SoundVolume(#s_gt2,v,c_gt1)
    SoundVolume(#s_org,v,c_org)
    SoundVolume(#s_bss,v,c_bss)
    SoundVolume(#s_drm,v,c_drm)
    
    Delay(10)
  Next v
  For v=100 To 0 Step -2
    SoundVolume(#s_tut,v,c_tut)
    SoundVolume(#s_gt1,v,c_gt2)
    SoundVolume(#s_gt2,v,c_gt1)
    SoundVolume(#s_org,v,c_org)
    SoundVolume(#s_bss,v,c_bss)
    SoundVolume(#s_drm,v,c_drm)
    
    Delay(25)
  Next v
  
  quitted=1
EndProcedure

CreateThread(@playall(),0)
OpenWindow(0,0,0,400,200,"soundlooper",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
h=17
b=300
t_drm = TrackBarGadget(#PB_Any,0,0,b,h,0,100,1)
t1    = TextGadget(#PB_Any,b,0,100,h,"drums")
t_bss = TrackBarGadget(#PB_Any,0,h,b,h,0,100,1)
b1    = TextGadget(#PB_Any,b,h,100,h,"bass")
t_gt1 = TrackBarGadget(#PB_Any,0,h+h,b,h,0,100,1)
g1    = TextGadget(#PB_Any,b,h+h,100,h,"git1")
t_gt2 = TrackBarGadget(#PB_Any,0,h+h+h,b,h,0,100,1)
g2    = TextGadget(#PB_Any,b,h+h+h,100,h,"git2")
t_org = TrackBarGadget(#PB_Any,0,h+h+h+h,b,h,0,100,1)
o1    = TextGadget(#PB_Any,b,h+h+h+h,100,h,"organ")
t_tut = TrackBarGadget(#PB_Any,0,h+h+h+h+h,b,h,0,100,1)
f1    = TextGadget(#PB_Any,b,h+h+h+h+h,100,h,"tröte")

SetGadgetState(t_drm,v_drm)
SetGadgetState(t_bss,v_bss)
SetGadgetState(t_gt1,v_gt1)
SetGadgetState(t_gt2,v_gt2)
SetGadgetState(t_org,v_org)
SetGadgetState(t_tut,v_tut)

Repeat
  event=WaitWindowEvent()
  eventgadget=EventGadget()
  If event=#PB_Event_Gadget
    Select eventgadget
    Case t_drm
      v_drm=GetGadgetState(t_drm)
      SoundVolume(#s_drm,v_drm,c_drm)
    Case t_bss
      v_bss=GetGadgetState(t_bss)
      SoundVolume(#s_bss,v_bss,c_bss)
    Case t_gt1
      v_gt1=GetGadgetState(t_gt1)
      SoundVolume(#s_gt1,v_gt1,c_gt1)
    Case t_gt2
      v_gt2=GetGadgetState(t_gt2)
      SoundVolume(#s_gt2,v_gt2,c_gt2)
    Case t_tut
      v_tut=GetGadgetState(t_tut)
      SoundVolume(#s_tut,v_tut,c_tut)
    Case t_org
      v_org=GetGadgetState(t_org)
      SoundVolume(#s_org,v_org,c_org)
      
    EndSelect
  EndIf
Until event = #PB_Event_CloseWindow

quit=1
While Not quitted
  Delay(10)
Wend
Debug "schicht ..endlich .. hab schon ohrenkrebs von dem radau"

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 21:47
von Lebostein
Danke. Aber es geht noch etwas einfacher. Hier der Code aus meinem ZIP-File umgesetzt mit "Bordmitteln". Leider kann man die Position von Sounds nicht abfragen und setzen, deshalb fällt das für meine Zwecke flach... und ob die Synchronität gewährleistet ist, bleibt ein Rätsel. Außerdem scheint das Flag #PB_Sound_Streaming für LoadSound nicht funktioniert bzw. zu Abstürzen und eigenartigen Fehlermeldungen zu führen, deshalb hab ich das wieder rausgenommen.

Code: Alles auswählen

#Spur_Name = 10
#Spur_Laut = 50

Structure spur
  file.s
  sound.l
  laut.l
EndStructure

Global NewList spur.spur()

Procedure CreateSpur(file.s, laut.l)
  AddElement(spur())
  spur()\file = file
  spur()\laut = laut
EndProcedure

CreateSpur("HDL_basslauf.ogg", 100)
CreateSpur("HDL_floete.ogg", 0)
CreateSpur("HDL_schlagwerk.ogg", 0)
CreateSpur("HDL_gitarre1.ogg", 0)
CreateSpur("HDL_gitarre2.ogg", 0)
CreateSpur("HDL_orgel.ogg", 0)

; ------------------------------------------------

InitSound()
UseOGGSoundDecoder()

ForEach spur()
  spur()\sound = LoadSound(#PB_Any, spur()\file)
  SoundVolume(spur()\sound, spur()\laut)
Next

ForEach spur()
  PlaySound(spur()\sound, #PB_Sound_Loop | #PB_Sound_MultiChannel)
Next

; ------------------------------------------------

OpenWindow(0, 0, 0, 600, 250, "iMuse", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)

ForEach spur()
  index = ListIndex(spur())
  TextGadget(#Spur_Name + index, 50, 20 + index * 25, 300, 18, "Spur " + Str(index + 1) + ": " + spur()\file)
  TrackBarGadget(#Spur_Laut + index, 300, 20 + index * 25, 150, 18, 0, 100): SetGadgetState(#Spur_Laut + index, spur()\laut)
Next

; ------------------------------------------------

Repeat

Event = WaitWindowEvent(20)

ForEach spur()
  index = ListIndex(spur())
  If Event = #PB_Event_Gadget And EventGadget() = #Spur_Laut + index
    spur()\laut = GetGadgetState(#Spur_Laut + index)
    SoundVolume(spur()\sound, spur()\laut)
  EndIf
Next

Until Event = #PB_Event_CloseWindow

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 22:13
von bobobo
die umsetzung ist ja egal .. ich wollte halt nix klauen .. :mrgreen:

wenn alle 16695 msec die waves neu gestartet werden und alle genauso lang
sind, ist es synchron und bleibt synchron. allerhöchstens das starten der waves
nacheinander ergibt eine vermutlich absolut vernachlässigbare verzögerung.

ich seh grad ..dein code loopt im playsound-aufruf .. mein code loopt genau da nicht sondern
startet die waves nach 16695 msec neu. unter beibehaltung der lautstärke natürlich. :)

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 22:21
von Lebostein
bobobo hat geschrieben:die umsetzung ist ja egal .. ich wollte halt nix klauen

wenn alle 16695 msec die waves neu gestartet werden und alle genauso lang
sind ist es synchron und bleibt synchron. allerhöchstens das starten der waves
nacheinander ergibt eine vermutlich vernachlässigbare verzögerung.
Ah, jetzt verstehe ich deinen Code. Nach jedem Durchlauf ein kompletter Neustart. Ist ne Idee, die tatsächlich zu funktionieren scheint. Aber es muss doch noch eine elegantere Lösung geben. Schaue mir grade mal die BASS-Library (http://www.un4seen.com/) an. Als Features führen die auf:
High precision synchronization
Synchronize events in your software to the streams and MOD musics, synchronize playback of multiple channels together
http://www.un4seen.com/forum/?topic=812 ... 9#msg55479

Re: FMOD Ex - Mehrere Musikdateien gleichzeitig/synchron spi

Verfasst: 13.07.2010 22:24
von bobobo
mi der bass.dll (gefällt mir aus unerfindlichen gründen besser als fmod) hab ich mal ne
automatische disco gemacht .. ging ganz gut .. un4seen liefert die pb-includes praktischerweise
auf der seite mit.
da gibt es ein plugin das sich bass_mix nennt . damit sollte es möglich sein

aber warum bass wenn's pb auch tut.. ich bin immernoch der meinung, dass "mein" code
synchron genug ist. und kompliziert ist es auch eigentlich nicht.