.NET オーディオ/MIDIライブラリ「NAudio」 を使って、C#言語でイコライザを作ります。なお、開発環境はVisual Studio 2013 ExpressでWindows 7 Proです。

NAudioライブラリのインストールおよび設定

NAudioライブラリは「naudio/NAudio」から「NAudio-Release.zip」をダウンロードし、解凍したライブラリを、Visual Studio 2013 Expressの「参照の追加」によりプロジェクトに追加します。

イコライザソフトの作成

イコライザソフトは、デモコード「NAudio/NAudioWpfDemo/EqualizationDemo/」を参照して作成します。デモソフトはWPF上で動作し、今回はWindows Formで動作します。

  • 17行目から24行目はイコライザの部分で、それぞれの周波数のゲインを指定します。
  • 32行目で再生したいファイル名「sample.wav」を指定します。再生したいファイル名を「sample.wav」として実行フォルダに設定してください。

Form1.cs


using NAudio.Dsp;
using NAudio.Wave;

public partial class Form1 : Form
{
    private AudioFileReader reader;
    private IWavePlayer player;
    private Equalizer equalizer;
    private string selectedFile;
    private readonly EqualizerBand[] bands;

    public Form1()
    {
        InitializeComponent();
        bands = new EqualizerBand[]
                {
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 100, Gain =17},
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 200, Gain =7},
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 400, Gain =3},
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 800, Gain =4},
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 1200, Gain = -1},
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 2400, Gain = -3},
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 4800, Gain = 7},
                    new EqualizerBand {Bandwidth = 0.8f, Frequency = 9600, Gain = -13},
                };

    }


    private void buttonPlay_Click(object sender, EventArgs e)
    {
        selectedFile = "sample.wav";
        reader = new AudioFileReader(selectedFile);
        equalizer = new Equalizer(reader, bands);
        player = new WaveOutEvent();
        player.Init(equalizer);

        player.Play();


    }
}

デモコードは、48行目に示すコメントのように記述されています。これを、49行目から55行目のように書き換えます。

Equalizer.cs

class Equalizer : ISampleProvider
{
/// <summary>
/// Basic example of a multi-band eq
/// uses the same settings for both channels in stereo audio
/// Call Update after you've updated the bands
/// Potentially to be added to NAudio in a future version
/// </summary>
class Equalizer : ISampleProvider
{
    private readonly ISampleProvider sourceProvider;
    private readonly EqualizerBand[] bands;
    private readonly BiQuadFilter[,] filters;
    private readonly int channels;
    private readonly int bandCount;
    private bool updated;

    public Equalizer(ISampleProvider sourceProvider, EqualizerBand[] bands)
    {
        this.sourceProvider = sourceProvider;
        this.bands = bands;
        channels = sourceProvider.WaveFormat.Channels;
        bandCount = bands.Length;
        filters = new BiQuadFilter[channels, bands.Length];
        CreateFilters();
    }

    private void CreateFilters()
    {
        for (int bandIndex = 0; bandIndex < bandCount; bandIndex++)
        {
            var band = bands[bandIndex];
            for (int i = 0; i < channels; i++)
            {
                if (filters[i, bandIndex] == null)
                    filters[i, bandIndex] = BiQuadFilter.PeakingEQ(sourceProvider.WaveFormat.SampleRate, band.Frequency, band.Bandwidth, band.Gain);
                else
                    filters[i, bandIndex].SetPeakingEq(sourceProvider.WaveFormat.SampleRate, band.Frequency, band.Bandwidth, band.Gain);
            }
        }
    }

    public void Update()
    {
        updated = true;
        CreateFilters();
    }
    //       public WaveFormat WaveFormat => sourceProvider.WaveFormat;
    public WaveFormat WaveFormat
    {
        get
        {
            return sourceProvider.WaveFormat;
        }
    }

    public int Read(float[] buffer, int offset, int count)
    {
        int samplesRead = sourceProvider.Read(buffer, offset, count);

        if (updated)
        {
            CreateFilters();
            updated = false;
        }

        for (int sample = 0; sample <samplesRead; sample++)
        {
            int ch = sample % channels;

            for (int band = 0; band < bandCount; band++)
            {
                buffer[offset + sample] = filters[ch, band].Transform(buffer[offset + sample]);
            }
        }
        return samplesRead;
    }
}

EqualizerBand.cs

class EqualizerBand
{
    public float Frequency { get; set; }
    public float Gain { get; set; }
    public float Bandwidth { get; set; }
}

イコライザソフトの実行

イコライザソフトを実行すると、次の画面が表示されます。

イコライザソフトの実行

「Play」ボタンを押すと、sample.wavファイルが再生されます。イコライザの定義の「new EqualizerBand {Bandwidth = 0.8f, Frequency = 100, Gain =17}」のゲインを上げて再生すると低音が響きます。イコライザの定義「 new EqualizerBand {Bandwidth = 0.8f, Frequency = 9600, Gain = -13}」のゲインを上げて再生すると高音が響きます