はじめに
こんにちは。久々の投稿です。
Unityでaudioのピッチを変えずにテンポを変える、いわゆるタイムストレッチの実装をしました。
UnityのAudioSourceはPitchの値をいじることで、audioの再生速度(テンポ)を速くしたり遅くしたりできますが、同時に音の高さ(ピッチ)も変わってしまいます。そこでUnityでaudioの音の高さを変えずに再生速度を変える方法)をAudioSourceのPitchだけでなく、AudioMixerのPitchShifterも同時にいじることで実現しました。
PitchShifterとは
PitchShifterはAudioMixerのコンポーネントの出力に効果を与えられるAudioEffectの一つです。AudioEffectには他にLowpassやEcho等があります。PitchShifterの効果は再生速度は変えずに音の高さを変えることです。
https://docs.unity3d.com/ja/current/Manual/class-AudioPitchShifterEffect.html
PitchShifterを使えば、例えばAudioSourceの音の高さを変えずに再生速度を2倍速くする方法は、
①AudioSourceのプロパティであるPitchの値を2.0に設定する。(再生速度が2倍、音の高さが2倍になる)
②PitchSifterのプロパティであるPitchの値を0.5に設定する。(再生速度は2倍のまま、音の高さが2*0.5=1倍になる)
で実現できます。
ただし、PitchShifterのプロパティPitchは0.5-から2.0までしか値が取れないのでMaxで2倍速しか取れません。
先ほどの方法は、Editor上のみで設定したため、動的に再生速度を変更することはできません。動的に変更するためにはスクリプトで制御する必要があります。AudioSourceはスクリプトからでも簡単に値を制御できますが、AudioMixerのAudioEffectの1つであるPitchShifterは、スクリプトで制御するためには一工夫が必要になります。その部分を詳しく書こうかと思ったのですが公式に「AudioMixerのプロパティにアクセスする方法」がまとめられていたので、そちらを参考にしてください。
https://unity3d.com/jp/learn/tutorials/topics/audio/exposed-audiomixer-parameters
おわりに
とても短い記事になってしまいました。。。
短すぎるのもあれなので、この記事を書くことになった経緯をお伝えしたいと思います。
この記事に書いてある内容は、就職活動中に志望先の企業のエンジニアの方々に教えて頂いたものです。
当時、自分では実装方法がなかなか思いつかず、だめもとで志望先の面接官の方に「困ってます!!」とお話したら、現場のエンジニアの方に質問内容を回してくださり、後日、ソースコードと共に回答が返ってきました。
自分がさんざん悩んだ実装をさらりと回答する辺り、「プロのエンジニアめちゃくちゃすごい!!!」ってなったのは勿論のこと、まだその企業で働くことも決まっていない赤の他人のために時間を割いてくださった事にとても感動して、自分も困っている誰かのために情報を伝えたいなと思って記事を書きました。
結局、その企業とはご縁がありませんでしたが、就活中で最も印象に残っているエピソードです。いつか一緒にお仕事ができたらいいなと思います。