はじめに
複数回にわたってSoundFontファイル(.sf2ファイル)を読み込んでシンセサイザーなどに使えるようにパラメーターを組み立てる方法を説明しています。
ここではSoundFontファイル(.sf2)のフォーマットについて説明します。
各説明のリンクはこちらにまとめております → SoundFontの読み込みと組み立て
サンプルコードなども上記のリンクにあります。
SoundFontファイルのフォーマット
SoundFontファイルはRIFFファイル形式をとっています。
RIFFファイル形式では、そのファイルに必要なデータをチャンクと呼ばれるブロックに分けて保存し、チャンクにFourCCと呼ばれる4Byteの識別子(ID)を付けて管理するファイル形式です。
RIFFファイルについては下記に簡単に記載しております。必要に応じてご参照ください。
SoundFontファイルのチャンク
SoundFontファイルのチャンクと階層構造は下記となっています。各チャンクの詳細は後述します。
チャンク名 | タイプ | 必須 /任意 |
チャンク識別子 (ファイル/LIST識別子) |
概要 |
---|---|---|---|---|
RIFFチャンク | RIFF | 必須 | RIFF(sfbk) | RIFFチャンク |
ファイル情報チャンク | LIST | 必須 | LIST(INFO) | SoundFontファイルに関する情報を保存するLISTチャンク |
ifilチャンク | 一般 | 必須 | ifil | ファイルが基づくSoundFont規格バージョン |
isngチャンク | 一般 | 必須 | isng | 対象ウェーブテーブル音源チップ名 |
INAMチャンク | 一般 | 任意 | INAM | SoundFontファイルの名前 |
iromチャンク | 一般 | 任意 | irom | 依存しているROM(ハードウェア) |
iverチャンク | 一般 | 任意 | iver | 依存しているROM(ハードウェア)バージョン |
ICRDチャンク | 一般 | 任意 | ICRD | 作成日時情報 |
IENGチャンク | 一般 | 任意 | IENG | 製作者名 |
IPRDチャンク | 一般 | 任意 | IPRD | 対象ウェーブテーブル音源チップを搭載した製品名 |
ICOPチャンク | 一般 | 任意 | ICOP | 著作権者情報 |
ICMTチャンク | 一般 | 任意 | ICMT | コメント |
ISFTチャンク | 一般 | 任意 | ISFT | 作成時のツール名 |
音声波形チャンク | LIST | 必須 | LIST(sdta) | 音声波形データを保存するLISTチャンク |
smplチャンク | 一般 | 任意 | smpl | 16bit モノラルで録音された波形データ |
sm24チャンク | 一般 | 任意 | sm24 | 波形データを24bitに拡張するための下位8bitデータ |
音色情報チャンク | LIST | 必須 | LIST(pdta) | 音色情報を保存LISTチャンク |
phdrチャンク | 一般 | 必須 | phdr | プリセット(音色)のヘッダ情報 |
pbagチャンク | 一般 | 必須 | pbag | プリセット(音色)のバッグ情報 |
pmodチャンク | 一般 | 必須 | pmod | プリセット(音色)のモジュレーション情報 |
pgenチャンク | 一般 | 必須 | pgen | プリセット(音色)のジェネレータ情報 |
instチャンク | 一般 | 必須 | inst | インストルメント(楽器)のヘッダ情報 |
ibagチャンク | 一般 | 必須 | ibag | インストルメント(楽器)のバッグ情報 |
imodチャンク | 一般 | 必須 | imod | インストルメント(楽器)のモジュレーション情報 |
igenチャンク | 一般 | 必須 | igen | インストルメント(楽器)のジェネレータ情報 |
shdrチャンク | 一般 | 必須 | shdr | サンプル(音声波形)のヘッダ情報 |
SoundFontの各チャンクの説明
各チャンクについて説明いたします。
ファイル情報チャンクの説明
ファイル情報チャンクにはSoundFont規格のバージョンや対象のハードウェアなど、SoundFontファイル自身に関する情報が保存されています。
ソフトウェア音源等を製作しSoundFontファイルを扱う場合は、対象ハードウェアの情報はあまり意味がないと思われます。
ifilチャンク
概要 | ファイル自身が「どのバージョンのSoundFont規格に基づいているか?」が保存されているチャンクなります。 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 4Byte固定 | |||||||||||
データ部 | データ部には下記 構造体が入ります。
※WORD型はunsigned shortの再定義になります。 |
|||||||||||||
例 | 基づいているSoundfont規格バージョンが「2.11」ならmajor=2、minor=11となります。 | |||||||||||||
取り扱い例 | Soundfont規格は「2.0」「2.01」「2.04」しかなく、大きな違いもありませんので、基本的にメジャーバージョンが「2」以外のものはエラーとするとよいと思います。 | |||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが4Byteでない場合は、ファイルの読み込みを拒否します。 | |||||||||||||
備考 |
isngチャンク
概要 | ファイル自身が対象としているウェーブテーブル音源チップシリーズ名称が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「EMU8000」等 | ||
取り扱い例 | ハードウェア情報とこのチャンクの値を比較して、ファイル自身を読み込むかどうかの判断に使われたようです。 基本的には「EMU8000」が入りますが、ソフトウェアで扱う場合はこのチャンクは無視してもよいと思います。 |
||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は、内容を「EMU8000」として扱います。 | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さで、大文字と小文字は区別されます。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
INAMチャンク
概要 | ファイル自身の名称(バンク名)が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「General MIDI」等 | ||
取り扱い例 | ファイル名が違っても同じSoundFontファイルであることを認識させるために使われます。 SoundFontファイルの名称として利用できますが、特に利用する予定がなければこのチャンクは無視してもよいと思います。 |
||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は、バンク名称がない旨のエラーメッセージを出してこのチャンクを虫します。 | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さで、大文字と小文字は区別されます。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
iromチャンク
概要 | ファイル自身が参照しようとしているウェーブテーブル音源チップ内のROMデータ名称が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「1MGM」等 | ||
取り扱い例 | ウェーブテーブル音源チップ内のROMデータ(音声波形データ)を使用する場合に使われます。 ソフトウェアで扱う場合はこのチャンクは無視してもよいと思います。 |
||
エラー処理 (仕様書内容) |
このチャンクがない場合、データ部がない場合、不明なROMデータ名称の場合は、ROMデータが参照されないものとして扱います。 万が一参照された場合はそのプリセットは音が鳴らないように処理します。 |
||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さで、大文字と小文字は区別されます。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
iverチャンク
概要 | ファイル自身が対象としているウェーブテーブル音源チップ内のROMデータバージョンが保存されているチャンクになります。 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 4Byte固定 | |||||||||||
データ部 | データ部には下記 構造体が入ります。
※WORD型はunsigned shortの再定義になります。 |
|||||||||||||
例 | 対象としているROMデータバージョンが「1.36」ならmajor=1、minor=36となります。 | |||||||||||||
取り扱い例 | ソフトウェアで扱う場合はこのチャンクは無視してもよいと思います。 | |||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合、サイズが4Byteでない場合、不明なROMデータバージョンの場合は、ROMデータが参照されないものとして扱います。 万が一参照された場合はそのプリセットは音が鳴らないように処理します。 |
|||||||||||||
備考 |
ICRDチャンク
概要 | ファイル自身が作成された日付が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「May 1, 1995」等 | ||
取り扱い例 | 特に利用する予定がなければこのチャンクは無視してもよいと思います。 | ||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は無視します | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さです。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
IENGチャンク
概要 | ファイル自身の製作者名(デザイナーやエンジニアの名前)が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「Tim Swartz」等 | ||
取り扱い例 | 特に利用する予定がなければこのチャンクは無視してもよいと思います。 | ||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は無視します | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さです。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
IPRDチャンク
概要 | ファイル自身が「どのサウンドカード製品向けに作成されたか?」が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「SBAWE32」等 | ||
取り扱い例 | ソフトウェアで扱う場合はこのチャンクは無視してもよいと思います。 | ||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は無視します | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さで、大文字と小文字は区別されます。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
ICOPチャンク
概要 | ファイル自身の著作権情報が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「Copyright (c) 1995 E-mu Systems, Inc.」等 | ||
取り扱い例 | 特に利用する予定がなければこのチャンクは無視してもよいと思います。 | ||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は無視します | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さです。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
ICMTチャンク
概要 | ファイル自身のコメントが保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 文字列の長さ(終端文字含め最大65,536Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「This space unintentionally left blank.」等 | ||
取り扱い例 | 特に利用する予定がなければこのチャンクは無視してもよいと思います。 | ||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は無視します | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さです。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
ISFTチャンク
概要 | ファイル自身を作成した際に使用したツール(ソフトウェア)名称が保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 文字列の長さ(終端文字含め最大256Byte) |
データ部 | データ部はchar型の配列で、終端文字(\0)で終端されたASCIIコードの文字列が入ります。 | ||
例 | 「Preditor 2.00a:Preditor 2.00a」等 | ||
取り扱い例 | 作成時と更新時のツール名称とリビジョンをコロンで区切って記載します。ファイル更新時のエラートラッキング等に利用します。 特に利用する予定がなければこのチャンクは無視してもよいと思います。 |
||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は無視します | ||
備考 | チャンクサイズは終端文字(\0)を含めた文字列の長さで、大文字と小文字は区別されます。 文字列の長さは必ず偶数Byteになる仕様のため、奇数Byteの場合はさらに終端文字(\0)を追加して偶数Byteにしています。 |
音声波形チャンクの説明
音声波形チャンクにはSoundFontファイルで使われる音声波形データが保存されています。
ウェーブテーブル音源チップ内のROMデータを使うSoundFontファイルの場合、このチャンクがない場合があります。
ソフトウェア音源等を製作する際にこのチャンクがない場合、音色を再現することができないのでファイルの読み込みは諦めるしかありません。
smplチャンク
概要 | SoundFontファイルで使用するすべての楽器の音声波形データが保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 音声波形データの長さ×2 |
データ部 | データ部はshort型の配列で、16bitモノラルで録音されたすべての楽器の音声波形データが入ります。 サンプリングレートはshdrチャンクに記載されています。 楽器の音声波形データごとに「0」で埋め尽くされた46byteの区切りがあります。 |
||
取り扱い例 | 必要な楽器の音声波形データをメモリに読み込んで使用します。 このチャンクがない場合、ソフトウェアでは音色を再現することができないのでファイルの読み込みは諦めるしかありません。 |
||
エラー処理 (仕様書内容) |
このチャンクがない場合やデータ部がない場合は無視します。 | ||
備考 | 1つの楽器の音声波形データは最低48Byteなければなりません。 |
sm24チャンク
概要 | smplチャンクの音声波形データを24bitに拡張するための下位8bitが保存されているチャンクになります。 | ||
---|---|---|---|
必須・任意 | 任意 | チャンクサイズ | 下位8bit音声波形データの長さ |
データ部 | データ部はBYTE型の配列で、smplチャンクの音声波形データの下位8bitが入ります。 ※BYTE型はunsighned charの再定義になります。 |
||
取り扱い例 | 必要な楽器の音声波形データをメモリに読み込んだ後、smplチャンクのデータと組み合わせて使用します。 このチャンクは無視してもよいと思います。 |
||
エラー処理 (仕様書内容) |
このチャンクがない場合、データ部がない場合、チャンクサイズがsmplチャンクの1/2でない場合、基にしているSoundFont規格が2.04未満の場合は無視します。 また、smplチャンクがない場合やデータ部がない場合も無視します。 |
||
備考 |
音色情報チャンク(Hydraチャンク)の説明
音色情報チャンクにはSoundFontファイル内にあるすべての音色に関する情報が保存されています。
音声波形データの開始・終了位置やループポイント、音量やフィルタのエンベロープ等の音色に必要なパラメータ情報が保存されています。
この音色情報チャンクは配下に9つのチャンクを持ちそれぞれが関連して音色情報を構成されていることから、ギリシャ神話の9個の頭を持つ怪物ヒュドラ(Hydra)の名前が付いています。
(データを取り扱う際にはあまり意味はありませんが仕様書にもある用語ですのでご紹介しております。)
「プリセット」「インストルメント」「サンプル」「ゾーン」等の用語、具体的なパラメータ、音色情報のチャンクの関連については別途 記載いたしますので、一旦 下記のようなチャンクがあることだけ覚えておいてください。
phdrチャンク
概要 | SoundFontファイル内のすべてのプリセットのヘッダ情報が入ったチャンクです。 インストルメント(楽器)のマッピング情報やパラメータ、割り当てインストルメント(楽器)等の情報はpbagチャンク、pmodチャンク、pgenチャンクに含まれています。 |
||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 38Byte×(プリセット数+1) | ||||||||||||||||||||||||||
データ部 | データ部には下記 構造体がプリセット数+1個分入ります。 phdrチャンク最後のデータは終端データで必ず name…「EOP」 bagIndex…「pbagチャンクの最後のデータ(終端データ)のインデックス」 となります。(他の変数は「0」)
※WORD型はunsigned short、DWORDはunsigned longの再定義になります。 |
||||||||||||||||||||||||||||
取り扱い例 | 必要なプリセットを読み込んで使用します。 | ||||||||||||||||||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合、サイズが38Byteの倍数でない場合、2個以下の場合はファイルの読み込みを拒否します。 | ||||||||||||||||||||||||||||
備考 | bagIndexの値はプリセット順に必ず増加します。 |
pbagチャンク
概要 | SoundFontファイル内のプリセットレベルにおけるすべてのバッグ情報が入ったチャンクです。 バッグはモジュレータとジェネレータをひとまとめにするためのもので、バッグ・モジュレータ・ジェネレータのかたまりをゾーンと言います。 具体的に「どのパラメータをどうするか?」の情報はpgenチャンクとpmodチャンクに含まれています。 |
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 4Byte×(プリセットバッグ数+1) | |||||||||||
データ部 | データ部には下記 構造体がプリセットバッグ数+1個分入ります。 pbagチャンク最後のデータは終端データで必ず modIndex…「pmodチャンクの最後のデータのインデックス」 genIndex…「pgenチャンクの最後のデータのインデックス」 となります。
※WORD型はunsigned shortの再定義になります。 |
|||||||||||||
取り扱い例 | 必要なプリセットバッグを読み込んで使用します。 | |||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。 | |||||||||||||
備考 |
pmodチャンク
概要 | SoundFontファイル内のプリセットレベルにおけるすべてのモジュレータの情報が入ったチャンクです。 モジュレータとは「MIDI CCで音量を操作する」「ピッチベンドで音程(ピッチ)を操作する」といった設定情報になります。 |
||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 10Byte×(モジュレータ数+1) | ||||||||||||||||||||
データ部 | データ部には下記 構造体がモジュレータ数+1個分入ります。 pmodチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。 実装されているソフトウェアも少ないようですので詳細については割愛します。
※WORD型はunsigned shortの再定義になります。 |
||||||||||||||||||||||
取り扱い例 | 必要なモジュレータを読み込んで使用します。 | ||||||||||||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが10Byteの倍数でない場合はファイルの読み込みを拒否します。 | ||||||||||||||||||||||
備考 | Soundfont規格バージョン 2.0ではこのチャンクは定義されておらず、終端データのみになります。 |
pgenチャンク
概要 | SoundFontファイル内のプリセットレベルにおけるすべてのジェネレータの情報が入ったチャンクです。 ジェネレータとはマッピングや音量やフィルタのエンベロープ、割り当てインストルメント(楽器)等の設定情報になります。 |
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 4Byte×(ジェネレータ数+1) | |||||||||||
データ部 | データ部には下記 構造体がジェネレータ数+1個分入ります。 pgenチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。 genOperで変更が必要なパラメータを指定し、genAmountで変更する量を指定します。 genOperで使用されるジェネレータIDの詳細はこちらに記載しております。 → SoundFontのジェネレータについて
※WORD型はunsigned shortの再定義になります。 |
|||||||||||||
ジェネレータIDルール | ゾーン内のジェネレータIDには下記のルールがあります。
|
|||||||||||||
取り扱い例 | 必要なジェネレータを読み込んで使用します。 | |||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。 | |||||||||||||
備考 |
instチャンク
概要 | SoundFontファイル内のすべてのインストルメント(楽器)のヘッダ情報が入ったチャンクです。 サンプル(音声波形)のマッピング情報やパラメータ、割り当てサンプル(音声波形)等の情報はibagチャンク、imodチャンク、igenチャンクに含まれています。 |
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 22Byte×(インストルメント数+1) | |||||||||||
データ部 | データ部には下記 構造体がインストルメント数+1個分入ります。 instチャンク最後のデータは終端データで必ず name…「EOP」 bagIndex…「ibagチャンクの最後のデータ(終端データ)のインデックス」 となります。
※WORD型はunsigned shortの再定義になります。 |
|||||||||||||
取り扱い例 | 必要なインストルメントを読み込んで使用します。 | |||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが22Byteの倍数でない場合はファイルの読み込みを拒否します。 | |||||||||||||
備考 |
ibagチャンク
概要 | SoundFontファイル内のインストルメントレベルにおけるすべてのバッグ情報が入ったチャンクです。 バッグはモジュレータとジェネレータをひとまとめにするためのもので、バッグ・モジュレータ・ジェネレータのかたまりをゾーンと言います。 具体的に「どのパラメータをどうするか?」の情報はigenチャンクとimodチャンクに含まれています。 |
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 4Byte×(インストルメントバッグ数+1) | |||||||||||
データ部 | データ部には下記 構造体がインストルメントバッグ数+1個分入ります。 ibagチャンク最後のデータは終端データで必ず genIndex…「igenチャンクの最後のデータのインデックス」 modIndex…「imodチャンクの最後のデータのインデックス」 となります。
※WORD型はunsigned shortの再定義になります。 |
|||||||||||||
取り扱い例 | 必要なインストルメントバッグを読み込んで使用します。 | |||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。 | |||||||||||||
備考 |
imodチャンク
概要 | SoundFontファイル内のインストルメントレベルにおけるすべてのモジュレータの情報が入ったチャンクです。 モジュレータとは「MIDI CCで音量を操作する」「ピッチベンドで音程(ピッチ)を操作する」といった設定情報になります。 |
||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 10Byte×(モジュレータ数+1) | ||||||||||||||||||||
データ部 | データ部には下記 構造体がモジュレータ数+1個分入ります。 imodチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。 実装されているソフトウェアも少ないようですので詳細については割愛します。
※WORD型はunsigned shortの再定義になります。 |
||||||||||||||||||||||
取り扱い例 | 必要なモジュレータを読み込んで使用します。 | ||||||||||||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが10Byteの倍数でない場合はファイルの読み込みを拒否します。 | ||||||||||||||||||||||
備考 | Soundfont規格バージョン 2.0ではこのチャンクは定義されておらず、終端データのみになります。 |
igenチャンク
概要 | SoundFontファイル内のインストルメントレベルにおけるすべてのジェネレータの情報が入ったチャンクです。 ジェネレータとはマッピングや音声波形データの開始・終了位置や音量やフィルタのエンベロープ、割り当てサンプル(音声波形)等の設定情報になります。 |
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 4Byte×(ジェネレータ数+1) | |||||||||||
データ部 | データ部には下記 構造体がジェネレータ数+1個分入ります。 igenチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。 genOperで変更が必要なパラメータを指定し、genAmountで変更する量を指定します。 genOperで使用されるジェネレータIDの詳細はこちらに記載しております。 → SoundFontのジェネレータについて
※WORD型はunsigned shortの再定義になります。 |
|||||||||||||
ジェネレータIDルール | ゾーン内のジェネレータIDには下記のルールがあります。
|
|||||||||||||
取り扱い例 | 必要なジェネレータを読み込んで使用します。 | |||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。 | |||||||||||||
備考 |
shdrチャンク
概要 | SoundFontファイル内のすべてのサンプル(音声波形)のヘッダ情報が入ったチャンクです。 実際の音声波形データはsmplチャンクの内容になります。 |
|||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
必須・任意 | 必須 | チャンクサイズ | 46Byte×(サンプル数+1) | |||||||||||||||||||||||||||||||||||
データ部 | データ部には下記 構造体がサンプル数+1個分入ります。 shdrチャンク最後のデータは終端データで必ず name…「EOI」 bagIndex…「ibagチャンクの最後のデータ(終端データ)のインデックス」 となります。
※BYTE型はunsigned char、WORD型はunsigned short、DWORDはunsigned longの再定義になります。 |
|||||||||||||||||||||||||||||||||||||
取り扱い例 | 必要なサンプルを読み込んで使用します。 | |||||||||||||||||||||||||||||||||||||
エラー処理 (仕様書内容) |
このチャンクがない場合やサイズが22Byteの倍数でない場合はファイルの読み込みを拒否します。 | |||||||||||||||||||||||||||||||||||||
備考 |
最後に
SoundFontのファイルフォーマットとそれぞれのチャンクについての説明は以上になります。
SoundFontを取り扱う上では音声波形チャンク(主にsmplチャンク)と音色情報チャンクの情報が重要となります。
次回はSoundFontの音色情報チャンクから音色情報を組み立てる際に特に重要となるジェネレータについての説明をいたします。
各説明のリンクはこちらにまとめております → SoundFontの読み込みと組み立て
質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
また、「この部分を詳しく」などの要望も掲示板やTwitterでいただければと思います。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp