Visualisierung mit Bass.dll

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von NscMike.

    Visualisierung mit Bass.dll

    Hallo @ all

    Ich spiele gerade etwas mit der Bass.dll herum und wollte jetzt mal eine Visualisierung probieren. Diese sollte so aussehen:



    Wie kann ich das realisieren? Habe schon mir das Tutorial der Bass.dll durchgelesen aber da wird ja eine andere Visualisierung angesprochen. Wie kann ich meine darstellen?

    Hoffe auf eure Hilfe. Viele Grüße
    Crosaider
    damit bekomme ich es auch nicht richtig hin...
    Er sagt immer es wäre ein Fehler aufgetreten. Habs durch nen C# zu VB.net konverter gejagt

    Habe im Inet auch noch das gefunden. Aber da weiß ich nicht wie ich es in einer PictureBox ausgebe...

    VB.NET-Quellcode

    1. Dim OSC(1023) As Integer
    2. Dim OSCData(1023) As Single
    3. Dim oLeft, oRight As Single
    4. Bass.BASS_ChannelGetData(stream, OSC, 1024)
    5. For i = 0 To 511
    6. oLeft = Un4seen.Bass.Utils.HighWord(OSC(i))
    7. oRight = Un4seen.Bass.Utils.LowWord(OSC(i))
    8. Dim y As Single = ((oLeft + oRight) / (2 * 65535)) * (PictureBox5.ClientRectangle.Height)
    9. OSCData(i) = y
    10. Next
    ja was ist denn für ein Fehler aufgetreten? Ich will nicht nur raten? Die Anzeige der Visualisierung machst du mit GDI+(sollte viel zu finden sein...)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich habe mir das ganze jetzt umgeschrieben. Sieht jetzt so aus:

    VB.NET-Quellcode

    1. Public Shared Function MyRecording(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    2. ' Array zum speichern der FFT Daten
    3. Dim Daten As Single = (255)
    4. ' Handle
    5. handle = handle
    6. ' Handle erstellen
    7. Dim hGC As GCHandle = GCHandle.Alloc(Daten, GCHandleType.Pinned)
    8. ' Daten auslesen
    9. Bass.BASS_ChannelGetData(handle, hGC.AddrOfPinnedObject(), CInt(BASSData.BASS_DATA_FFT512))
    10. Return True
    11. End Function


    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. ' Bass Initialisieren
    3. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero, Nothing)
    4. ' Record auf Default Defice
    5. Bass.BASS_RecordInit(-1)
    6. Dim myRecProc As New RECORDPROC(MyRecording)
    7. ' Channel festlegen
    8. Dim recChannel As Integer = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, 50, myRecProc, IntPtr.Zero)
    9. ' Record starten
    10. Bass.BASS_ChannelPlay(recChannel, False)
    11. End Sub


    Bei

    VB.NET-Quellcode

    1. Dim myRecProc As New RECORDPROC(MyRecording)


    kommt jetzt der Fehler:

    Der Delegat "Un4seen.Bass.RECORDPROC"erfordert als einziges Argument für seinen Konstruktor einen AddressOf-Ausdruck oder einen Lambda-Ausdruck.
    und MyRecording ist unterstrichen.
    nein, diese sollte bereits automatisch aufgerufen werden...jedoch sollte in der MyRecording Funktion nach dem Aufruf von "BASS_ChannelGetData" in der Variable Daten ein Wet stehen, am besten du guckst dir diesen mal an, bzw. lässt dir diesen ausgeben(am besten nicht mit MessageBox, da dies sich immer ändern sollte...)

    bei diesen Angaben keine Gewähr, da ich noch nie mit der Bass.dll gearbeitet habe :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Das Array kann ich mir nicht ausgeben lassen, weil es ja nicht global deklariert ist. Wenn ich das so mache kommt immer:

    Dim hGC As GCHandle = GCHandle.Alloc(Daten, GCHandleType.Pinned)
    Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.

    Aber wie kann ich das denn dann in einer PictureBox ausgeben lassen?
    lass es doch wie es ist und setz vor Return True eine Globale Variable auf den Wert von Daten...
    im Paint Event der PictureBox zeichnest du dann einfach entsprechend...)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    dann kommt der gleiche Fehler immernoch... liegt an dem Shared bei der Funktion

    Habe das mal wegemacht und dann vor return

    Label1.Text = Daten

    gemacht aber adnn passiert nichts. Manchmal kommt auch beim Programmstart sofort der Fehler:

    Eine nicht behandelte Ausnahme des Typs "System.ExecutionEngineException" ist in mscorlib.dll aufgetreten.

    und das Programm beendet sich wieder.
    ja das geht auch nicht, weil adnn immernoch der Fehler:

    Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.

    kommt. Das soll doch auch in die MyRecord Funktion oder?

    VB.NET-Quellcode

    1. Public Shared Function MyRecording(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    2. ' Array zum speichern der FFT Daten
    3. Dim Daten() As Single = New Single(255) { }
    4. ' Handle
    5. handle = handle
    6. ' Handle erstellen
    7. Dim hGC As GCHandle = GCHandle.Alloc(Daten, GCHandleType.Pinned)
    8. ' Daten auslesen
    9. Bass.BASS_ChannelGetData(handle, hGC.AddrOfPinnedObject(), CInt(BASSData.BASS_DATA_FFT512))
    10. Me.Label1.Text = Daten(128).ToString()
    11. Return True
    12. End Function

    so hätte ich das jetzt mal gemacht und da sollte eigentlich kein Fehler kommen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Dann kommt:

    "Me" ist nur innerhalb einer Instanzenmethode gültig.

    Und wenn ich das weg lasse kommt der gleiche Fehler wie oben...

    Mal mein ganzen Projekt:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Un4seen.Bass
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. Public stream As Integer
    5. Dim Frequenz As Single
    6. Public Shared Function MyRecording(ByVal handle As Integer, ByVal buffer As IntPtr, ByVal length As Integer, ByVal user As IntPtr) As Boolean
    7. ' Array zum speichern der FFT Daten
    8. Dim Daten() As Single = New Single(255) {}
    9. ' Handle
    10. handle = handle
    11. ' Handle erstellen
    12. Dim hGC As GCHandle = GCHandle.Alloc(Daten, GCHandleType.Pinned)
    13. ' Daten auslesen
    14. Bass.BASS_ChannelGetData(handle, hGC.AddrOfPinnedObject(), CInt(BASSData.BASS_DATA_FFT512))
    15. Me.Label1.Text = Daten(128).ToString()
    16. Return True
    17. End Function
    18. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    19. ' Bass Initialisieren
    20. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero, Nothing)
    21. ' Record auf Default Defice
    22. Bass.BASS_RecordInit(-1)
    23. Dim myRecProc As New RECORDPROC(AddressOf MyRecording)
    24. ' Channel festlegen
    25. Dim recChannel As Integer = Bass.BASS_RecordStart(44100, 2, BASSFlag.BASS_RECORD_PAUSE, 50, myRecProc, IntPtr.Zero)
    26. ' Record starten
    27. Bass.BASS_ChannelPlay(recChannel, False)
    28. End Sub
    29. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    30. stream = Bass.BASS_StreamCreateFile(TextBox1.Text, 0, 0, BASSFlag.BASS_STREAM_AUTOFREE Or BASSFlag.BASS_STREAM_PRESCAN)
    31. Bass.BASS_ChannelPlay(stream, False)
    32. End Sub
    33. End Class