Bass.dll und BPM Counter

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von kollimann.

    Bass.dll und BPM Counter

    Hallo, ich bin dabei ein kleines Tool für mich zu schreiben das einiges an MIDI Signalen auswertet und weiter verarbeitet.
    Dazu hab ich mir die Bass.dll genommen, das MIDI Zeug funktioniert auch alles recht gut, heißt auch das die Bass.dll sauber arbeitet und eingebunden ist.

    Mein Werkzeug VB Express 2010

    Als nächstes benötige ich einen BPM Counter der Live aus dem Signal vom LineIn bzw Mic die BPM ermittelt.
    Damit steh ich völlig im dunkeln.
    Erste Gehversuche hab ich anhand von Beispielen hier aus dem Forum gemacht, indem ich einfach erstmal ein MP3 abspiele.
    Das Abspielen funktioniert ohne Probleme auch das Anzeigen von Pegeln geht, nur an BPM nicht zu denken.
    Ich wollte dieses Beispiel aus der Bass-Doku nehmen, ohne Erfolg, ich versteh ganicht was ich da tun soll.
    bass.radio42.com/help/html/bf4…f4f-b13b-da17f10a7a54.htm

    VB.NET-Quellcode

    1. Private _stream As Integer
    2. ' create a BPMCounter instance, the timer will be fired every 20ms
    3. Private _bpm As New BPMCounter(20, 44100)
    4. ...
    5. ' create a stream
    6. _stream = Bass.BASS_StreamCreateFile(_fileName, 0, 0, BASSFlag.BASS_DEFAULT)
    7. ' get the samplerate of that stream
    8. Dim info As New BASS_CHANNELINFO()
    9. Bass.BASS_ChannelGetInfo(_stream, info)
    10. ' and start playing the and also start the BPM counter
    11. If _stream <> 0 AndAlso Bass.BASS_ChannelPlay(_stream, False) Then
    12. 'playing...
    13. _bpm.Reset(info.freq)
    14. ' start our bpm timer callback
    15. Me.timerBPM.Start()
    16. End If
    17. Private Sub timerBPM_Tick(sender As Object, e As System.EventArgs)
    18. If _stream = 0 OrElse Bass.BASS_ChannelIsActive(_stream) <> BASSActive.BASS_ACTIVE_PLAYING Then
    19. Me.timerBPM.Stop()
    20. Return
    21. End If
    22. Dim beat As Boolean = _bpm.ProcessAudio(_stream, True)
    23. If beat Then
    24. ' display the live calculated BPM value
    25. Me.labelBPM.Text = _bpm.BPM.ToString("#00.0")
    26. End If
    27. End Sub


    Wenn ich erhlich bin hab ich keinen Plan wie ich das Beispiel nutzen soll, daher die Frage an euch, hat jemand schonmal was mit der BPM Sache gemacht und kann erklären wie es geht?
    Oder hat jemand einen anderen Weg wie ich an die BPM komme?
    Erstmal egal ob nun vom LineIn oder von einem MP3 welches abgespielt wird, mir gehts erstmal rein um die BPM Funktion.

    Danke für die Hilfe
    Kollimann
    Wenn du nun das Tick Event deines timerBPM abonierst, wird das klappen. Denke auch daran hier:

    VB.NET-Quellcode

    1. Private _bpm As New BPMCounter(20, 44100)


    Ist der erste Parameter fuer die TickFrequenz deines Timers, der Werte muss mit deinem timerBPM.Interval uebereinstimmen.
    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eddy“ ()

    Ok, was hab ich versucht, mein Code

    VB.NET-Quellcode

    1. Imports radio42.Multimedia.Midi
    2. Imports Un4seen.Bass
    3. Public Class Form1
    4. Private _bpm As New BPMCounter(20, 44100)
    5. Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    6. ......
    7. End Sub
    8. Private Sub timerBPM_Tick(sender As Object, e As System.EventArgs)
    9. If _stream = 0 OrElse Bass.BASS_ChannelIsActive(_stream) <> BASSActive.BASS_ACTIVE_PLAYING Then
    10. Me.timerBPM.Stop()
    11. Return
    12. End If
    13. Dim beat As Boolean = _bpm.ProcessAudio(_stream, True)
    14. If beat Then
    15. ' display the live calculated BPM value
    16. Me.labelBPM.Text = _bpm.BPM.ToString("#00.0")
    17. End If
    18. End Sub
    19. End Class


    1.Fehler Zeile 5 Typ BPMCounter ist nicht definiert.
    OK, Doku lesen -> bass.radio42.com/help/html/083…37c-66f2-9adfd42a8512.htm

    da verstehe ich das so, da steht ja "
    a) create an instance of this class (e.g. at the beginning of your application)"
    also ich geschrieben

    VB.NET-Quellcode

    1. Imports radio42.Multimedia.Midi
    2. Imports Un4seen.Bass
    3. Public NotInheritable Class BPMCounter
    4. Private _bpm As New BPMCounter(20, 44100)
    5. End Class
    6. Public Class Form1
    7. Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    8. ......
    9. End Sub
    10. End Class


    nächster / anderer Fehler Zeile 5 Zu viele Argumente für "Public Sub New()"

    also ich scheiter ja schon an der Deklaration.......oder wo liegt hier mein Fehler?
    was meinen die mit
    create an instance of this class (e.g. at the beginning of your application)


    ich versteh nicht was aus dem Beispiel in welche Class muss/soll, oder gehört das garnicht zusammen?
    bass.radio42.com/help/html/083…37c-66f2-9adfd42a8512.htm
    und
    bass.radio42.com/help/html/bf4…f4f-b13b-da17f10a7a54.htm


    Danke Kollimann
    Importiere Un4seen.Bass.Misc dann ist BPMCounter verfuegbar.

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Imports Un4seen.Bass.Misc
    3. Public Class Form1
    4. Private _stream As Integer
    5. Private _bpm As New BPMCounter(20, 44100)
    6. Private timerBPM As New Timer With {.Interval = 20, .Enabled = False}
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. BassNet.Registration("", "")
    9. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero, Nothing)
    10. AddHandler timerBPM.Tick, AddressOf timerBPM_Tick
    11. End Sub
    12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    13. _stream = Bass.BASS_StreamCreateFile("mp3.mp3", 0, 0, BASSFlag.BASS_DEFAULT)
    14. Dim info As New BASS_CHANNELINFO()
    15. Bass.BASS_ChannelGetInfo(_stream, info)
    16. If _stream <> 0 AndAlso Bass.BASS_ChannelPlay(_stream, False) Then
    17. _bpm.Reset(info.freq)
    18. Me.timerBPM.Start()
    19. End If
    20. End Sub
    21. Private Sub timerBPM_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
    22. If _stream = 0 OrElse Bass.BASS_ChannelIsActive(_stream) <> BASSActive.BASS_ACTIVE_PLAYING Then
    23. Me.timerBPM.Stop()
    24. Return
    25. End If
    26. Dim beat As Boolean = _bpm.ProcessAudio(_stream, True)
    27. If beat Then
    28. Me.Text = _bpm.BPM.ToString("#00.0")
    29. End If
    30. End Sub
    31. End Class


    kollimann schrieb:

    also ich geschrieben


    Lade dir mal eines der kostenlosen VB Buecher runter und schau mal da rein, was da ueber Instance/Instanz zu finden ist.
    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eddy“ ()

    Lade dir mal eines der kostenlosen VB Buecher runter und schau mal da rein

    Hab ich gestern direkt gemacht, nur mit dem rein schauen ......naja.

    GUT, das was du mir geschrieben hast passt soweit DANKE DANKE.........!!!!!!

    naja, da setz ich mich mal an Step2, also das nun vom LineIn bzw. Mic.
    Mal sehen wie weit ich komme

    Danke Kollimann
    Muss nochmal fragen :evil:

    Wollte zum spielen mal diese Peak Anzeige einbauen aus dem Tut hier aus dem Forum.
    Bass.Dll Tutorial

    an folgender Stelle

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Bass.BASS_ChannelGetLevel(stream, peak)
    3. Dim rechts As Integer = (Math.Round(peak(1), 3) * 100).ToString

    bekomm immer die Fehlermeldung ....
    Fehler 1 "BASS_ChannelGetLevel" ist mehrdeutig, da in class "Un4seen.Bass.Bass" mehrere Arten von Membern mit diesem Namen vorhanden sind.

    google hilf da auch nicht.....
    Ich konnte das reproduzieren mit der aktuellen Bassnet-Version(in VS2010E), in VS13E funktioniert es, auch mit aelteren Frameworks. Versuch es mal mit einer aelteren Version der bassnet oder nimm einen neuere VS-Version.
    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eddy“ ()

    Ok, fand keine alten Versionen auf der Homepage, nur zweifelhafte Downloadarchive. Stellt aber kein Problem dar, ich habe mal in die BassNet geschaut, dachte erst via Pinvoke die bass.dll direkt nutzen, aber nicht mal notig, so reichts hier aus: :)

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Public Class Form1
    3. Private _stream As Integer
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. BassNet.Registration("", "")
    6. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero, Nothing)
    7. End Sub
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. _stream = Bass.BASS_StreamCreateFile("mp3.mp3", 0, 0, BASSFlag.BASS_DEFAULT)
    10. Bass.BASS_ChannelPlay(_stream, True)
    11. End Sub
    12. 'Quelle der Function BassNet.dll
    13. Public Function BASS_ChannelGetLevel(ByVal handle As Integer, ByVal level As Single()) As Boolean
    14. If level.Length <= 0 Then
    15. Return False
    16. End If
    17. Array.Clear(level, 0, level.Length)
    18. Dim num As Integer = CInt(Bass.BASS_ChannelSeconds2Bytes(handle, 0.02))
    19. If num > 0 Then
    20. Dim array As Single() = New Single(CInt(num / 4)) {}
    21. num = Bass.BASS_ChannelGetData(handle, array, num Or 1073741824)
    22. num = CInt(num / 4)
    23. Dim num2 As Integer = 0
    24. For i As Integer = 0 To num - 1
    25. Dim num3 As Single = Math.Abs(array(i))
    26. If num3 > level(num2) Then
    27. level(num2) = num3
    28. End If
    29. num2 += 1
    30. If num2 >= level.Length Then
    31. num2 = 0
    32. End If
    33. Next
    34. Return True
    35. End If
    36. Return False
    37. End Function
    38. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    39. Dim peak(2) As Single
    40. If BASS_ChannelGetLevel(_stream, peak) Then
    41. Dim rechts As Single = peak(1) * 100.0F
    42. Dim links As Single = peak(2) * 100.0F
    43. Me.Text = String.Format("Links: {0:0.000} Rechts: {1:0.000}", links, rechts)
    44. End If
    45. End Sub
    46. End Class


    Edit:
    @kollimann

    Ich sitzt ja auch schon laenger(Ewig) an meinem Player. Jetzt isser fuer meine Ansrpueche gut, jetzt wird die Optik richtig poliert, ich sitz gerade an einem Equalizer-Control(siehe Anhang), da kann ich Tester brauchen, wenn du interesse hasst, sag Bescheid.
    Bilder
    • Unbenannt.png

      254,54 kB, 1.360×768, 175 mal angesehen
    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eddy“ ()