Mit Bass.dll MP3 Abspielen mit Loop Points z.B. für Hintergrund Musik mithilfe von LoopSync

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von OnkelR.

    Mit Bass.dll MP3 Abspielen mit Loop Points z.B. für Hintergrund Musik mithilfe von LoopSync

    Vorwort:
    Da ich gerne mit Videospiele Musik Dateien hantiere wie z.b. ADX vom Gamecube/Wii, habe ich mir überlegt wie man so etwas in einer anderen Musikdatei machen kann z.B. MP3.
    ADX ist ein Audioformat für den Nintendo Gamecube und Wii entwickelt von der Firma CRI Middleware Inc.
    Dieses Format hat die besonderheit das in der Header (Dateikopf) sogenannte Loop Points angegeben sind und andere Format spezifische Informationen enthalten z.b. Kodierung, Kanäle ect.
    Das Problem ist nur, das solche Audioformate garnicht verbreitet sind bzw ein spezieller Encoder dafür gibt es nur für Entwickler'n der Videospieleindustrie.

    Welchen sinn haben Loop Points?
    In Videospielen hat es den sinn, das die Musik ständig in schleife abgespielt wird und man hat den eindruck das die Musik eine unendliche länge hat. So bleibt die Audiodatei verhältnismäßig klein und die Musik muss nicht vom neuen beginnen am Anfang. Wenn ihr eure Anwendung Hintergrund Musik ausstatten wollt als besipiel, bleibt die MP3 je nach Bitrate klein und man hat den eindruck als würde die Musik nie enden was im normalfall eine große MP3 Datei wäre. Das könnt ihr auch mit andere beliebige Musik Datei machen die Bass unterstützt.




    Folgende Importe werden benötigt:

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Imports System.Runtime.InteropServices
    3. Imports Un4seen.Bass.AddOn.Adx
    4. Imports Un4seen.Bass.AddOn.Adx.BASS_ADX_TAG_LOOP


    Haupt Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _loopSync As Integer = 0
    3. Private _loopSyncCallback As SYNCPROC
    4. Public stream As Integer = 0
    5. 'Zeitformat Samples zu Bytes umrechnen
    6. Public Function Samples2Bytes(ByRef Samples As Int32)
    7. Dim out As Int32
    8. out = Samples * 4
    9. Return out
    10. End Function
    11. Private Sub LoopSync(ByVal syncHandle As Integer, ByVal channel As Integer, ByVal data As Integer, ByVal user As IntPtr)
    12. Bass.BASS_ChannelSetPosition(channel, user.ToInt64())
    13. End Sub
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. BassNet.Registration("XXXXXXXX@XXXXXXXXX", "XXXXXXXXXXXXXX") 'Registration
    16. BassNet.ShowSplash(Me, 1, 0, 0) 'Splash Screen verstecken
    17. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero, Nothing)
    18. stream = Bass.BASS_StreamCreateFile(Application.StartupPath & "\test.mp3", 0, 0, BASSFlag.BASS_STREAM_AUTOFREE Or BASSFlag.BASS_STREAM_PRESCAN)
    19. 'Loop Point
    20. Dim LPS As Int32 = Samples2Bytes(00000000) 'Start Loop Point (Samples)
    21. Dim LPE As Int32 = Samples2Bytes(00000000) 'End Loop Point (Samples)
    22. _loopSyncCallback = New SYNCPROC(AddressOf LoopSync)
    23. _loopSync = Bass.BASS_ChannelSetSync(stream, BASSSync.BASS_SYNC_POS Or BASSSync.BASS_SYNC_MIXTIME, LPE, _loopSyncCallback, New IntPtr(LPS))
    24. 'Play MP3
    25. Bass.BASS_ChannelPlay(stream, False)
    26. End Sub
    27. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    28. Bass.BASS_Stop()
    29. End
    30. End Sub
    31. End Class



    Wie finde ich Loop Points?
    Loop Points kann man ganz einfach finden wenn die Musik Inhaltlich nochmal wiederholt wird was auch meisstens der fall ist. Ich benutze Adobe Audition.

    Die Loop Points müssen in Samples Zeitformat angegeben werden da diese präziser sind. Es reicht also nicht aus den zeitformat z.B. Start: 00:25, End: 01:22 anzugeben.


    Wenn ihr eine MP3 geöffnet habt in Adobe Audition, macht einen rechtsklick auf das Zeitformat und ändert es zu "Samples"

    Als nächstes suchen wir die Loop Points. Man benötigt übung und man sollte sich wenn man den Bereich makiert habt anhören ob die Punkte gut gesetzt sind. Man sollte auch rein Zoomen um die Punkte noch genauer zusetzen. Das ganze sieht dann so aus.


    Rechts sehen wir dann unsere Loop Points (siehe Beginn & Ende)
    Diese tragen wir dann in den Code ein und das sieht dann so aus.

    VB.NET-Quellcode

    1. 'Loop Point
    2. Dim LPS As Int32 = Samples2Bytes(830861) 'Start Loop Point (Samples)
    3. Dim LPE As Int32 = Samples2Bytes(1712006) 'End Loop Point (Samples)


    Wenn wir nun unsere Anwendung starten, wird die MP3 am anfang abgespielt bis zum End Point, und wenn die Position am End Point erreicht ist, springt dann zum Start Point und das endlos.

    Hinweis: Die Samples dürfen nur einen Maximalen Wert haben von 2147483647 Samples! Das entsrpicht ungefär ~6 Stunden Musik mit normaler Qualität, kann jedoch abweichen wenn man ein anderes Format benutzt.

    Viel Spaß damit :)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MichaSDL0403“ ()

    Hallo MichaSDL0403.
    Dir erstmal ein gesundes Neues Jahr.

    Ich finde Deinen Beitrag sehr interessant. Ich selber grase auch sämtliche Funktionen der Bass.dll ab, aber die Loop Points habe ich
    bisher in der Form noch nicht benötigt. Ich sags ja, die Bass.dll richtig auszuschöpfen, is 'ne Jahresaufgabe.
    :thumbsup:
    mfg OnkelR