NAudioをUnity上で動かすための最低限のコード。

なんでこんなの書いたん

  • UnityでDAWっぽい事するには標準の機能じゃ辛い
  • シンセサイザーを作るために波形更新しようとしたら回りくどい処理をしなければならず、パートが多くなると予想より大きめの負荷になったため、別の方法を検討する
  • ASIOとかWASAPI(排他モード)使いたい

準備方法

  • Nugetサイトにアクセスする
    NuGet Gallery | NAudio 2.1.0
  • DownloadPackageでnupkgファイルをダウンロードする
  • ダウンロードしたファイルの拡張子を「zip」に変更する
  • zipファイルを解凍する
  • 解凍した中のlibファイルの中身「dll」ファイルをUnityのプロジェクトにドラッグ&ドロップする
  • 「NAudio.Core」「NAudio.Wasapi」「NAudio.WinMM」についても同様の処理を行う。
    (ちなみに格納フォルダについては、NAudioについては「net472」、それ以外は「netstandard2.0」の中身をつかうのがよさそう)
  • 下記記載の「コード」に記載のソースコードを適当なGameObjectにアタッチする。(AudioListenerなしに再生できる)
  • “SampleWAV.wav”って名前のファイルをAssets/StreamingAssetsフォルダ内に置いて
  • 実行する

コード

using UnityEngine;
using System.IO;//Path.~
using System;//InvalidOperationException
using NAudio.Wave;//WaveOutEvent

public class NAAudioPlayer : MonoBehaviour {
//ループの外で初期定義する
WaveOutEvent outputDevice;
private void Start()
{
//初期化。
// StreamingAssets内にあるWAVファイルへのパス
var wavFilePath = Path.Combine(Application.streamingAssetsPath, "SampleWAV.wav");

//WaveOutだと動かないのでWaveOutEventで動かす。
outputDevice = new WaveOutEvent();

//ストリームで読み込むためのデータを登録する
AudioFileReader afr = new AudioFileReader(wavFilePath);

//デバイス初期化
outputDevice.Init(afr);

//再生
outputDevice.Play();
}

// Update is called once per frame
void Update(){
//何もしない
}

//アプリケーション終了時に全部閉じてリソースも開放する。

void OnApplicationQuit(){
//停止
outputDevice.Stop();

//リソースを開放する
outputDevice.Dispose();
}
}

注意書き

  • 色々なサイトでNAudioの1.8しかUnityに対応してない旨が記載されているが、これはライブラリ内部で破壊的な変更が発生しているのとマニュアルの記載がろくに存在してないせいで詳細がわからないせいだと考えられる。(過去の資料で一番マシなのが1.8という)
  • 理由は不明だが、NAudioの関数「WaveOut」が利用できない。(Unity上では呼び出すことができない)
    このため、WaveOutEventという別関数で対応している。
  • デバイスを直で呼び出しているためAudioListenerを利用していない。このためサウンド周りはOFFにしておくのがいい。
    ProjectSetting→Audio→DisableUnityAudioにチェックを入れるとUnityのサウンド機能がOFFになる。

参考資料