Lückenlose Musikwiedergabe?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Fetze

Betreff: Lückenlose Musikwiedergabe?

BeitragDi, Jun 05, 2007 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho.

Im Zuge eines (für das Projekt) neuen Musikkonzepts, das ich in StarTrade implementieren möchte, benötige ich ein System, das es fertig bringt, einen Song ohne Verzögerung zu starten, sobald ein anderer abgeschlossen ist - auch ohne noch so kleine Lücke.
Die Idee dahinter ist im Wesentlichen, dass ich mehrere, recht kurze (~10 - 50 Sekunden lange) Musikteilstücke habe, die alle perfekt mit jedem anderen zusammenpassen und deren Reihenfolge ich dann auswürfele, um so ein dynamisches Musikstück zu erhalten, welches "weich" auf äußere Einflüsse reagieren und ansonsten möglichst viel Abwechslung bieten kann.
Das Problem dabei ist nun, dass diese "noch so kleine Lücke" mit dem BlitzMax-Soundsystem zwangsläufig zustande kommt. Hier:

(Sound durch beliebigen, definitiv loopbaren Sound ersetzen)
Code: [AUSKLAPPEN]
SuperStrict
SeedRnd MilliSecs()
Graphics 800, 600, 0, -1



Global sndTrack         :TSound      = LoadSound("PirateBG1-1.ogg", True)
Global chnChan         :TChannel
Global chnChan2         :TChannel

Repeat
   Cls
   
   If chnChan = Null Or ChannelPlaying(chnChan) = False Then
      If chnChan2 = Null Then
         chnChan = PlaySound(sndTrack)
      Else
         chnChan = chnChan2
         ResumeChannel chnChan
         chnChan2 = Null
      End If
      chnChan2 = CueSound(sndTrack)
   End If
   
   Flip
Until KeyHit(KEY_ESCAPE)


Obwohl ich den nächsten zu spielenden Sound bereits per CueSound vorbereite, entsteht eine Lücke. Selbst ohne FLip und ohne Cls. Egal, wie schnell das ganze läuft.

Gibt es Lösungsvorschläge? Alternativ würde ich mich auch über Empfehlungen für gute Sound-Dlls freuen, die sowohl auf Windows als auch auf Linux und im Idealfall auch Mac funktionieren, da ST seine plattformunabhängigkeit wahren soll.

Blitzcoder

Newsposter

BeitragDi, Jun 05, 2007 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Mittels Fmod sehr leicht zu bewerkstelligen, indem man die Songs von der Platte streamt. Wenn du FMod Installiert hast, etwa so. Das ist ein simples TPlay Type von meinem Player.

Code: [AUSKLAPPEN]

