Brauche Hilfe mit NAudio

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von pc-freack.

    Brauche Hilfe mit NAudio

    Hallo,

    ich habe einen Raspberry Pi, der ein RGB LED-Band ansteuern soll.
    Nun schreibe ich gerade eine Software, die sich per TCP mit dem Raspi verbindet
    und dann dort die Befehle zum verarbeiten sendet.
    Nun möchte ich, dass das LED-Band nach der Musik arbeitet.
    Deshalb muss ich mit meiner Software noch die aktuellen Frequenzen des Line-Out Ausgangs vom Rechner
    auslesen. Dafür habe ich mich für die NAudio Lib entschieden, jedoch hab ich null ahnung,
    wie ich die Frequenzen/Daten vom Line-Out Ausgangs auslesen soll.
    Ich weiß nur, wie ich Dateien abspiele und davon dann die Frequenzen/Daten etc. auslesen kann.

    MfG pc-freack
    Bin mir nicht sicher was du machen möchtest. Aber soll das sowas in der Art werden: Klick
    Wenn ja würde ich es erstmal so machen, dass du Binär den Wert(ein oder aus) jeder LED sendest. Mit VB kannst du dann berechnen was du darstellen möchtest. In dem Fall wäre das dann halt ein Frequenzspektrum. Ich habe das auch so gemacht und hat zu 100% funktioniert und bin auch recht zufrieden damit. Einziger Unterschied bei mir war, dass ich nix so modernes wie nen Rasperry Pi verwendet habe sondern nur einen Atmega8 und ne RS232 zum senden. Was ich jedoch nicht ganz verstehe ist, was du mit Line-Out Ausgang meinst. Ausgang vom Rasperry? Das ist wohl kaum möglich da dieser soviel ich weiß mit Linux läuft. Auch bei Windows kannst du nicht direkt lesen was ausgegeben wird oder nur schwer. Mit Glück wird es unterstützt oder halt auch nicht. Was hältst du von der Idee das Lied via VB wiederzugeben? Wäre auch performanter, würde zu 100% unterstützt werden und weniger aufwendig.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Nein, mir geht es Hauptsächlich darum, das ich mit NAudio ein Frequenzspektrum mache.
    Weil diese Daten werde ich dann an den Rasperry senden, die dann dort verarbeitet werden.
    Das Programm soll den Line-Out Ausgang vom PC (Windows) auslesen, evtl. dann verarbeiten und dann Informationen
    an den Raspberry senden.
    Danke für die tollen Infos. Window und SteroMix???
    Was erwartest du dir eigentlich? Dass dir jemand fertigen Code reinstellt?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Also es soll auf Windows 7 laufen.
    Und was meinst du mit SteroMix?
    Natürlich erwarte ich hier nicht, das mir hier jemand einen fertigen Code reinstellt.

    Ich möchte nur wissen, wie ich mit der NAudio Lib sowas wie ein Spectrum Analyser erstell.
    Ein paar Beispiele etc. würde mir schon reichen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „pc-freack“ ()

    Ja, das bringt mich doch schonmal ein Stück weiter.

    Bis jetzt hab ich folgenden Code:

    Code

    VB.NET-Quellcode

    1. public static MMDevice device;
    2. private static NAudio.Wave.WasapiLoopbackCapture waveIn;
    3. private static void InitAudio()
    4. {
    5. if (Properties.Settings.Default.Device == "")
    6. {
    7. device = NAudio.CoreAudioApi.WasapiCapture.GetDefaultCaptureDevice();
    8. }
    9. else
    10. {
    11. var enumerator = new MMDeviceEnumerator();
    12. var endPoints = enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);
    13. foreach (var endPoint in endPoints)
    14. {
    15. if (endPoint.FriendlyName == Properties.Settings.Default.Device)
    16. {
    17. device = endPoint;
    18. }
    19. }
    20. }
    21. device.AudioClient.Initialize(AudioClientShareMode.Shared, AudioClientStreamFlags.Loopback, (25 * 100), 0, device.AudioClient.MixFormat, Guid.Empty);
    22. waveIn = new NAudio.Wave.WasapiLoopbackCapture(device);
    23. waveIn.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(WaveIn_DataAvailable);
    24. waveIn.StartRecording();
    25. }
    26. private static void WaveIn_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
    27. {
    28. }


    Nun weiß ich jedoch nicht, ob es erstens, richtig ist und zweitens, wie ich nun
    die einzelnen Frequenzen auslese.
    Die Anwendung startet Problemlos etc.
    Somit ist schonmal kein Fehler drin.

    Wäre super, wenn ihr mir noch etwas auf die Sprünge helfen könntet.

    MfG pc-freack

    EDIT:
    Folgendes hab ich so ähnlich vor, nur halt in meinem Programm:
    Das auf dem Bild ist ein Spectrum Analyser als Gadget.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „pc-freack“ ()

    Nö. Jetzt ist halt Eigeninitiative angesagt. Ich habe bei meiner Audiolib wie für alles einen Stream erstellt welcher die FFT durchführt und die Resultate durch ein Event raus haut. Diese sind komplex und somit musst du diese zuerst in einen Prozentbetrag umrechnen. Dazu zuerst den Betrag berechnen durch folgendes: n = sqrt(real² + img²). Nun kannst du mit diesem Ergebnis die Intensität berechnen: 10 * log(n).
    Um sicher zu gehen noch sicherstellen, dass die Intensität nicht kleiner als ein Min-Wert ist. Ich rechne hier mit -96DB. Nun hast du das Ergebnis welches du nur noch in einen Prozentbetrag umrechnen musst. Das heißt p = intensität / -96. <- deshalb auch sicherstellen, dass minimal -96 ist, da sonst ein Wert über 100% raus kommen kann. Anschließend noch p = 1 - |p| und du hast das Ergebnis welches nun von 0 - 1 die Prozent beinhaltet. Mit dem kannst du nun die Anzahl der zu darstellenden LEDs berechnen. Wie du diese dann darstellst ist dann deine Sache. Wie gesagt. Ich habe einfach jeweils 1 Byte genommen und in diesem die Zustände von 8 LEDs gespeichert(8 bit -> ein oder aus). Anschließend als ich alle Werte hatte habe ich diese einfach über eine serielle Schnittstelle auf meinen Microcontroller gesendet, wo dann der AVR Assembler übernommen hat :).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Das hört sich extrem kompliziert an, für einen, der in dem Bereich noch nichts gemacht hat.
    Wobei kann ich mit FFT auch eine ganz bestimmte Frequenz auslesen? Oder wie läuft das dann ab?
    Weil mir reicht auch, wenn ich z.B. die Werte auslese, die zur 70Hz Frequenz gehören.
    Und dann davon halt den prozentwert Berechnen, wie du es beschrieben hast.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „pc-freack“ ()

    Naja. Du hast ja immer eine bestimmte Anzahl von Frequenzbändern wobei bei der Anzahl der Frequenzbänder n(x) = 2^x gelten muss --> ...512, 1024, 2048,....
    Je mehr Bänder du hast, umso genauer kannst du den Anteil einer bestimmten Frequenz errechnen. Aber bedenke, dass dadurch bei(bin mir nicht sicher aber denke ich damit richtig liege) der Berechnung auch wesentlich mehr Daten und auch Zeit benötigt wird. Wenn du also eine Live-Visualisierung haben möchtest, wird es schwierig dies mit sehr vielen Frequenzbändern schön hinzubekommen. Ich würde es mal mit 512 oder 1024 versuchen.
    Außerdem ist das was ich oben beschrieben habe überhaupt nicht kompliziert. Das ist doch das simpelste was du machen kannst. Für die Berechnung der FFT würde ich mir einen fertigen Code suchen(NAudio müsste auch schon einen haben, da dies dann doch wirklich etwas komplizierter wird).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Gut, dann weiß ich schonmal, das ich es mit den Frequenzbändern nicht übertreiben sollte.

    Für mich ist das schon etwas komplizierter.
    Vorallem weil ich schon daran scheitere, das ich aus der WaveIn Klasse keinen WaveStream raus bekomme,
    aber das wird schon noch :D
    Das sollte schon hinhauen. Aber was für Maße hat deine LED-Matrix überhaupt? Wenn sie z.B. eine Breite von 32, 16, oder 64,... hat wäre es perfekt, da du dann einfach das doppelte an Frequenzbändern verwenden kannst(die Hälfte der Frequenzbänder kannste für die Darstellung wegschmeißen). Das heißt wenn du eine Breite von 32 LEDs hast, nimmst du 64 Frequenzbänder und kannst die ersten 32 einfach darstellen. Dann musste nicht viel herumrechnen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    pc-freack schrieb:

    ich habe einen Raspberry Pi, der ein RGB LED-Band ansteuern soll.


    Es geht nicht um eine LED-Matrix, sondern einfach nur um so ein LED-Band, das z.B. nach der Musik die Farbe wechseln soll.
    Deshalb möchte ich mit meiner Software einige Frequenzen auslesen und dann auswerten.
    Dann die passenden Informationen an der Raspberry per TCP senden, worauf auch ein TCP-Server läuft und dieser führt dann mit diesen Informationen die Befehle aus, womit sich dann die Farbe dem entsprechend ändert. Und das dann auch verschieden schnell etc.
    Wobei die schwierigkeit für mich ist nur das Auslesen der Frequenzen und dessen auswertung.
    Mal eine andere Frage: Wieso wertest du dann nicht an Hand des Peaks aus? Das wäre sehr einfach und hat nur einen Wert bzw. so viele Werte wie es Channels gibt. Nimm einfach eine Zeitspanne. z.B. 2000 Samples und stelle den höchsten Wert dar bzw. dessen die Farbe der LEDs.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.