Equalizer mit CSCore

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von sothere.

    Equalizer mit CSCore

    Hi
    Ich bin gerade ja am testen der CSCore Libary von @thefiloe .
    Sounds kann ich abspielen und Visualisieren, aber was ich noch nicht hin bekomme ist der Equalizer.
    Ich habe mir den C# Code aus dem Demo-Projekt angeschaut, und war da schon verwundert, wieso er so klein ist, obwohl ja 10 Trackbar´s verbaut sind:
    Spoiler anzeigen

    Quellcode

    1. using CSCore;
    2. using CSCore.Codecs;
    3. using CSCore.SoundOut;
    4. using CSCore.Streams;
    5. using System;
    6. using System.ComponentModel;
    7. using System.Windows.Forms;
    8. namespace EqualizerTest
    9. {
    10. public partial class MainWindow : Form
    11. {
    12. public MainWindow()
    13. {
    14. InitializeComponent();
    15. }
    16. private ISoundOut _soundOut;
    17. private Equalizer _eq;
    18. private void trackBar1_ValueChanged(object sender, EventArgs e)
    19. {
    20. if (_eq != null)
    21. {
    22. var trackbar = sender as TrackBar;
    23. float value = (float)(((double)trackbar.Value / (double)trackbar.Maximum) * 15);
    24. _eq.SampleFilters[Int32.Parse((string)trackbar.Tag)].SetGain(value);
    25. }
    26. }
    27. private void button1_Click(object sender, EventArgs e)
    28. {
    29. var ofn = new OpenFileDialog();
    30. ofn.Filter = CodecFactory.SupportedFilesFilterEN;
    31. if (ofn.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    32. {
    33. Stop();
    34. if (WasapiOut.IsSupportedOnCurrentPlatform)
    35. {
    36. _soundOut = new WasapiOut();
    37. }
    38. else
    39. {
    40. _soundOut = new DirectSoundOut();
    41. }
    42. var source = CodecFactory.Instance.GetCodec(ofn.FileName);
    43. source = new LoopStream(source) { EnableLoop = false };
    44. (source as LoopStream).StreamFinished += (s, args) => Stop();
    45. _eq = Equalizer.Create10BandEqualizer(source);
    46. _soundOut.Initialize(_eq.ToWaveSource(16));
    47. _soundOut.Play();
    48. }
    49. }
    50. protected override void OnClosing(CancelEventArgs e)
    51. {
    52. Stop();
    53. base.OnClosing(e);
    54. }
    55. private void Stop()
    56. {
    57. if (_soundOut != null)
    58. {
    59. _soundOut.Stop();
    60. _soundOut.Dispose();
    61. _eq.Dispose();
    62. _soundOut = null;
    63. }
    64. }
    65. }
    66. }



    Hab mir erstmal nichts dabei gedacht und versucht das zu übersetzten. Ton kann ich abspielen, aber modifizieren funktioniert nicht.
    Die Online-Konverter haben auch nichts hin bekommen, also kommt hier meine Frage:
    Wie kriege ich es hin, das der Equalizer in VB.net läuft?

    Edit: Was bedeuten eigentlich die 10 Trackbar´s (welche Frequenz verändern die?)
    Liebe Grüße
    sothere
    Der Equalizer funktioniert schon. Jedoch musst vll. etwas aggressivere Werte verwenden, damit man es auch wirklich sehr stark hört (sollte ja eigentlich nicht so sein).
    Ändere mal die 15 in 20. Das heißt, dass es dann von -20 bis +20 dB geht. Sprich stärkere Einstellungen möglich sind.
    Was den "kleinen" Code angeht: Ich verwende EINEN Eventhandler für 10 TrackBars. Der Grund dafür ist, dass alle Trackbars nahezu das gleiche tun (nur einen anderen Filter bearbeiten). Deshalb gebe ich jeder Trackbar (ja ich weiß, würde schöner gehen) im Tag eine Zahl. Und diese Zahl ist der Index des Filters.
    Alles in allem funktioniert der Equalizer. Habe ihn gerade getestet. Dieser Code ist vll. etwas leichter verständlich:

    Quellcode

    1. private void trackBar_ValueChanged(object sender, EventArgs e)
    2. {
    3. if (_eq != null)
    4. {
    5. const double MaxDB = 20;
    6. var trackbar = sender as TrackBar; //Trackbar welche das Event ausgelöst hat.
    7. double perc = ((double)trackbar.Value / (double)trackbar.Maximum); //Prozent der Trackbar
    8. float value = (float)(perc * MaxDB); //Prozent der Trackbar mit der maximalen Verstärkung multipliziert
    9. int filterIndex = Int32.Parse((string)trackbar.Tag); //Index des Filters. Index wurde im Designer bei der Tag Eigenschaft festgelegt.
    10. EqFilterEntry filter = _eq.SampleFilters[filterIndex];
    11. filter.SetGain(value); //neuen dB-Wert setzen
    12. }
    13. }


    Musste halt konvertieren falls du kein C# verstehst.

    Nochmal was den EQ angeht. Ich weiß nicht was du hörst. Und wenn etwas nur Geschrei ist, dann hört man schlecht nen Unterschied. Wenn du jedoch z.B. im anderen Extrem klassische Musik hörst, dann hörst du schon bei geringen Änderungen Unterschiede. Es kommt also drauf an was du hörst, wie aggressiv du etwas Einstellen musst. Probiere also einfach mit den Trackbars etwas rum. z.B. hörst du garantiert einen sehr starken Unterschied wenn du sowas machst:

    s1.directupload.net/images/140216/ebqnjb6x.png


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ja, in C# funktioniert sie einwandfrei, das hab ich ja schon getestet :)
    Mein Fehler war folgender: Ich hatte vergessen, dem Sub die handles Objekte zu übergeben. Danke dir vielmals.
    Für alle, die sich fragen, wie das nun aussehen muss:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports CSCore
    2. Imports CSCore.Codecs
    3. Imports CSCore.SoundOut
    4. Imports CSCore.Streams
    5. Imports System.ComponentModel
    6. Public Class Form1
    7. Private _soundOut As ISoundOut
    8. Private _eq As Equalizer
    9. Private Sub trackBar_ValueChanged(sender As Object, e As EventArgs) Handles trackBar1.Scroll, trackBar2.Scroll, trackBar3.Scroll, trackBar4.Scroll, trackBar5.Scroll, _
    10. trackBar6.Scroll, trackBar7.Scroll, trackBar8.Scroll, trackBar9.Scroll, trackBar10.Scroll
    11. If _eq IsNot Nothing Then
    12. Const MaxDB As Double = 20
    13. Dim trackbar = TryCast(sender, TrackBar)
    14. 'Trackbar welche das Event ausgelöst hat.
    15. Dim perc As Double = (CDbl(trackbar.Value) / CDbl(trackbar.Maximum))
    16. 'Prozent der Trackbar
    17. Dim value As Single = CSng(perc * MaxDB)
    18. 'Prozent der Trackbar mit der maximalen Verstärkung multipliziert
    19. Dim filterIndex As Integer = Int32.Parse(DirectCast(trackbar.Tag, String))
    20. 'Index des Filters. Index wurde im Designer bei der Tag Eigenschaft festgelegt.
    21. Dim filter As EqFilterEntry = _eq.SampleFilters(filterIndex)
    22. 'neuen dB-Wert setzen
    23. filter.SetGain(value)
    24. End If
    25. End Sub
    26. Private Sub button1_Click(sender As Object, e As EventArgs) Handles button1.Click
    27. Dim ofn = New OpenFileDialog()
    28. ofn.Filter = CodecFactory.SupportedFilesFilterEN
    29. If ofn.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
    30. [Stop]()
    31. If WasapiOut.IsSupportedOnCurrentPlatform Then
    32. _soundOut = New WasapiOut()
    33. Else
    34. _soundOut = New DirectSoundOut()
    35. End If
    36. Dim source = CodecFactory.Instance.GetCodec(ofn.FileName)
    37. source = New LoopStream(source)
    38. _eq = Equalizer.Create10BandEqualizer(source)
    39. _soundOut.Initialize(_eq.ToWaveSource(16))
    40. _soundOut.Play()
    41. End If
    42. End Sub
    43. Protected Overrides Sub OnClosing(e As CancelEventArgs)
    44. [Stop]()
    45. MyBase.OnClosing(e)
    46. End Sub
    47. Private Sub [Stop]()
    48. If _soundOut IsNot Nothing Then
    49. _soundOut.[Stop]()
    50. _soundOut.Dispose()
    51. _eq.Dispose()
    52. _soundOut = Nothing
    53. End If
    54. End Sub
    55. End Class



    Mal noch eine andere Frage: Was ändern die einzelnen Trackbars? Also vom Audio her? In deinem Video hast du ja unter die Trackbars 31,62,125,250,500,1k .... geschrieben. Was bedeutet das? Und danke nochmal für deine Hilfe!
    Liebe Grüße
    sothere

    sothere schrieb:

    In deinem Video hast du ja unter die Trackbars 31,62,125,250,500,1k .... geschrieben. Was bedeutet das?
    Das sind die Frequenzen des Equalizers. Der Equalizer selbst verstärkt bestimmte Frequenzbereiche. Die Frequenzbereiche sind bei meinem Equalizer komplett variabel (du kannst so viele Bänder nehmen wie du willst und die Frequenzen selbst wählen). Ich habe jedoch einen häufig benutzten 10-Band EQ vorkonfiguriert. Wenn du z.B. die Trackbar bei 1kHz nach unten ziehst, so werden die Spuren die eine Frequenz von um die 1kHz haben geschwächt. Du kannst damit z.B. tiefe Töne verstärken und die hohen Töne schwächen (für sowas gibts aber eig. auch Hoch- und Tiefpassfilter. Eine simple Erklärung gibts hier: delamar.de/tutorials/equalizer…ertypen-und-presets-2828/


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    okay, danke dir. Ist eigentlich mehr, als ich wissen wollte :D
    Mal eine ganz andere Frage: Kann ich das Signal noch vorverstärken ? Und vorallem: Kann ich den Peak einer Source bzw. SoundOut auslesen? Mithilfe des Audio-Meters kann ich zwar von den einzelnen Soundkarten das Lautstärken-Signal auslesen, aber eben nicht von einer einzelnen Source bzw. SoundOut.
    Liebe Grüße
    sothere