Type TPlay
   Global currentsong:Int
   Global Currenttitle:TMP3PlayListTitle
   Global yp:Float[29]
   Global toyp:Float[29]
   Global playing:Byte
   Global paused:Byte
   Global config_mixrate:Int
   Global config_maxsoftwarechannels:Int
   Global config_output:Int
   Global config_driver:Int
   Global config_timer:Int
   Global config_specr:Int,config_specg:Int,config_specb:Int
   
   Function Init()
      FSOUND_SetOutput(config_output)
      FSOUND_SetDriver(config_driver)
      Fsound_init(config_mixrate , config_maxsoftwarechannels , 0)
      FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit() , True)
      CreateTimer(config_timer)
   EndFunction
   
   Function Jump(p:Int)
      If playing Then
         FSOUND_Stream_settime(currentsong , FSOUND_Stream_getlengthms(currentsong) / 100 * p)
      EndIf
   End Function
   
   Function Channels:Int()
      Return Fsound_getchannelsplaying()
   EndFunction   
   
   Function Stop()
      FSound_Stream_stop(currentsong)
      playing = False
   End Function
   
   Function Pause()
      paused=1-paused
      Fsound_setpaused(FSOUND_ALL , paused)
   End Function
   
   Function Play(song:TMP3PlaylistTitle)
      FSOUND_STREAM_STOP(currentsong)
      FSOUND_STREAM_CLOSE(currentsong)
      currentsong = FSOUND_Stream_Open(song.url.tocstring() , FSOUND_NORMAL , 0 , 0)
      FSOUND_STREAM_Play(FSOUND_FREE , currentsong)
      TPlay.currenttitle = song
      playing = True
   End Function
   
   Function Getlength:Int()
      If playing Then Return FSOUND_stream_getlengthms(currentsong)
   End Function
   
   Function GetTime:Int()
      If currentsong Then Return FSOUND_Stream_gettime(currentsong)
   End Function
   
   Function DrawSpec(canvas:TGadget)
      If playing Then
         FSOUND_setVolume(FSOUND_ALL,SliderValue(volumeslider)*5)
         SetGadgetText label , FSOUND_Stream_getlength(currentsong)
         progbar.update(Float(FSOUND_stream_gettime(currentsong) ) / Float(FSOUND_Stream_getlengthms(currentsong) ) )
         SetGraphics CanvasGraphics(canvas)
         Cls
         Local spec:Byte Ptr = FSOUND_DSP_GetSpectrum()
         Local bnk:TBank = CreateStaticBank(spec , 512 * 4)
         
         For Local x:Int=0 To 285 Step 10
            Local yp:Float=(PeekFloat(bnk,x*4)*500)
            'SetColor (x / 8 * 32 , x / 8 * 16 , (128) + x / 8 * 2)   
            'DrawRect x , 50 - yp , 8 , yp + 2
            toyp[x/10] = yp
         Next
         calcspec()
         drawspec_()
         Flip 0
      EndIf
   End Function
   
   Function CalcSpec()
      For Local i:Int = 1 To 28
         If toyp[i] < yp[i] Then yp[i]:- Abs(yp[i]-toyp[i])/5.0
         If toyp[i] > yp[i] Then yp[i] = toyp[i]
      Next
   EndFunction
   
   Function DrawSpec_()
      If playing Then
         SetColor 240 , 240 , 240
         DrawRect 0,0,GadgetWidth(spectrumcanvas),ClientHeight(spectrumcanvas)
         SetColor config_specr,config_specg,config_specb
         For Local x:Int = 1 To 28
            DrawRect x * 10 , 50 - yp[x] , 8 , yp[x] + 2
            DrawRect x*10,50-yp[x]+yp[x]+2,8,yp[x]+2
         Next
      EndIf
   End Function
End Type


Die Spekfunktionen kannst du ignorieren, die Sind zum Zeichnen des Spektrums in meinen Canvas und dem updaten der Lautstärke nach einem Slider.

EDIT: Hier die Ini, in der die Config Sachen stehen:

Code: [AUSKLAPPEN]
[Global]
Mp3File=data/store.dat
PlayListFile=data/playlist.m3u
[PLAYER]
mixrate=44100
MaxSoftwareChannels=64
Output=2
Driver=0
SpecUpdatetimer=60
SpecR=180
SpecG=180
SpecB=255
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
  • Zuletzt bearbeitet von Blitzcoder am Di, Jun 05, 2007 21:01, insgesamt einmal bearbeitet

Artemis

BeitragDi, Jun 05, 2007 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir fällt da Fmod ein, gibts auch ein Modul für.

Fetze

BeitragDi, Jun 05, 2007 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich muss gestehen, ich habe die Suchenfunktion jetzt nicht länger als 5 Minuten aufgehalten - aber wo finde ich dieses FMod-Modul und im Idealfall auch noch eine Referenz / ein Tutorial dazu?

Und @Blitzcoder:
Gibt es deinen Player auch als ganzes irgendwo öffentlich zugänglich? Ich hab auch da jetzt nichts finden können.

Blitzcoder

Newsposter

BeitragDi, Jun 05, 2007 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist ein ganz simples Player, der nur MP3's und Ihre ID3's kann. Ist auch nicht sehr fortgeschritten,aber ich lade ihn mal inkl. Quellcode hoch. Moment bitte.

