NAudioなら貧弱な私でも「ママ～ッ!!」が鳴らせる。

この記事は[リンク情報システム](https://www.lis.co.jp/)の2018年アドベントカレンダーのリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちら](https://www.facebook.com/lis.co.jp/)から)

3日目らしいです。頑張ります。

#はじめに
今回はNAudioというライブラリを触ってみようと思います。
今までプログラムを用いて音声ファイルや音声処理を行ったことがないため、経験談として残しておこうと思います。

#NAudioとは
NAudioとはCodePlex で開発されている .NET 向けの音声操作ライブラリです。
音声ファイルの再生や録音等が結構簡単にできるみたいです。それをこれから試してみます。

##対応フォーマット
* WAV
* MP3 (ACMまたはDMO codec)
* AIFF
* ADPCM
* Speex (NSpeex codec)
* SF2 (SoundFont)
* インストールされている任意のACM codec


##導入方法
1. 以下よりソースコードをダウンロードし、解凍する。(デスクトップにポコッと置いた。)
   https://github.com/naudio/NAudio
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/317702/fcdd9e70-2d55-415a-480a-a983de47a48b.png)


2. Visual Studioにてプロジェクトを作成する。

3. [表示]メニューよりその他のウィンドウ＞パッケージマネージャーコンソールを開く。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/317702/4f1dec1c-166f-6678-4e61-87e2b6295c6b.png)

4. パッケージマネージャーコンソールにて「Install-Package NAudio」と入力し、実行する。
![キャプチャ３.PNG](https://qiita-image-store.s3.amazonaws.com/0/317702/20a16d72-81b5-ac1b-5411-d8ff35cc43c4.png)

これでプロジェクトにNAudioを導入することができました。
あら、簡単じゃない。

#早速いろいろ試す。

コードの頭のほうに` using NAudio.Wave;` と入れておきます。
これによってWaveファイルの操作が可能になります。

##再生する。
1.以下のようなフォームを作成する。
![フォーム.PNG](https://qiita-image-store.s3.amazonaws.com/0/317702/763320aa-11e1-69c5-a77f-fdb3d131ede9.png)

2.以下のようなコードを書く。

~~~ C# 
WaveOut waveOut = new WaveOut();
private void button1_Click(object sender, EventArgs e)
{
    if (waveOut.PlaybackState != PlaybackState.Playing)
    {
        //音声ファイルの読み込み
        AudioFileReader reader = new AudioFileReader("Bohemian Rhapsody.wav");
        waveOut.Init(reader);

        //音声ファイルの再生
        waveOut.Play();
        this.button1.Text = "STOP";
    }
    else
    {
        //音声ファイルの停止
        waveOut.Stop();
        this.button1.Text = "PLAY";
    }
}
~~~

3.ビルドして音声ファイルを実行ファイルのおいてあるフォルダにIN
4.そして実行

あ～、再生されました。
我々は素晴らしきロックオペラを聴けるであろう。

##録音する。(失敗)
1. 以下のようなフォームを作成する。
2. 
![フォーム2.PNG](https://qiita-image-store.s3.amazonaws.com/0/317702/4f0dff4b-bf2a-c25b-0659-6fe11ed89c13.png)

2.以下のようなコードを書く。

~~~ C#:RECボタン側
bool Recording = false;
private WaveIn sourceStream = null; // 録音なのでWaveInを使用
private DirectSoundOut waveOut = null;

private void button1_Click(object sender, EventArgs e)
{
    if (!Recording)
    {
        sourceStream = new WaveIn()
        {
            // デフォルトデバイスを選択
            DeviceNumber = 0,
            //Waveのフォーマット(サンプルレート等)を指定
            WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(0).Channels) 
        };
        //指定したバッファにwaveデータを入力するやつ(WaveInProvider)に変換
        WaveInProvider waveIn = new WaveInProvider(sourceStream);

        //(たぶん)リアルタイムで入力音源を直で出力へ送る。
        waveOut = new DirectSoundOut();
        waveOut.Init(waveIn);

        //録音の開始
        sourceStream.StartRecording();
        waveOut.Play();

        Recording = true;

        this.button1.Text = "STOP";
    }
    else
    {
        sourceStream.StopRecording();
        waveOut.Stop();
        this.button1.Text = "REC";
        Recording = false;
    }
}
~~~
---
~~~ C#:PLAYボタン側
WaveOut play = new WaveOut();
private void button2_Click(object sender, EventArgs e)
{
    if ((play.PlaybackState != PlaybackState.Playing) && (sourceStream != null))
    {
        //音声ファイルの読み込み
        play.Init(new WaveInProvider(sourceStream));

        //音声ファイルの再生
        play.Play();
        this.button2.Text = "STOP";
    }
    else
    {
        //音声ファイルの停止
        play.Stop();
        this.button2.Text = "PLAY";
    }
}
~~~

3.実行

**音が出ない。録音されているのかもわからず。**
いろいろ試してみたものの、いまいちうまく動作せず…
個人的に生音の録音こそやりたかったことなので、残念な結果となった。

#使ってみた感想
~~**短い時間じゃどうにもならなかった。**~~
音を鳴らすのは結構簡単にできたので5～10分くらいで貧弱プレーヤーが作れます。
調べてみたらフーリエ変換等使って音声波形を表示する音源プレイヤーを作成している方がいたので、なるほどこんなものも作れるのかという感じ。
今度挑戦してみようかと思います。