見出し画像

UnityでASIO出力する(マルチチャンネルオーディオ出力する)

 Unityでマルチチャンネルオーディオ出力しようとしたとき,WindowsPCで認識できるオーディオデバイスでしか再生できません.また,マルチチャンネルでなくてもオーディオレイテンシを減らしたい人がいるかもしれません.そんなときASIOが便利です.今回は,UnityとWindowsPCでASIOを使って再生する方法を説明します.

ASIOとは

ASIOは、ドイツのスタインバーグによりオーディオを入出力するためのアプリケーション用APIとして提供された規格であり、販売されている高級オーディオカードの多くがこの規格に準拠し、Windows用およびmacOS用のドライバも存在し、ほぼ業界標準として採用されている。Mac OS XのCore Audioはこれと同等の技術とされる。
 WindowsやMac OS上にもサウンドドライバは存在するが、ASIOはそれよりも低遅延、高同期性、高いスループットを実現している。開発された理由としては従来のオペレーティングシステム (OS) に搭載されているサウンドドライバでは2以上のマルチチャンネル入力が考慮されていなかったためである。ASIOではマシンの処理速度が許す限りはあらゆるチャンネル数、標本化周波数、量子化ビット数のデータを扱うことができる。
Wikipedia「ASIO」

ASIOを通す方法

自分が調べた中でUnityからASIOを通す方法は2つあります.
1.Wwiseを使う
2.ツール(Low-latency Multichannel Audio)を買う

 Wwiseとは,ゲーム用のサウンドエンジンなのだが本格的に複雑なオーディオをUnityに組み込もうというときは作業が楽になります.非商用なら無料だし,複数人でゲーム開発するなら最適なサウンドエンジンだと思います.
しかし,システム自体は複雑でただ単にASIOを通すだけなら学ぶ量が膨大で効率が悪いです.

  Low-latency Multichannel Audioとは,UnityAssetの一つで機能がほぼほぼASIOを通すってだけのAssetです.このAssetは約30ドルなので買うのを躊躇していたのですがWwiseのチュートリアルをやっているうちに買った方が早いし楽であることに気が付き今回はこっちを購入,採用しました.

実験

 今回は,公式動画をもとに特定環境でどのように動作したか記載します.

システム


ハードウェア
PC → Yamaha Steinberg UR44 → Speaker


ソフトウェア
●Windows10Pro
●Unity(2019.4.17)
Yamaha Steinberg USB Driver(2.0.4)
●Low-latency Multichannel Audio for Unity(1.4.0)

ソースコード

A,S,D,Fを押すとそれぞれのチャンネルから音が鳴るよう組みました.

void Update()
   {
       if (Input.GetKeyDown(KeyCode.A))
       {
           AudioManager.Asio.Play(
               1,
               new uint[] { 0 },
               0.5f);

           Debug.Log("a");
       }
       if (Input.GetKeyDown(KeyCode.S))
       {
           AudioManager.Asio.Play(
               2,
               new uint[] { 1 },
               0.5f);
           Debug.Log("s");
       }
       if(Input.GetKeyDown(KeyCode.D))
       {
           AudioManager.Asio.Play(
           3,
           new uint[] { 2 },
           0.5f);
           Debug.Log("d");

       }
       if(Input.GetKeyDown(KeyCode.F))
       {
           AudioManager.Asio.Play(
               4,
               new uint[] { 3 },
               0.5f);
           Debug.Log("f");
       }

結果

 以下にuintの中の数字ごとにどこから出力されたか記述します.
1 →Main Output L , Line Output 1
2 →Main Output R , Line Output 2
3 →Line Output 3
4 →Line Output 4

注意

 公式の動画では,チャンネルを指定するときのuintは書かなくても動く感じで動画を出していたのですが僕の環境だと動きませんでした.まあ,にわかプログラミング技術なのでなにかミスってるかもしれないので僕のせいだとは思いますがとにかくこのソースで動きます.

今後

 実際にはUR824で使うのでUR824でどのように動いたか今後加筆修正します.

この記事が気に入ったらサポートをしてみませんか?