Seite 1 von 2

MP3 als Waveform anzeigen

Verfasst: 13.01.2019 16:45
von Then
Habe aus dem englischen Forum diesen Code und er scheint auch zu funktionieren, naja fast. Irgendwie ist es bei mir nur eine 3 Pixel dicke Linie... wie zoomt man das ? Kann jemand helfen ? Wollte eigentlich die PEAKs anzeigen lassen und kam darauf.....

Code: Alles auswählen

IncludeFile "D:\bass.pbi"     ; Pfad anpassen !!!
BASS_Load_Library("D:\bass.dll") 
Filename.s = "D:\test.mp3"
 
Structure Sample
  l.w
  r.w
EndStructure

Procedure UpdateWaveImage(PBImage, *SampleData.Sample, SampleCount)
  Protected.i Width, Height, x, VOffsetL, VOffsetR, MUL
  Protected.i SamplesPerPixel, sample
  Protected.w MinL, MaxL, MinR, MaxR
  If *SampleData And SampleCount
    StartDrawing(ImageOutput(PBImage))
    Width = OutputWidth() : Height = OutputHeight()
    VOffsetL = Height >> 2 : VOffsetR = VOffsetL + Height >> 1
    MUL = (VOffsetL * $19999) >> 16
    Box(0, 0, Width, Height, $FFE0E0E0)
    Line(0, VOffsetL, Width, 1, $FFA0A0A0)
    Line(0, VOffsetR, Width, 1, $FFA0A0A0)
    SamplesPerPixel = (SampleCount + Width - 1) / Width
    If SampleCount
      MinL = *SampleData\l : MinR = *SampleData\r : MaxL = MinL : MaxR = MinR     
      While SampleCount
        If *SampleData\l < MinL : MinL = *SampleData\l : ElseIf *SampleData\l > MaxL : MaxL = *SampleData\l : EndIf
        If *SampleData\r < MinR : MinR = *SampleData\r : ElseIf *SampleData\r > MaxR : MaxR = *SampleData\r : EndIf
        sample + 1 : SampleCount - 1
        If sample = SamplesPerPixel Or SampleCount = 0
          MinL = (MinL * MUL) >> 16 : MaxL = (MaxL * MUL) >> 16
          MinR = (MinR * MUL) >> 16 : MaxR = (MaxR * MUL) >> 16
          LineXY(x, VOffsetL - MinL, x, VOffsetL - MaxL, $FFFF8000)
          LineXY(x, VOffsetR - MinR, x, VOffsetR - MaxR, $FFFF8000)
          MinL = *SampleData\l : MinR = *SampleData\r : MaxL = MinL : MaxR = MinR
          x + 1 : sample = 0
        EndIf
        *SampleData + 4
      Wend
    EndIf
    StopDrawing()
  EndIf 
EndProcedure

