Upload
historiainc
View
1.026
Download
0
Embed Size (px)
Citation preview
© historia Inc.
新しい Unreal Audio Engine で
インタラクティブサウンドコンテンツは
どこまでつくれるか!?
historia Inc.
加藤 優作
© historia Inc.
自己紹介
加藤 優作 (エンジニア)
開発実績
ハネチャリ (VR Zone Shinjuku にて稼働中)
コミュニティ活動
Gray ちゃん 3D モデル制作
© historia Inc.
新しいオーディオ機能
Unreal Engine 4.16 から新しいオーディオ機能が多数追加されました!
Unreal Audio Engine
新しいオーディオエンジン
サウンドエフェクト機能の追加など
Synthesis
音色を作成して鳴らすことができる
Steam Audio
物理ベースオーディオ体験の実現
© historia Inc.
発表概要
新しいオーディオ機能の追加によってUnreal Engine の機能だけでどこまで面白いことができるようになったのか をデモを作成しながら検証
使用した各オーディオ機能について
それを使うとどんなことができるのか
どのように使うか
を解説
© historia Inc.
諸注意
Unreal Audio Engine 及び Synthesis Plugin はEarly Access Preview 扱いです (UE 4.16 現在)
今後機能や使い方が変更になる可能性があります
なるべくわかりやすい解説にするために内容の正確性・厳密性を犠牲にしています
新機能以外の解説もします
検証環境
Unreal Engine 4.16.3
Windows 10
© historia Inc.
デモについて
© historia Inc.
デモの解説
インタラクティブなオーディオビジュアライザ
キーボードを弾く “楽器演奏者” と
マウスを操作する “ゲームプレイヤー” の
2 人が必要
© historia Inc.
デモの解説
① BGM に合わせてキーボードを弾く
© historia Inc.
デモの解説
① BGM に合わせてキーボードを弾く
②鍵盤エフェクトが出る
© historia Inc.
デモの解説
① BGM に合わせてキーボードを弾く
③鍵盤エフェクトをロックオン・破壊
②鍵盤エフェクトが出る
© historia Inc.
デモの解説
① BGM に合わせてキーボードを弾く
④破片エフェクトがキーボードに当たってBGMに合った音が鳴る
③鍵盤エフェクトをロックオン・破壊
②鍵盤エフェクトが出る
© historia Inc.
デモの解説
① BGM に合わせてキーボードを弾く
④破片エフェクトがキーボードに当たってBGMに合った音が鳴る
③鍵盤エフェクトをロックオン・破壊
②鍵盤エフェクトが出る
ゲームプレイが音に影響を与える
楽器演奏がゲームに影響を与える
© historia Inc.
基礎知識
(MIDI と Audio)
© historia Inc.
MIDI
演奏データ (MIDI Event) を機器間でやりとりするための世界共通規格
MIDI – Wikipedia
楽譜のようなもの
実際の音のデータではない
MIDI Event の例 : Note On
どのチャンネル (楽器パート) の
どの高さの音を
どれくらいの強さで弾いた?
© historia Inc.
Audio
音そのもののデータのこと
.wav / .mp3 / .ogg
© historia Inc.
デモの機材構成
© historia Inc.
デモの機材構成 Audio MIDI
© historia Inc.
Modular SynthComponent
デモの音データの流れ Audio MIDI
MIDI Device Support Plugin
Unreal Engine
Modular SynthComponent
© historia Inc.
Audio 新機能を使うための準備
© historia Inc.
Audio 新機能を使うための準備
Unreal Audio Engine は4.16 ではデフォルトで有効になっていない
Unreal Audio Engine 開発チームの方が書いたForum の Thread を参考にする
4.16 New Audio Engine: Early Access Quick-Start Guide
https://forums.unrealengine.com/showthread.php?143974-4-16-New-Audio-Engine-Early-Access-Quick-Start-Guide&styleid=6
新機能の使い方もここに載っています
© historia Inc.
手順 (Windows)
1. Config (.ini) を変更する
2. コマンドラインオプションを指定してプロジェクトを開く
3. プラグインを有効にする
4. (Editor Preferences を変更する)
© historia Inc.
手順 1. Config (.ini) を変更する
編集するファイル (どちらか一方)
<エンジンディレクトリ>/Engine/Config/Windows/WindowsEngine.ini
<プロジェクトディレクトリ>/Config/Windows/WindowsEngine.ini
以下を追記する
→ これで、手順 2 で指定するコマンドラインオプションが有効に
[Audio]AudioDeviceModuleName=AudioMixerXAudio2
© historia Inc.
手順 2. コマンドラインオプションを指定してプロジェクトを開く
-audiomixer オプションを指定してプロジェクトを開く
コマンドプロンプトで以下を実行する
具体例
.bat ファイル化を推奨
<UE4Editor.exe のパス> < .uprojectのパス > –audiomixer
“C:\Program Files\Epic Games\UE_4.16\Engine\Binaries\Win64\UE4Editor.exe” “C:\Test_AudioEngine\Test_AudioEngine.uproject” –audiomixer
半角スペース 半角スペース
© historia Inc.
手順 3. プラグインを有効にする
Audio -> Sound Utilities
Audio -> Synthesis (Synth を使う場合)
© historia Inc.
(手順 4. Editor Preferences を変更する)
※ 必須ではありません
Editor Preferences を開き、以下の設定を変更する
Level Editor -> Miscellaneous -> Sound-> Allow Background Audio : ON
エディタからフォーカスが外れてもオーディオが再生される
Level Editor -> Miscellaneous -> Sound-> Enable Editor Sounds : OFF
エディタのサウンドが再生されなくなる
Level Editor -> Play -> Play in Editor-> Enable PIE Enter and Exit Sounds : OFF によって再生されなくなるPlay / Stop / Eject / Possess の音に加えてCompile 時の音なども再生されなくなる
© historia Inc.
(手順 4. Editor Preferences を変更する)
※ 必須ではありません
Editor Preferences を開き、以下の設定を変更する
General -> Miscellaneous-> Performance -> Use Less CPU when in Background : OFF
エディタからフォーカスが外れても CPU 消費が少なくならない
© historia Inc.
解説
© historia Inc.
目次
[旧] キーボードからの MIDI Event を受信する
[新] シンセサイザーで音を鳴らす
[旧] 曲の拍のタイミングを取得する
[新] 音にエフェクトをかける
[新] 現在の音の大きさを取得する
[新] 音の高さ毎の音の大きさを取得する
© historia Inc.
[旧] キーボードからの
MIDI Event を受信する
© historia Inc.
デモでは…
(機材の) キーボードを弾くと(画面の) キーボードの対応するキーが光ったりParticle が出たりする
© historia Inc.
Modular SynthComponent
Audio MIDI
Unreal Engine
Modular SynthComponent
デモの構成図上では…
ビジュアライズ
MIDI Device Support Plugin
© historia Inc.
MIDI Device Support Plugin
MIDI Event の受信を行うための Plugin
Plugin の説明には“send and receive MIDI events”と書かれているが、送信処理が見当たらない…
© historia Inc.
MIDI Device Support Plugin の使い方
FindMIDIDevices 関数 で 接続中の MIDI Device を列挙する
FoundMIDIDevice 構造体 のリストから使いたい Device を判断
Device の名前
Device が既に使用されているかどうか
etc...
© historia Inc.
MIDI Device Support Plugin の使い方
CreateMIDIDeviceController 関数 でMIDIDeviceController を作成
MIDI Event 受信時に呼ばれる OnMIDIEvent に Event を Bind
© historia Inc.
MIDI Device Support Plugin の使い方
作成した MIDIDeviceController は変数に Set しないと GC に回収されてしまうので注意
© historia Inc.
MIDI Device Support Plugin の使い方
Event Type で MIDI Event の種類がわかる
© historia Inc.
MIDI Device Support Plugin の使い方
受信した MIDI Event が Note On の場合
Controll ID = ノート番号 (中央 C = 60)
Velocity = 音の強さ (数字が大きいほど音が強い、範囲 [0, 127])
© historia Inc.
MIDI Device Support Plugin の使い方
受信した MIDI Event が Note Off の場合
Controll ID = ノート番号 (中央 C = 60)
© historia Inc.
[新] シンセサイザーで音を鳴らす
© historia Inc.
デモでは…
破片エフェクトがキーボードに当たった時の音を生成
© historia Inc.
シンセサイザー (Synthesizer / Synth) とは?
電気的に音を合成する機器 のこと
パラメータ変更で色々な音を作ることができる
色々な合成方式がある
減算合成
加算合成
グラニュラー
etc...
シンセ ≠ キーボード
鍵盤付きシンセが多いが音の合成機能があれば鍵盤がなくてもシンセ
The Future of Audio in Unreal Engine | GDC 2017 | Unreal Engine – YouTube よりhttps://www.youtube.com/watch?v=ErejaBCicds
© historia Inc.
Unreal Engine の Synth の種類と日本語情報
Modular Synth (減算合成)
UE4 4.16のPreview版の新Audio機能の所感など | 株式会社プラスシグナル
https://www.plus-signal.com/single-post/2017/05/15/UE4-416%E3%81%AEPreview%E7%89%88%E3%81%AEAudio%E6%A9%9F%E8%83%BD%E3%81%AE%E6%89%80%E6%84%9F%E3%81%AA%E3%81%A9
UE4 Modular Synthを触ってみる。 - UE4初心者が頑張ってるブログ
http://mozpaca.hatenablog.com/entry/20170514/1494754900
Granular Synth 【UE4】Unreal Engine 4.16 PreviewのGranular Synthを触ってみる - 大福未来研究所
http://dfkfuturelab.hatenablog.com/entry/2017/05/16/081659
Synth Sample Player (?)
© historia Inc.
Modular Synth (減算合成)
The Future of Audio in Unreal Engine | GDC 2017 | Unreal Engine – YouTube よりhttps://www.youtube.com/watch?v=ErejaBCicds
波の形を決める
フィルタをかける 音量変化をコントロールする
(音としては使わない) 波などでパラメータをコントロールする
© historia Inc.
Modular Synth の使い方
ModularSynthComponent を追加
NoteOn 関数 で音を再生
引数 Duration で音が鳴る長さを指定
負の値を入れると NoteOff までずっと鳴る
NoteOff 関数 で音を停止
© historia Inc.
Modular Synth の使い方
引数 Note / Velocity にはMIDI Event と同じルールで ノート番号 / 音の強さ を与える
MIDI Event の値をそのまま Synth に渡せば「キーボードを弾くと Unreal で音が鳴る」 ロジックが完成
© historia Inc.
Modular Synth の使い方
音のパラメータを変更するにはSet Synth Preset 関数 を使う
ModularSynthPreset 構造体 を作って渡せばよいが…
© historia Inc.
Modular Synth の使い方
メンバ変数が多い!
Preset を Asset として定義して呼び出す→ ModularSynthPresetBank を使う
© historia Inc.
ModularSynthPresetBank を使う
Add New -> Sounds-> Modular Synth Preset Bank を選択
Preset を編集
複数の Preset を作成できる
© historia Inc.
ModularSynthPresetBank を使う
ModularSynthPresetBank の参照変数を作成し、そこから使用する Preset を取得する
© historia Inc.
Preset Q&A
Q. 複数の Note を NoteOn しているのに 1 つしか鳴らない
A. Enable Polyphony を true にしてください
Q. 音痴になった
A.
Osc 1 or 2 の Semitones と Cents を 0 にしてください
Chorus Enabled を false にしてください
© historia Inc.
[旧] 曲の拍のタイミングを取得する
© historia Inc.
デモでは…
各小節の 1 拍目に リング状の Mesh を Spawn
破片エフェクトが リズムに合うタイミング でBGM のコードに合う鍵盤 に当たるように調整
© historia Inc.
OnAudioPlaybackPercent
AudioComponent の Event
PlaybackPercent は現在の再生率を返す
0.0 から始まり 1.0 で Audio の最後に到達
ループ再生すると 1 を超える
PlayingSoundWave は現在再生中の SoundWave を返す
SoundWave の Duration (Audio の長さ (秒)) x Playback Percent= 現在の再生位置 (秒)
© historia Inc.
BPM = Beats Per Minite
1 分間における拍の数
BPM 60 = 1 分間に 60 拍 = 1 秒で 1 拍
60 ÷ BPM = 1 拍にかかる秒数
現在の再生位置 ÷ 1 拍にかかる秒数 = 現在の累計拍数 (0 始まり)
現在の累計拍数 ÷ 1 小節における拍の数 + 1 =
現在の累計拍数 % 1 小節における拍の数 + 1 =
現在の小節数
現在の小節数・拍数の求め方
現在の拍数
© historia Inc.
現在の小節数・拍数の求め方
© historia Inc.
現在の小節数・拍数の求め方
© historia Inc.
BGM のコードに合った音の選択
何小節目の何拍目に何のコードになるかをDataTable で管理
計算で求めた現在の小節数・拍数からコードに合った音を選定する
例 : 21 小節目の 1 拍目にF minor 7th のコードになる→ コードに合った音は
F / A♭ / C / E♭
© historia Inc.
[新] 音にエフェクトをかける
© historia Inc.
デモでは…
キーボード (文字を打つ方) の操作でBGM に Low Pass Filter がかかり、音がこもった感じに
Filter のかかり具合を実行時に調整
Filter が強くかかるほど彩度が落ちるように
© historia Inc.
サウンドエフェクトとは?
音に対して何らかの加工を行うもの
種類
Delay : やまびこ効果 (やっほー やっほー)
Low Pass Filter : 低音 (Low) を通す (Pass) → 高音をカットする
etc...
サウンドエフェクト
エフェクター(エフェクトをかける機材)
エフェクター
© historia Inc.
Modular SynthComponent
Audio MIDI
MIDI Device Support Plugin
Unreal Engine
デモの構成図上では…
Modular SynthComponent
© historia Inc.
新機能 : SourceEffect
SourceEffect
エフェクトそのもの
SourceEffectPreset
SourceEffect にプリセット値を与えたもの
同種の SourceEffect に対して複数作成できる
SourceEffectPresetChain
SourceEffectPreset を数珠繋ぎにしたもの
Chain
Delay エフェクトです
1 秒遅らせるDelay エフェクトです
2 秒遅らせるDelay エフェクトです
A
B
AC D
© historia Inc.
SourceEffect の “Source” って何?
Source とは以下のものを指す
SoundWave
SoundCue
Synth (ModularSynth など)
Audio Component は Source ではない
つまり、SourceEffect = 上記の要素に対してかけることができるエフェクト
他のエフェクトとして、SoundSubmix に対してかけることができる SubmixEffect がある
© historia Inc.
SourceEffect の使い方
1. SourceEffect を作成する (C++)(解説後回し)
2. SourceEffectPreset を作成してプリセット値を設定する
3. SourceEffectPresetChain を作成してSourceEffectPreset をセットする
4. Source にSourceEffectChain をセットする
Chain
Delay エフェクトです
1 秒遅らせるDelay エフェクトですA
AC D
Chain
© historia Inc.
手順 2. SourceEffectPreset を作成してプリセット値を設定する
Content Browser-> Add New -> Sounds-> Source Effect Preset を選択
© historia Inc.
手順 2. SourceEffectPreset を作成してプリセット値を設定する
SourceEffect を選択
デフォルトで 11 種類
© historia Inc.
手順 2. SourceEffectPreset を作成してプリセット値を設定する
作成した SourceEffectPreset を開き、Details パネル-> Audio -> Effects-> Settings の値を設定する
© historia Inc.
手順 3. SourceEffectPresetChain を作成してSourceEffectPreset をセットする
Content Browser-> Add New -> Sounds-> Source Effect Preset Chain を選択
© historia Inc.
手順 3. SourceEffectPresetChain を作成してSourceEffectPreset をセットする
作成した SourceEffectPresetChain を開き、Details パネル-> Source Effect -> Chain にSourceEffectPreset をセットする
© historia Inc.
手順 3. SourceEffectPresetChain を作成してSourceEffectPreset をセットする
エフェクトはindex 0 から順番にかかります
順番が異なると結果も異なるので注意
Bypass (迂回) でエフェクトがかからないようにできる
Chain
Chain
Chain
© historia Inc.
手順 4. Source にSourceEffectChain をセットする
SoundWave / SoundCue / Synth Component を開き、Details パネル -> Effects-> Source Effect Chain にSourceEffectChain をセットする
© historia Inc.
確認方法
SoundWave / SoundCue の場合はContent Browser 上で再生すればエフェクトがかかった状態で確認できる
© historia Inc.
Blueprint でできること
SourceEffectPresetChain に対する SourceEffectPreset の追加・削除
SourceEffectPresetChain 内の SourceEffectPreset の Bypass 設定
© historia Inc.
Blueprint でできること
SourceEffectPreset の Settings の変更 (エフェクトの実行時設定調整)
© historia Inc.
手順 1. SourceEffect を作成する (C++)
Add New -> New C++ Class を選択する
Show All Classes のチェックをオンにしてSoundEffectSourcePreset を検索・選択し、Next を選択
© historia Inc.
手順 1. SourceEffect を作成する (C++)
Name に “SourceEffect<エフェクト名>” と入力
このように命名すると、デフォルトの SourceEffect 関連クラスと命名規則が合います
Create Class を選択
© historia Inc.
手順 1. SourceEffect を作成する (C++)
3 つのクラス・構造体が自動的に作成される
FSourceEffect~Settings
エフェクト設定の構造体
FSourceEffect~
音データの処理を担当するクラス
FSourceEffect~Preset
上記 2 つをEditor に公開するためのクラス
© historia Inc.
手順 1. SourceEffect を作成する (C++)
作成した時点で“Volume を変更するエフェクト”として機能する
© historia Inc.
手順 1. SourceEffect を作成する (C++)
ソースに手を加える部分
FSourceEffect~Settings
設定項目をメンバ変数として追加
FSourceEffect~
メンバ関数 Init を override
Audio 処理前に呼び出される初期化用関数
メンバ関数 OnPresetChanged を override
Preset (Settings) の設定が変更されたときに呼び出される関数
メンバ関数 ProcessAudio を override
Audio 処理を行う関数
© historia Inc.
手順 1. SourceEffect を作成する (C++)
関数 ProcessAudio
引数 InData.AudioFrame として渡される音の波の変位を元に計算を行い、引数 OutData.AudioFrame に新しい変位を代入することで出力を行う
InData, OutData 共に値の範囲は [-1.0, 1.0)
InData はその瞬間の波の変位なので、ある期間内の波の変位が欲しい場合はバッファリングする必要がある
波の変位とは?
ある時点での波の高さの値のこと
変位 0.5
ある時点
© historia Inc.
手順 1. SourceEffect を作成する (C++)
“Volume を変更するエフェクト” のコード例
InData.AudioFrame[Channel] = 0.5 OutData.AudioFrame[Channel] = 0.25
×
VolumeScale (例 : 0.5)
© historia Inc.
[新] 現在の音の大きさを取得する
© historia Inc.
デモでは…
キーボードとスペクトラムビジュアライザがBGM の音の大きさに合わせて拡大・縮小する
© historia Inc.
音波
空気の圧力変化の波
振幅が大きい方が音が大きい
周波数が高い (波長が短い) 方が音が高い
音が大きくて低い 音が小さくて高い比較
© historia Inc.
音の大きさを取得する
今の音の大きさを知りたい → 振幅を取ればよい
ある時点での変位を見るだけでは振幅はわからない
(振幅は大きいのに)この時点での変位は0
© historia Inc.
音の大きさを取得する
欲しいのは変位の包絡線→ これを取得するために EnvelopeFollower を使う
Envelope = 包絡線、Follower = 追跡者
© historia Inc.
新機能 : EnvelopeFollower
EnvelopeFollower は以下の組み合わせで動作する
通知送信側となるSourceEffect
通知受信側となるActorComponent
© historia Inc.
SourceEffectEnvelopeFollower
通常の SourceEffect
EnvelopeFollower
計算→ 結果を出力に反映
入力出力
(音が変わる)
計算→結果を外部に通知
入力出力
(音は変わらない)
受信側振幅
© historia Inc.
Modular SynthComponent
Audio MIDI
MIDI Device Support Plugin
Unreal Engine
Modular SynthComponent
デモの構成図上では…
振幅
ビジュアライズ
EnvelopeFollowerListener
Component
Source EffectEnvelope Follower
Preset
© historia Inc.
EnvelopeFollower の使い方
他の SourceEffect と同じように以下の手順を行う
SourceEffectPreset を作成してプリセット値を設定する
SourceEffectPresetChain を作成してSourceEffectPreset をセットする
Source にSourceEffectChain をセットする
© historia Inc.
EnvelopeFollower の使い方
振幅情報を利用したい Actor の Blueprint にてEnvelopeFollowerListenerComponent (受信側) を追加する
SourceEffectEnvelopeFollowerPreset型の変数を追加し、Default 値として Preset (送信側) を設定する
© historia Inc.
EnvelopeFollower の使い方
RegisterEnvelopeFollowerListener 関数 を使い、受信側と送信側を結びつける
送信側
受信側
© historia Inc.
EnvelopeFollower の使い方
EnvelopeFollowerListenerComponent の EventOnEnvelopeFollowerUpdate を Event Graph に追加する
この Event の Envelope Value から振幅情報を取得できる
© historia Inc.
[新] 音の高さ毎の
音の大きさを取得する
© historia Inc.
デモでは…
スペクトル解析結果をビジュアライズ(スペクトラムビジュアライザ)
© historia Inc.
波の分解
複雑な波は単純な波 (正弦波・余弦波) の足し算で表すことができる
正弦波 (sin)
余弦波 (cos)
© historia Inc.
スペクトル解析
複雑な波を単純な波に分解すると各周波数における振幅がわかる→ 音の高さ毎に音の大きさがわかる(スペクトル解析)
低くて大きい音 高くて小さい音
+
周波数 (音の高さ)
© historia Inc.
Sound Visualizations Plugin を使う?
関数 CalculateFrequencySpectrum でスペクトル解析を行うことができる
© historia Inc.
Sound Visualizations Plugin の問題点
エフェクトがかかる前の SoundWave の解析にしか対応していない
.wav のヘッダ情報を読んで解析を行っているため
Packaging に対応していない
.wav のヘッダ情報を読む部分のコードが Editor only のため
Epic の内部イベントで作られた実験的ツールであり、開発者は今後フォローアップするつもりがない
https://answers.unrealengine.com/questions/144483/packaging-game-fails-with-audio-visualization-plug.html
© historia Inc.
スペクトル解析結果を通知する Source Effect の自作
EnvelopeFollower と同じ仕組みで振幅の代わりに スペクトル解析結果 を外部に通知するSourceEffect を実装すればスペクトラムビジュアライザが作れる
受信側スペクトル外部に通知音はそのまま
© historia Inc.
スペクトル解析結果を通知する Source Effect の自作
通知の送信方法や受信側となる ActorComponent の実装はEnvelopeFollower のソースコードを参考にする /Engine/Plugins/Runtime/Synthesis/Source/Synthesis/Classes/SourceEffects/SourceEffectEnvel
opeFollower.h
一定期間の変位値が必要なため、バッファリングを行う
スペクトル解析処理はSound Visualizations Plugin のロジックを流用
高速フーリエ変換ライブラリ Kiss FFT が使用されている
© historia Inc.
Modular SynthComponent
Audio MIDI
MIDI Device Support Plugin
Unreal Engine
Modular SynthComponent
デモの構成図上では…
スペクトル解析結果
ビジュアライズ
Spec AnalizerListener
Component
Source EffectSpec Analizer
Preset
© historia Inc.
スペクトル解析結果を通知する Source Effect の自作
SourceEffect の効果が反映されるスペクトラムビジュアライザが完成
Low Pass Filter をかけると高音のスペクトル値が小さくなることが確認できる
© historia Inc.
まとめ
© historia Inc.
まとめ
Unreal Engine の標準オーディオ機能だけでも多くのことができるようになりそう!
オーディオミドルウェアを採用しないプロジェクトにおいて音による表現を諦めずに済むケースが多くなるかと思います
とはいえまだ Early Access Preview なので、安定性に不安が残ります
標準オーディオ機能の他にも、オーディオミドルウェア、Market Place の Plugin など、いろいろな選択肢があります
機能だけでなく、ワークフロー、過去の資産、予算などを考慮した上で適切なものを選択しましょう
© historia Inc.
ご清聴ありがとうございました!