Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

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

  3. [表示]メニューよりその他のウィンドウ>パッケージマネージャーコンソールを開く。
    キャプチャ2.PNG

  4. パッケージマネージャーコンソールにて「Install-Package NAudio」と入力し、実行する。
    キャプチャ3.PNG

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

早速いろいろ試す。

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

再生する。

1.以下のようなフォームを作成する。
フォーム.PNG

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

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

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

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;
    }
}

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分くらいで貧弱プレーヤーが作れます。
調べてみたらフーリエ変換等使って音声波形を表示する音源プレイヤーを作成している方がいたので、なるほどこんなものも作れるのかという感じ。
今度挑戦してみようかと思います。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away