目次
はじめに
こんにちは。情熱開発部・プログラム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チャンクを埋め込んでみるのもいいですね。
その他のゲームエンジンでは対応していないこともあるのでご注意ください。
参考サイト
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。