Madwin74

12band EQ with display & controls

May 17th, 2023
1,347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.79 KB | Source Code | 0 0
  1. /***********************************************************
  2.  ***********************************************************
  3.  **                                                       **
  4.  **   Codesnippets written by Madwin for MMP 2023         **
  5.  **                                                       **
  6.  **   Not to be used freely. the code still has errors    **
  7.  **   It's intended to be used as starting point.         **
  8.  **   Code has not been checked and might still need      **
  9.  **   (a lot of) work.                                    **
  10.  **                                                       **
  11.  **   ℗ & © MadMedia Productions 2023                     **
  12.  **                                                       **
  13.  ***********************************************************
  14.  ***********************************************************
  15.  **                                                       **
  16.  **   -- Disclaimer: --                                   **
  17.  **                                                       **
  18.  **   If code is used in private projects and/or for      **
  19.  **   study purposes please mention resource. Any other   **
  20.  **   use -whether commercial or non-commercial- is not   **
  21.  **   condoned by the author and violates his intent.     **
  22.  **                                                       **
  23.  **   [email protected]                             **
  24.  **                                                       **
  25.  ***********************************************************
  26.  ***********************************************************/
  27.  
  28.  
  29.  
  30. using System;
  31. using System.Collections.Generic;
  32. using System.Drawing;
  33. using System.Windows.Forms;
  34. using CSCore;
  35. using CSCore.CoreAudioAPI;
  36. using CSCore.SoundOut;
  37. using CSCore.Streams.Effects;
  38.  
  39. public class Equalizer
  40. {
  41.     private const int BandCount = 12;
  42.     private readonly ISoundOut _soundOut;
  43.     private readonly IWaveSource _source;
  44.     private readonly EqualizerEffect _equalizerEffect;
  45.  
  46.     public Equalizer(string audioFilePath)
  47.     {
  48.         _source = CodecFactory.Instance.GetCodec(audioFilePath)
  49.             .ToSampleSource()
  50.             .ToMono()
  51.             .ToWaveSource();
  52.        
  53.         _equalizerEffect = new EqualizerEffect(_source, BandCount);
  54.        
  55.         _soundOut = new WasapiOut();
  56.         _soundOut.Initialize(_equalizerEffect);
  57.     }
  58.  
  59.     public void Play()
  60.     {
  61.         _soundOut.Play();
  62.     }
  63.  
  64.     public void Stop()
  65.     {
  66.         _soundOut.Stop();
  67.     }
  68.  
  69.     public Panel CreateEqualizerPanel()
  70.     {
  71.         var equalizerPanel = new Panel();
  72.         equalizerPanel.BackColor = Color.Black;
  73.         equalizerPanel.Dock = DockStyle.Fill;
  74.  
  75.         var levelMeterPanel = new Panel();
  76.         levelMeterPanel.Dock = DockStyle.Left;
  77.         levelMeterPanel.Width = 100;
  78.  
  79.         var slidersPanel = new Panel();
  80.         slidersPanel.Dock = DockStyle.Fill;
  81.         slidersPanel.Padding = new Padding(10);
  82.  
  83.         equalizerPanel.Controls.Add(levelMeterPanel);
  84.         equalizerPanel.Controls.Add(slidersPanel);
  85.  
  86.         var levelMeters = new List<ProgressBar>();
  87.  
  88.         for (int i = 0; i < BandCount; i++)
  89.         {
  90.             var levelMeter = new ProgressBar();
  91.             levelMeter.Orientation = Orientation.Vertical;
  92.             levelMeter.Dock = DockStyle.Top;
  93.             levelMeter.Height = 100;
  94.             levelMeter.Width = 20;
  95.             levelMeter.Style = ProgressBarStyle.Continuous;
  96.             levelMeter.ForeColor = Color.LimeGreen;
  97.             levelMeter.BackColor = Color.Black;
  98.             levelMeter.Maximum = 100;
  99.             levelMeter.Minimum = 0;
  100.             levelMeter.Value = 0;
  101.  
  102.             levelMeterPanel.Controls.Add(levelMeter);
  103.             levelMeters.Add(levelMeter);
  104.  
  105.             var slider = new TrackBar();
  106.             slider.Orientation = Orientation.Vertical;
  107.             slider.Dock = DockStyle.Left;
  108.             slider.Width = 20;
  109.             slider.Minimum = -20;
  110.             slider.Maximum = 20;
  111.             slider.Value = 0;
  112.  
  113.             slider.Scroll += (sender, e) =>
  114.             {
  115.                 _equalizerEffect.SampleFilters[i].AverageGainDB = slider.Value;
  116.             };
  117.  
  118.             slidersPanel.Controls.Add(slider);
  119.         }
  120.  
  121.         _equalizerEffect.PropertyChanged += (sender, e) =>
  122.         {
  123.             if (e.PropertyName == nameof(EqualizerEffect.SampleFilters))
  124.             {
  125.                 for (int i = 0; i < BandCount; i++)
  126.                 {
  127.                     slidersPanel.Controls[i].Enabled = _equalizerEffect.SampleFilters[i].IsAvailable;
  128.                 }
  129.             }
  130.         };
  131.  
  132.         _equalizerEffect.SampleFilters.PropertyChanged += (sender, e) =>
  133.         {
  134.             if (e.PropertyName == nameof(EqualizerFilter.IsAvailable))
  135.             {
  136.                 for (int i = 0; i < BandCount; i++)
  137.                 {
  138.                     slidersPanel.Controls[i].Enabled = _equalizerEffect.SampleFilters[i].IsAvailable;
  139.                 }
  140.             }
  141.         };
  142.  
  143.         var levelMeterUpdateTimer = new Timer();
  144.         levelMeterUpdateTimer.Interval = 100;
  145.         levelMeterUpdateTimer.Tick += (sender, e) =>
  146.         {
  147.             for (int i = 0; i < BandCount; i++)
  148.             {
  149.                 var level = _equalizerEffect.SampleFilters[i].AverageGainDB;
  150.                 levelMeters[i].Value = (int)Math.Max(0, Math.Min(level, 100));
  151.             }
  152.         };
  153.         levelMeterUpdateTimer.Start();
  154.  
  155.         return equalizerPanel;
  156.     }
  157. }
  158.  
  159. /*
  160. To use this class, you can create an instance of the Equalizer class with the path to your audio file,
  161. call the Play method to start playback, and retrieve the Panel using the CreateEqualizerPanel method to
  162. display the equalizer UI in your application's form. Don't forget to reference CSCore in your project.
  163. */
Advertisement
Add Comment
Please, Sign In to add comment