Windows、Unity(Low-latency Multichannel Audio for Unity)、Yamaha Steingberg UR44(ASIO) を利用して、
4チャンネル別々の音源を再生するコンテンツ開発を行いました。
ASIOを利用することができる Asset がおそらくこの一択のため、記事にしてみました。
ASIO とは
オーディオデバイスのドライバの一つです。
Windows環境のデフォルトでは、低遅延、高スループットを可能とする2チャンネル以上のサウンドドライバが存在していないので、ASIOを使用するのがデファクトスタンダードになっているとのことらしい。
使用するために専用の機器(ハードウェア)とASIOを操作することができるソフトウェアが必要になります。
おそらく標準的なDAWソフトウェアであれば、ASIOを利用したマルチチャンネル再生は可能ですが、
Unityの場合デフォルトで操作することができず、Asset を利用して再生することになりました。
ASIO - Wikipedia
ASIOは、ドイツのスタインバーグによりオーディオを入出力するためのアプリケーション用APIとして提供された規格であり、
販売されている高級オーディオカードの多くがこの規格に準拠し、Windows用およびmacOS用のドライバも存在し、
ほぼ業界標準として採用されている。Mac OS XのCore Audioはこれと同等の技術とされる[1]。
WindowsやMac OS上にもサウンドドライバは存在するが、ASIOはそれよりも低遅延、高同期性、高いスループットを実現している。
開発された理由としては従来のオペレーティングシステム (OS) に搭載されているサウンドドライバでは
2以上のマルチチャンネル入力が考慮されていなかったためである。ASIOではマシンの処理速度が許す限りはあらゆるチャンネル数、
標本化周波数、量子化ビット数のデータを扱うことができる。
構成
Hardware
PC(Windows) -> Yamaha Steinberg UR44 -> Speaker 4 channel
Software
Name | Version |
---|---|
Windows | 10 Pro |
Unity | 2019.2.15f1 |
Yamaha Steinberg USB Driver | 2.0.4 |
Low-latency Multichannel Audio for Unity | 1.4 |
Low-latency Multichannel Audio for Unity の注意点
バージョン1.4の時点で、以下の制限があるようでした。
- チャンネル毎の同期をとる機能が存在していません。そのためある程度(20-100ms)のずれが生じることがありました。自分の場合は、4チャンネルのそれぞれに、異なる背景音を流していることから大きな問題にならず、そのまま使うことにしました。
- 1つの音源ファイルの各トラックを別々のチャンネルに流すような分割することができませんでした。自分の場合は、4つの音源にあらかじめ分割しておいて、それぞれのチャンネルでそれぞれの音源を流す形をとりました。
- フェードインはあるのですが、フェードアウトがありません。自分の場合は、オレオレで作りました。
- 大きい音楽データの場合、Play の際に時間がかかります。ただ下のサンプル用に非同期(並列処理)にして実行することであるていど緩和できます。
for (var i = 0; i < 4; i++)
{
var channel = (uint) i;
UniTask.Run(() =>
{
var stream = AudioManager.Asio.Play(audioIds[i], new[] {channel}, volume);
streams.Add(stream);
});
}
その他
- REAPER : Windows からそもそも ASIO が正常に動作して、マルチチャンネルで再生できるのかわからなかったときに使用したDAWです。無料でかつシンプルな構成となっているので、確認しやすく使いやすかった。
- Audacity : 音楽ファイルの内部構成などを確認するために使用しました。無料にもかかわらず、分割などもできて非常に便利です。
- AudioStream [PCM audio in Unity] : 更新頻度も高く、フォーラムの対応もよいのでこちらも候補にしたのですが、ASIOには対応してないと回答をもらいました。