はじめに
Rogue Wavesのサウンドデザイナー、マットです。Rogue Wavesはゲームオーディオやポストプロダクション向けを中心に、サウンドエフェクト・ライブラリを手がけています。実は最近手を広げ、UnityとWwiseを使ったStep Sixteenというステップシーケンサーアプリケーションをリリースしました。
私は長年に渡り、多くのステップシーケンサーのプロトタイプをつくってきました。Arduinoを使ったハードウェアシーケンサーのほか、Pulp、Processing、Unityなどで作成したシーケンサーもあります。Step Sixteenはこれらのプロトタイプの集大成であり、私がこれまでに学んだすべてを組み合わせました。同時に自分のC#、Unity、Wwiseのスキルを向上させるすばらしい機会でした。
Step Sixteen
Step Sixteenは音楽制作用の16ステップシーケンサーのアプリで、TR-909やMachinedrumのような代表的なハードウェアドラムマシンの影響を受けています。
ユーザはドラムマシンのようにStep Sixteenを使って自分のビートをつくり出しますが、私たちはそれに併走するシンセを追加したため、ベースライン、アルペジオ、コード、メロディーなどが一緒に再生されます。すべてが同じアプリ内にあるため、本格的なDAWの習得に深入りすることなく、簡単にすばやく曲づくりを開始できます。ドラムやシンセサイザーの音をチャンネルスライダーで個別にかたちづくり、複数のコントロールで演奏をグローバルに操作し、ミックスの全体像を形成することができます。
Wwise
私たちがStep Sixteenで計画したさまざまな機能を達成するために汎用性の高いオーディオエンジンが必須であり、Wwiseこそ完璧なチョイスでした。
Wwiseは楽器を主体としたアプリをつくるための、すばらしいオーディオの骨組みを提供してくれました。RTPC、Modulator Envelope、Switch Container、内臓エフェクトなどを追加する機能は、私たちが目指すシーケンサー作成において不可欠でした。
クロック
プロジェクトの初期段階で直面した大きな課題のひとつが、シーケンサーを駆動する安定したクロックの実現でした。Unityでタイミングをとる方法をいろいろと試しましたが、どれも不安定であることが判明しました。最終的にタイミングをとるために、Wwiseのインタラクティブミュージックシステムを利用した方がよいだろうという結論に達しました。
私はWwiseでMusic Playlist Containerを作成し(Gridの分割は16とし、Tempoは100 BPMに設定)、何も入っていないダミーのMusic Segmentを入れました。このMusic Playlist Containerを使い、ダミーのMusic Segmentを無限にループ再生します。
残念ながらWwiseのMusic Playlist Containerは、BPM値にRTPCを追加することができません。ただしRTPCでPlayback Speedを制御するという迂回策があります。はじめにMusic Playlist Containerの実BPMを100に設定します。WwiseのPlayback Speedの範囲が0.25~4であるため、Playback Speedの0.5は、50BPMに相当します。
UnityでbpmPercentageTime変数を作成し、アプリのBPMスライダー値を100で割った値に等しくしました。例えばアプリのBPM表示が120であれば、WwiseのPlayback Speedは1.2に設定されます。
bpmPercentageTime = bpmSlider.value / 100.0f;
AkSoundEngine.SetRTPCValue("Playback_BPM", bpmPercentageTime);
コールバック
16ステップシーケンサーをつくるため、16分音符ごとに発生するコールバックを作成する必要がありました。そこでMusicSyncGridコールバックタイプを使い、Music Playlist ContainerのGridのFrequencyを16に設定しました。これによりUnityがMusic Playlist Containerの第16インターバルごとに何かを行うよう、指示を出せます。
Unityのコールバック関数の中に、各バー後にリセットされるカウンターをつくりました。これによりシーケンスの各ステップや、音をいつ再生するのかを把握できます。
当初はコールバック関数で即座にサウンドをポストすることを試みました。ところがタイミングの問題が発生し、代わりにNext Gridに設定したスティンガーをトリガーさせることにしました。これでサウンドを事前にスケジューリングし、正しく再生できました。
RTPC
Step Sixteenで音のかたちをつくるさまざまなスライダーをユーザが自由に操作できるよう、数多くのRTPCを作成する結果となりました。16のチャンネルだけでもそれぞれ19のRTPCが必要となり、合計304個となりました。
さらにディレイタイム、グローバルスライダー、再生BPM、テープストップなどの追加RTPCがあります。
エフェクト
Wwiseの内蔵エフェクトは個別のサウンドや全体のミックスをつくる上で、幅広い汎用性を提供してくれました。ディレイ、リバーブ、フランジャー、ディストーション、パラメトリックEQ、ピッチシフターなどを活用しました。
私自身、Teenage EngineeringのOP-1のテープストップエフェクトボタンをいつも楽しく使っていたいため、Step Sixteenにも同じようなエフェクトボタンを設けたいと思いました。そこでMaster Audio BusでWwise Pitch Shifterプラグインを使い、実現させました。具体的にはPitch Shift値を、RTPCとUnityのタイマーでランプダウンすることにより達成しました。
Step Sixteenの2つ目のエフェクトボタンは、LFOボタンです。このボタンはランダムな酔ったようなピッチにしたいと思いました。ピッチにランダムなLFOを割り当て、このLFOの周波数またはレートをランダムLFOでモジュレーションするという方式です。
パラメトリックEQ
より多くの音楽フィルタリングを達成するため、パラメトリックEQを活用しました。2つのバンド(ローパス・ハイパスに設定したバンドと、ピーキングに設定したバンド)を使うことにより値を連動して変えることができ、カットオフポイントで共振のブーストのあるローパスフィルタとハイパスフィルタを作成できました。これは電子音楽でよく耳にしますが、音をかたちづくるための内蔵ローパスフィルタやハイパスフィルタより優れた方法です。この方式は音をかたちづくるドラムのローパスフィルタやハイパスフィルタに使い、またフィルタースウィープ実行のためのグローバルのローパスフィルタやハイパスフィルタに使います。
ディレイタイムの迂回策
Wwiseの制約の1つが、ディレイプラグインがディレイタイムにRTPCをアサインできない点です。プラグインのxmlファイルを修正するという解決方法がありますが、ディレイタイムを変えた時にポップ音やクリック音を引き起こしてしまうため、採用しませんでした。時間があればディレイタイムの変更時にノイズが発生しないよう、非整数遅延プラグインを独自開発するところですが、今回のプロジェクトではスコープ外でした。
私たちは代わりに異なる固定ディレイタイムの4種類のディレイを用意し、それらの間でフェードさせ、ユーザがディレイタイムを選択できるようにしました。理想的な解決策とは言えませんが、Step Sixteenでポップ音やクリック音なく、ディレイタイムをある程度変化させることができます。
まとめ
Step Sixteenの開発は困難でしたが、楽しかったです。Wwiseのコールバック、スティンガー、インタラクティブミュージックシステムなどにより、確実なクロックを達成することができました。内蔵エフェクト、RTPC、モジュレーションエンベロープなどを活用したため、ユーザは自由にサウンドをかたちづくることができます。私たちはStep Sixteenで音楽をつくることが大好きで、Step Sixteenを活用したみなさんの作品を聴くことを楽しみにしています。
Step SixteenをSteamで公開中:https://store.steampowered.com/app/2407480/Step_Sixteen/
コメント