ASIOドライバでサウンドを再生する (NAudioを利用)

NAudioを利用して、ASIOドライバでサウンドを再生する手順を紹介します。

事前準備

NAudioをインストールします。
NuGetパッケージマネージャーで以下のコマンドまたは、GUIのパッケージマネージャーでNAudioをインストールします。

Install-Package NAudio -Version 2.0.1

または

Install-Package NAudio

  • NuGetパッケージマネージャーコンソールでのインストール手順の詳細はこちらの記事を参照してください。
  • GUIのNuGetパッケージマネージャーでのインストール手順の詳細はこちらの記事を参照してください。


正常にインストールできると、ソリューションエクスプローラーのプロジェクトの子ノードの[依存関係]ノードの[パッケージ]の子項目にNAudioの項目が追加されます。
ASIOドライバでサウンドを再生する (NAudioを利用):画像1

プログラム例

UI

下図のフォームを作成します。Button, ComboBox, TrackBar, OpeFileDialog のコントロールを配置します。

ASIOドライバでサウンドを再生する (NAudioを利用):画像2

コード

下記のコードを記述します。

using NAudio.Wave;

namespace AsioPlaySound
{
  public partial class FormMain : Form
  {
    AsioOut asioOut;
    AudioFileReader afr;

    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string[] DriverList = AsioOut.GetDriverNames();
      foreach (string s in DriverList)
      {
        comboBox1.Items.Add(s);
      }
    }

    private void button2_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == DialogResult.OK)
      {
        asioOut = new AsioOut(comboBox1.SelectedItem.ToString());
        afr = new AudioFileReader(openFileDialog1.FileName);
        afr.Volume = (float)(trackBar1.Value / 100f);
        asioOut.Init(afr);
        asioOut.Play();

      }
    }

    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
      afr.Volume = (float)(trackBar1.Value / 100f);
    }
  }
}

解説

ASIOドライバーの一覧を取得しコンボボックスに表示します。
ASIOドライバーはAsioOut.GetDriverNames()メソッドで取得できます。

    private void button1_Click(object sender, EventArgs e)
    {
      string[] DriverList = AsioOut.GetDriverNames();
      foreach (string s in DriverList)
      {
        comboBox1.Items.Add(s);
      }
    }


ファイルを開くダイアログを表示し再生するサウンドファイルを選択します。
ファイルを選択した場合にifブロック内を実行します。

    private void button2_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == DialogResult.OK)
      {
        /* 中略 */
      }
    }


AsioOutオブジェクトを作成します。コンストラクタの第一引数に再生するASIOドライバー名を与えます。

  asioOut = new AsioOut(comboBox1.SelectedItem.ToString());


AudioFileReaderオブジェクトを作成します。コンストラクタの第一引数に再生するサウンドファイル名を与えます。

  afr = new AudioFileReader(openFileDialog1.FileName);

ボリュームを設定します。AsioOutではボリュームは設定できない(Volumeプロパティはあるが利用は非推奨)ため、入力ソースのサウンドファイル側のボリュームプロパティを設定します。 Volumeプロパティは0から1.0の範囲で指定するため、Maxプロパティを100にしたトラックバーコントロールでは、100で割った値をVolumeプロパティに設定します。

  afr.Volume = (float)(trackBar1.Value / 100f);

AsioOutオブジェクトのInitプロパティを呼び出します。引数には再生するAudioFileReaderオブジェクトを与えます。

  asioOut.Init(afr);

AsioOutオブジェクトのPlayメソッドを呼び出し、再生を開始します。

  asioOut.Play();

注意
ASIOで出力する場合は、Windowsのミキサーを経由しないため、ボリューム100%の大音量で再生され、Windowsのボリュームコントロールは効きません。 テスト段階でもボリュームの実装をお勧めします。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
ASIOドライバでサウンドを再生する (NAudioを利用):画像3

[Button1]をクリックします。
ASIOドライバでサウンドを再生する (NAudioを利用):画像4

Button1クリック後にコンボボックスを開くと、インストールされているASIOドライバーの一覧が表示されます。再生するASIOドライバーをクリックして選択します。
ASIOドライバでサウンドを再生する (NAudioを利用):画像5

ASIOドライバーが選択できました。[button2]をクリックします。
ASIOドライバでサウンドを再生する (NAudioを利用):画像6

button2をクリックするとファイルを開くダイアログが表示されます。再生するサウンドファイルを選択します。
ASIOドライバでサウンドを再生する (NAudioを利用):画像7

ファイルが開かれ、サウンドが再生されます。トラックバーのつまみをドラッグしてボリュームを調整できます。
ASIOドライバでサウンドを再生する (NAudioを利用):画像8

ASIOドライバーを利用してサウンドファイルを再生できました。

補足1
サウンド再生中でもメインスレッドはブロックされません。ウィンドウはフリーズしません。
補足2
Waveファイル以外のサウンドファイルも再生できます。Flac, Mp3のサウンドも再生できます。
AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2022-02-06
Copyright © 1995–2025 iPentec all rights reserverd.