BASS_Init(-1, 44100, 0, 0, #Null)

Channel  = BASS_StreamCreateFile(#False, @Filename, 0, 0, #BASS_STREAM_PRESCAN|#BASS_STREAM_DECODE|#BASS_UNICODE)
BASS_ChannelSetPosition(Channel, BASS_ChannelSeconds2Bytes(Channel, 200.360), #BASS_POS_BYTE) 
length = BASS_ChannelSeconds2Bytes(Channel, 0.500) 
Dim Buffer.Sample(length >> 2)
BASS_ChannelGetData(Channel, @Buffer(), length)

OpenWindow(0, 0, 0, 620, 320, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

WaveImage = CreateImage(#PB_Any, 600, 300) 
UpdateWaveImage(WaveImage, @Buffer(), length >> 2)
ImageGadget(1, 10, 0, 600, 300, ImageID(WaveImage))

Repeat
  event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow

Re: MP3 als Waveform anzeigen

Verfasst: 13.01.2019 16:59
von Then
Interessant wäre auch folgenden Code in PB umzuwandeln, aber ich habe da leider keine Ahnung.... ich brauche ja nur die Lautstärke grafisch.... kann das jemand ??

Code: Alles auswählen

Imports Un4seen.Bass
Public Class Form1
    Public stream As Integer
    Public peak(2) As Single
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero, Nothing)
        stream = Bass.BASS_StreamCreateFile("F:\Filme&Musik\Musik\Pink Floyd\Pink Floyd-Brick the Wall.mp3", 0, 0, BASSFlag.BASS_STREAM_AUTOFREE Or BASSFlag.BASS_STREAM_PRESCAN)
        Bass.BASS_ChannelPlay(stream, False)
    End Sub
    Private Sub Peak_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Bass.BASS_ChannelGetLevel(stream, peak)
        Dim rechts As Integer = (Math.Round(peak(1), 3) * 100)
        Dim links As Integer = (Math.Round(peak(2), 3) * 100)
        Try
            ProgressBar1.Value = rechts
            ProgressBar2.Value = links
        Catch
        End Try
    End Sub
End Class

Re: MP3 als Waveform anzeigen

Verfasst: 13.01.2019 18:28
von ccode_new
Hallo Then,

der obere Code ist doch toll.

Du musst doch nur diese Werte anpassen:

Code: Alles auswählen

Channel  = BASS_StreamCreateFile(#False, @Filename, 0, 0, #BASS_STREAM_PRESCAN|#BASS_STREAM_DECODE|#BASS_UNICODE)
BASS_ChannelSetPosition(Channel, BASS_ChannelSeconds2Bytes(Channel, 0), #BASS_POS_BYTE) ;Position in Sekunden angeben (Bsp. Startposition: 0)
length = BASS_ChannelSeconds2Bytes(Channel, 120) ;Länge der anzuzeigenden Sekunden angeben. (z.B. 120 = 2 Minuten)
Dim Buffer.Sample(length >> 2)
BASS_ChannelGetData(Channel, @Buffer(), length)
Sollte eigentlich funktionieren.

Anbei:

Achtung! Hier immer schön teilen, oder Bitshiften!
Aber dabei immer die Länge beachten!

Bsp.:

length = BASS_ChannelSeconds2Bytes(Handle, 2)
UpdateWaveImage(WaveImage, @Buffer(), length >> 4)

Noch ein paar kleine Tipps!

Bleibe lieber im Bass-Unicode-Modus, dann kannst auch @Filename benutzen und musst nicht UTF8(Filename) schreiben.
Du kannst das hier: #BASS_STREAM_PRESCAN|#BASS_STREAM_DECODE auch weglassen und die Visualisierung bei einer normalen Wiedergabe nutzen.
Und auch Threads/Timer sind hier deine Freunde.

Re: MP3 als Waveform anzeigen

Verfasst: 14.01.2019 10:40
von Then
Danke, ich sehe schon, du scheinst ein BASS-Genie zu sein, ich komme da nicht mit und muss noch probieren und testen und dabei vergeht ne menge Zeit. Ich versuche mal zu verstehen, was genau du meinst.... Ein funktionierendes Code-Beispiel würde mir sehr helfen, wenn ich da einige Werte einfach verändere und sehe, was passiert, dann begreife ich´s evtl Besser.

Re: MP3 als Waveform anzeigen

Verfasst: 14.01.2019 18:12
von ccode_new
@Then:

Du hast jetzt eine PN.

Re: MP3 als Waveform anzeigen

Verfasst: 16.01.2019 21:36
von Then
Ich bekomme es nicht hin.... Stelle mich zu blöd an. Hat nicht jemand einen Ansatz für mich ? Ein mp3 in 1900x150 Pixel anzeigen ? Ohne scrollen, ohne Bewegung, einfach nur ein Bild.... Es wäre nett.... :cry:

Re: MP3 als Waveform anzeigen

Verfasst: 16.01.2019 22:24
von ccode_new
1. Tipp:

Code: Alles auswählen

BASS_ChannelSetPosition(Channel, BASS_ChannelSeconds2Bytes(Channel, 0), #BASS_POS_BYTE)

length = BASS_ChannelSeconds2Bytes(Channel, BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, #BASS_POS_BYTE)))

Re: MP3 als Waveform anzeigen

Verfasst: 17.01.2019 20:45
von Then
Hilft mir leider nicht weiter. Ich dachte das ist ein Forum in dem geholfen wird. Mit Rätsel komme ich nicht weiter - andere evtl auch nicht.

Was ist denn für die Profis unter euch so schwer, einen Code zu posten ? Aus nem lauffähigen Code kann man auch lernen, wenn man die Werte verändert und dann sieht, was raus kommt. Warum ist das hier so schwierig ? In jedem anderen Foren geht's doch auch ...

Re: MP3 als Waveform anzeigen

Verfasst: 17.01.2019 21:24
von #NULL
Warum ist das hier so schwierig ?
keine bass.dll, geschweige denn eine bass.so für linux die ich bräuchte. keine bass.pbi. Ich forste nicht das englische Forum durch nach irgendwelchen auf-gut-glück versionen. Hättest ja mal resourcen verlinken können.

Re: MP3 als Waveform anzeigen

Verfasst: 18.01.2019 10:56
von Then
Warum fühlst du dich eigentlich angesprochen ? Es gibt einige User hier im Forum, die mit der BASS-DLL viel zu tun haben und sich super damit auskennen. Die sind angesprochen. Die können das aus dem FF... Warum helfen die nicht, die es können ? Dafür ist doch eigentlich so ein Forum da, oder ? Statt sein Wissen zu teilen, nimmt man wohl alles mit ins Grab :|

Wenn ich nen Fliesenleger frage, ob er mir das Fliesen mal zeigt, legt der mir auch nicht nur eine Fliese und nen Spachtel hin und sagt, "Ist mal der erste Tipp, nu mach mal.." /:->

Ich denke, es wird gleich wieder hier ausarten, also belassen wir es bei Tipps und Andeutungen und ich hake das Thema ab. Danke ... :allright: