Lückenlose Musikwiedergabe?
Übersicht

![]() |
FetzeBetreff: Lückenlose Musikwiedergabe? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir fällt da Fmod ein, gibts auch ein Modul für. | ||
![]() |
Fetze |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gut, danke - ich denke, ich werde selbst mal ein wenig damit herumexperimentieren, sobald ich FMod bei mir installiert hab. | ||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke - so sollte es eigentlich kein Problem mehr sein, FMod zum Laufen zu bekommen. ![]() Ich werds bei nächster Gelegenheit ausprobieren. |
||
![]() |
Fetze |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auch das "-5" oder ähnliche Werte in diese mBereich haben keine Auswirkungen auf das Knacken.. ôo | ||
![]() |
Ratchet |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, für sowas gibts keine Befehle - außerdem weis ich nicht, ob das mit Streaming überhaupt gehen würde. | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm.. gar keine Möglichkeit?
Nagut - aber danke trotzdem für deinen Beispielcode, ich werd mir den auf jeden Fall mal ansehen. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group