MP3 als Waveform anzeigen

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Benutzeravatar
Then
Beiträge: 240
Registriert: 06.09.2004 13:26
Wohnort: Siegen

MP3 als Waveform anzeigen

Beitrag 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
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
Then
Beiträge: 240
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: MP3 als Waveform anzeigen

Beitrag 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
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: MP3 als Waveform anzeigen

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Then
Beiträge: 240
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: MP3 als Waveform anzeigen

Beitrag 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.
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: MP3 als Waveform anzeigen

Beitrag von ccode_new »

@Then:

Du hast jetzt eine PN.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Then
Beiträge: 240
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: MP3 als Waveform anzeigen

Beitrag 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:
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: MP3 als Waveform anzeigen

Beitrag 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)))
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Then
Beiträge: 240
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: MP3 als Waveform anzeigen

Beitrag 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 ...
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: MP3 als Waveform anzeigen

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Then
Beiträge: 240
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: MP3 als Waveform anzeigen

Beitrag 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:
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Antworten