1. サイトトップ
  2. ブログ
  3. Unity
  4. 【Unity】wavデータをプログラムを使用せずにループさせてみる

【Unity】wavデータをプログラムを使用せずにループさせてみる

はじめに

こんにちは。情熱開発部・プログラム2課の青木です。

ここ最近は気温が下がってきてセミの鳴き声からコオロギの鳴き声に変りつつありますね。

プログラムで虫の鳴き声をループさせようと思っても鳴き始めの部分に違和感が出てしまうんですよね…

そこで今回はwavデータの音源にsmplチャンクを付与することで一部分のループを実装していきます。

ループを再生、確認するにあたってUnityを使用してみようと思います。

※使用しているUnityのバージョンは2020.3.28f1です。

音楽

今回使用する音源については魔王魂様からお借りしております。

smplチャンクについて

smplチャンクはWaveFileの波形データを複数の音源としてマークし、Midiサンプラーが扱う事を可能にするためのチャンクです。他にもWAVの波形データのどこからどの部分かを示すチャンクのCueチャンクなどがあります。今回はsmplチャンクを利用してループしたい部分のみを指定しループさせるようにしてみたいと思います。

smplチャンクはwavヘッダに付属しているチャンクとは少し違い、波形ファイルの後ろに追加されるデータになります。

以下は実際にsmplチャンクを付与したwavファイル内のデータになります。

こちらのサイトを見るとsmplチャンクのフォーマットは以下の様になっています

Offset Size Description Value
0x00 4 Chunk ID “smpl” (0x736D706C)
0x04 4 Chunk Data Size 36 + (Num Sample Loops * 24) + Sampler Data
0x08 4 Manufacturer 0 – 0xFFFFFFFF
0x0C 4 Product 0 – 0xFFFFFFFF
0x10 4 Sample Period 0 – 0xFFFFFFFF
0x14 4 MIDI Unity Note 0 – 127
0x18 4 MIDI Pitch Fraction 0 – 0xFFFFFFFF
0x1C 4 SMPTE Format 0, 24, 25, 29, 30
0x20 4 SMPTE Offset 0 – 0xFFFFFFFF
0x24 4 サンプルループ数 0 – 0xFFFFFFFF
0x28 4 Sampler Data 0 – 0xFFFFFFFF
0x2C various このチャンクのデータに含まれるサンプルループの設定データ部分

Midiの部分は今回はちょっと無視させてもらい、ループ設定の部分を見ていきます。ループ設定のフォーマットは以下の様になっています。主にこの設定が0x2C以降に並んでいきます。

Offset Size Description
0x00 4 固有ID 通常はCueチャンクで指定したIDになります(今回はWAVDataの全てなので0)
0x04 4 ループタイプ normal、Ping Pongなどが選べます
0x08 4 ループ開始位置 サンプルのループの開始点
0x0C 4 ループ終了位置 サンプルのループの終了点
0x10 4 ループ微調整チューニング ループを微調整する解像度、サンプルの1/2でループしたい場合などに設定する
0x14 4 ループ回数 ループ回数。0は無限ループ

チャンクの情報は多いですが今回はこのチャンクのデータに含まれるサンプルループの設定データ部分 、サンプルループ情報の ループ開始位置、終了位置をメインに触ってループさせていきたいと思います。

実際にsmplチャンクを付与しUnityでループ再生させてみる

サンプルループ数を1に、ループ位置はサウンド終了1秒前からサウンド終了のみをループさせてみたいと思います。

以下の画像のようなイメージでループしてみます。

Unityで再生するための下準備

まずはシーン内にAddComponentからAudioListnerを用意します。

次に同じくAddComponentからAudioSourceを追加し、AudioClipにsmplチャンクのついたサウンドを追加、Loopにチェックを入れます。

Loopにチェックが入っていないとsmplチャンクを無視して、ループしてくれなくなります。

Unityでサウンドチェック

ループ用のSEでないためループに違和感がありますが、smplチャンクで指定した部分のみがループされているのが確認できますね

これでイントロ付きのBGMでもSEでも違和感なくループをすることが出来そうですね。

最後に

今回はUnityを使用しsmplチャンクが入った音源を鳴らしてみました。

Unityで確認してみましたが、Unity以外にもDxLibなどにも対応しているのでサウンドのループ処理に困った際にwavファイルにsmplチャンクを埋め込んでみるのもいいですね。

その他のゲームエンジンでは対応していないこともあるのでご注意ください。

参考サイト

smplチャンク情報の参考

smplチャンクの生成

オーディオビジュアライザの参考


【免責事項】

本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。