EDIT: Hier: https://www.blitzforum.de/upload/file.php?id=1605
Hier noch das Fmod-Modul. Ich bin mir jetzt nicht mehr sicher, aber ich glaube ich habe 1-2 Befehle und einige Konstanten hinzugefügt, die ich brauchte.

MfG Blitzcoder
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
  • Zuletzt bearbeitet von Blitzcoder am Di, Jun 05, 2007 21:39, insgesamt einmal bearbeitet

Fetze

BeitragDi, Jun 05, 2007 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, danke - zusammen mit dem FMod-Modul, das ich mittlerweile gefunden habe, sollte ich das für ST adaptieren können. Nur eine Frage: Warum arbeitest du mit FSound anstatt mit FMusic? Würde sich letzteres nicht anbieten? Wo ist da genau der Unterschied?

Und: Tust du aktiv etwas, um das von mir angesprochene Problem zu beheben oder ist das mit FMod einfach nicht gegeben?

Blitzcoder

Newsposter

BeitragDi, Jun 05, 2007 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube FMusic kann nicht streamen, deshalb. Ich habs nicht getestet, aber mit den Streams sollte ein lückenloses Abspielgen gehen. Ich man mal einige Versuche.

EDIT: So, ich hab etwas mit meinem Player herumexperimentiert, er schafft es, ohne Verzögerung abzuspielen, vorausgesezt natürlich, dass die Sounds vorher geladen bzw. "initialisiert" wurden.
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

Fetze

BeitragDi, Jun 05, 2007 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, danke - ich denke, ich werde selbst mal ein wenig damit herumexperimentieren, sobald ich FMod bei mir installiert hab.

Blitzcoder

Newsposter

BeitragDi, Jun 05, 2007 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
SuperStrict




FSOUND_SetOutput(2)
FSOUND_SetDriver(0)
Fsound_init(44100 , 64 , 0)

Local song:Int[21]

For Local i:Int = 0 To 20
   song[i] = FSOUND_STREAM_OPEN("test.wav".toCString(),FSOUND_NORMAL,0,0)
Next


For Local i:Int = 0 To 20
   FSOUND_STREAM_PLAY(FSOUND_FREE , song[i])
   
   Print "Playing "+i+"/20"
   
   Delay FSOUND_STREAM_GETLENGTHMS(song[i]) - 7
   
   
   FSOUND_STREAM_STOP(song[i])
Next


For Local i:Int = 0 To 20
   FSOUND_STREAM_CLOSE(song[i])
Next

Print "Fertig!"

End


So gehts. FMod Hab ich oben einen Link gepostet.

Hier noch die zip mit einem Rausch-WAV: https://www.blitzforum.de/upload/file.php?id=1608
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

Fetze

BeitragMi, Jun 06, 2007 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke - so sollte es eigentlich kein Problem mehr sein, FMod zum Laufen zu bekommen. Smile

Ich werds bei nächster Gelegenheit ausprobieren.

Fetze

BeitragMi, Jun 06, 2007 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich weis ja nicht.. es läuft jetzt zwar und es ist auch eine weitaus weniger hörbare Lücke dabei - aber ein "Knacken" bleibt trotzdem. Hier, mein Code:

Code: [AUSKLAPPEN]

SuperStrict
SeedRnd MilliSecs()
Graphics 800, 600, 0, -1

FSOUND_Init(44100, 256, 0)

Global ifmsOne         :Int   = FSOUND_Stream_Open("PirateBG1-1.ogg", FSOUND_NORMAL, 0, 0)
Global ifmcOne         :Int   = -1
Global iPlayTime      :Int

Repeat
   Cls
   
   If ifmcOne = -1 Or (MilliSecs() - iPlayTime) >= FSOUND_Stream_GetLengthMs(ifmsOne) Or FSOUND_IsPlaying(ifmcOne) = False Then
      If ifmcOne = -1 Then
         ifmcOne = FSOUND_Stream_Play(FSOUND_FREE, ifmsOne)
      Else
         FSOUND_Stream_Stop(ifmsOne)
         ifmcOne = FSOUND_Stream_Play(FSOUND_FREE, ifmsOne)
      End If
      iPlayTime = MilliSecs()
      Print ifmcOne
   End If
   
   Flip
Until KeyHit(KEY_ESCAPE)

FSOUND_Stream_Close(ifmsOne)
FSOUND_Close()

End


Hier, der verwendete Songausschnitt: www.fetzenet.de/PirateBG1-1.ogg
Hiermit ist das sogar noch besser zu hören:
www.fetzenet.de/Engine-Class4.wav

Was mache ich falsch?
(Übrigens tritt das Problem auch bei Bltizcoders letztem Beispielcode auf)

Blitzcoder

Newsposter

BeitragMi, Jun 06, 2007 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Knacken konnte ich hier nicht feststellen. Allerdings besteht das geheimnis darin den neunen Sound etwas früher Anfangen zu lassen, also z.B. 5 ms vor Ende des ersten. Ansonsten würde ich darauf tippen, dass es am Sound liegt. Hast du es mal mit der TestWav aus meinem Letzten Post versucht?

MfG Blitzcoder

EDIT: Also, ich hab etwas mit deinem Code rumprobiert. Mit der Testwav (nur rauschen) als meinem letzten Post hörte man den Übergang, ja. Wenn man allerdings die Zeile :
Code: [AUSKLAPPEN]
   If ifmcOne = -1 Or (MilliSecs() - iPlayTime) >= FSOUND_Stream_GetLengthMs(ifmsOne) Or FSOUND_IsPlaying(ifmcOne) = False Then


durch diese ersetzt:
Code: [AUSKLAPPEN]
   If ifmcOne = -1 Or (MilliSecs() - iPlayTime) >= FSOUND_Stream_GetLengthMs(ifmsOne)-5 Or FSOUND_IsPlaying(ifmcOne) = False Then

Hört man bei mir nichts mehr.
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

Fetze

BeitragMi, Jun 06, 2007 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch das "-5" oder ähnliche Werte in diese mBereich haben keine Auswirkungen auf das Knacken.. ôo

Ratchet

BeitragDo, Jun 07, 2007 8:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Folgendes habe ich der Fmod API Dokumentation entnommen:

Zitat:
FSOUND_Stream_SetLoopCount
Sets the stream to loop the number of times specified by the user. If not called it loops forever.

signed char F_API FSOUND_Stream_SetLoopCount(
FSOUND_STREAM *stream,
int count
);
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Fetze

BeitragDo, Jun 07, 2007 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
DIe Loop-Funktion habe ich auch gefunden - aber gerade darum geht es ja nicht. Ich will nichts loopen sondenr zwei verschiedene(!) Musikteilstücke, die perfekt zusammenpassen auch so exakt aneinander hängen, dass man keinen Übergang mehr hört. Andernfalls hätte ich auch die BlitzMax-Interne Loop-Funktion verwenden können, oder?

Ratchet

BeitragFr, Jun 08, 2007 9:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist es eventuell möglich mit Hilfe von CreateAudioSample aus deinen zwei Samples temporär eins zu machen?
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Fetze

BeitragFr, Jun 08, 2007 10:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, für sowas gibts keine Befehle - außerdem weis ich nicht, ob das mit Streaming überhaupt gehen würde.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jun 08, 2007 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz ohne Lücke, müsstest du dir vermutlich eine eigene .dll schreiben.^^

Auch wenn du es bereits schon erwäntest. Hier http://www.hectic.de/data/soundtest.rar mal ein Beispiel wie es mit Loop und einer Slidefunktion gehen könnte. In diesem Fall sind beide Samples .ogg genau gleich lang. Und mit genau gleich meine ich das auch (nicht die Dateilänge sondern die samplelänge). Mit Cursor kannst du dann zwischen beiden Loopsounds hin und her gleiten.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Fetze

BeitragFr, Jun 08, 2007 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm.. gar keine Möglichkeit?
Nagut - aber danke trotzdem für deinen Beispielcode, ich werd mir den auf jeden Fall mal ansehen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group