SoundFontの取り扱い02 – SoundFontのフォーマット

はじめに

複数回にわたって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 major SoundFont規格のメジャーバージョンの値
WORD minor SoundFont規格のメジャーバージョンの値

※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 major SoundFont規格のメジャーバージョンの値
WORD minor SoundFont規格のメジャーバージョンの値

※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」)

変数名 意味
char name プリセットの名前。終端文字(\0)含め20文字の文字列。
WORD presetno MIDIプリセット番号。
WORD bank MIDIバンク番号
WORD bagIndex pbagチャンクのインデックス
DWORD library 将来的な拡張のために用意された変数。未使用で値は常に「0」。
DWORD genre 将来的な拡張のために用意された変数。未使用で値は常に「0」。
DWORD morph 将来的な拡張のために用意された変数。未使用で値は常に「0」。

※WORD型はunsigned short、DWORDはunsigned longの再定義になります。

取り扱い例 必要なプリセットを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合、サイズが38Byteの倍数でない場合、2個以下の場合はファイルの読み込みを拒否します。
備考 bagIndexの値はプリセット順に必ず増加します。

pbagチャンク

概要 SoundFontファイル内のプリセットレベルにおけるすべてのバッグ情報が入ったチャンクです。
バッグはモジュレータとジェネレータをひとまとめにするためのもので、バッグ・モジュレータ・ジェネレータのかたまりをゾーンと言います。
具体的に「どのパラメータをどうするか?」の情報はpgenチャンクとpmodチャンクに含まれています。
必須・任意 必須 チャンクサイズ 4Byte×(プリセットバッグ数+1)
データ部 データ部には下記 構造体がプリセットバッグ数+1個分入ります。
pbagチャンク最後のデータは終端データで必ず
  modIndex…「pmodチャンクの最後のデータのインデックス」
  genIndex…「pgenチャンクの最後のデータのインデックス」
となります。

変数名 意味
WORD genIndex pgenチャンクのインデックス
WORD modIndex pmodチャンクのインデックス

※WORD型はunsigned shortの再定義になります。

取り扱い例 必要なプリセットバッグを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。
備考

pmodチャンク

概要 SoundFontファイル内のプリセットレベルにおけるすべてのモジュレータの情報が入ったチャンクです。
モジュレータとは「MIDI CCで音量を操作する」「ピッチベンドで音程(ピッチ)を操作する」といった設定情報になります。
必須・任意 必須 チャンクサイズ 10Byte×(モジュレータ数+1)
データ部 データ部には下記 構造体がモジュレータ数+1個分入ります。
pmodチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。
実装されているソフトウェアも少ないようですので詳細については割愛します。

変数名 意味
WORD srcOper モジュレータの元となる入力ソース。
フラグ形式でMIDI CCやピッチベンドなどを指定する。
WORD destOper 入力ソースで操作するジェネレータID
short modAmount 操作するジェネレータ量
WORD amtSrcOper モジュレータの元となる入力ソース。
フラグ形式でMIDI CCやピッチベンドなどを指定する。
WORD modTransOper 変化量は線形か?曲線か?

※WORD型はunsigned shortの再定義になります。

取り扱い例 必要なモジュレータを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが10Byteの倍数でない場合はファイルの読み込みを拒否します。
備考 Soundfont規格バージョン 2.0ではこのチャンクは定義されておらず、終端データのみになります。

pgenチャンク

概要 SoundFontファイル内のプリセットレベルにおけるすべてのジェネレータの情報が入ったチャンクです。
ジェネレータとはマッピングや音量やフィルタのエンベロープ、割り当てインストルメント(楽器)等の設定情報になります。
必須・任意 必須 チャンクサイズ 4Byte×(ジェネレータ数+1)
データ部 データ部には下記 構造体がジェネレータ数+1個分入ります。
pgenチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。
genOperで変更が必要なパラメータを指定し、genAmountで変更する量を指定します。
genOperで使用されるジェネレータIDの詳細はこちらに記載しております。 → SoundFontのジェネレータについて

変数名 意味
WORD genOper 変更するパラメータ(音量やフィルタのエンベロープ等)の番号(ジェネレータID)
WORD genAmount パラメータを変更する量

※WORD型はunsigned shortの再定義になります。

ジェネレータIDルール ゾーン内のジェネレータIDには下記のルールがあります。

  • ゾーン内には変更のあるジェネレータのみが保存されている。
  • keyRangeジェネレータ(genOper=43)がある場合、必ずゾーンの最初になります。
  • velRangeジェネレータ(genOper=44)がある場合、必ずkeyRangeの次になります。keyRangeがない場合はゾーンの最初になります。
  • instrumentジェネレータ(genOper=41)がある場合、必ずゾーンの最後になります。また、instrumentジェネレータがない場合、グローバルゾーンとなります。
  • 一部のジェネレータは使用されません。
取り扱い例 必要なジェネレータを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。
備考

instチャンク

概要 SoundFontファイル内のすべてのインストルメント(楽器)のヘッダ情報が入ったチャンクです。
サンプル(音声波形)のマッピング情報やパラメータ、割り当てサンプル(音声波形)等の情報はibagチャンク、imodチャンク、igenチャンクに含まれています。
必須・任意 必須 チャンクサイズ 22Byte×(インストルメント数+1)
データ部 データ部には下記 構造体がインストルメント数+1個分入ります。
instチャンク最後のデータは終端データで必ず
  name…「EOP」
  bagIndex…「ibagチャンクの最後のデータ(終端データ)のインデックス」
となります。

変数名 意味
char name インストルメントの名前。終端文字(\0)含め20文字の文字列。
WORD bagIndex ibagチャンクのインデックス

※WORD型はunsigned shortの再定義になります。

取り扱い例 必要なインストルメントを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが22Byteの倍数でない場合はファイルの読み込みを拒否します。
備考

ibagチャンク

概要 SoundFontファイル内のインストルメントレベルにおけるすべてのバッグ情報が入ったチャンクです。
バッグはモジュレータとジェネレータをひとまとめにするためのもので、バッグ・モジュレータ・ジェネレータのかたまりをゾーンと言います。
具体的に「どのパラメータをどうするか?」の情報はigenチャンクとimodチャンクに含まれています。
必須・任意 必須 チャンクサイズ 4Byte×(インストルメントバッグ数+1)
データ部 データ部には下記 構造体がインストルメントバッグ数+1個分入ります。
ibagチャンク最後のデータは終端データで必ず
  genIndex…「igenチャンクの最後のデータのインデックス」
  modIndex…「imodチャンクの最後のデータのインデックス」
となります。

変数名 意味
WORD genIndex igenチャンクのインデックス
WORD modIndex imodチャンクのインデックス

※WORD型はunsigned shortの再定義になります。

取り扱い例 必要なインストルメントバッグを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。
備考

imodチャンク

概要 SoundFontファイル内のインストルメントレベルにおけるすべてのモジュレータの情報が入ったチャンクです。
モジュレータとは「MIDI CCで音量を操作する」「ピッチベンドで音程(ピッチ)を操作する」といった設定情報になります。
必須・任意 必須 チャンクサイズ 10Byte×(モジュレータ数+1)
データ部 データ部には下記 構造体がモジュレータ数+1個分入ります。
imodチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。
実装されているソフトウェアも少ないようですので詳細については割愛します。

変数名 意味
WORD srcOper モジュレータの元となる入力ソース。
フラグ形式でMIDI CCやピッチベンドなどを指定する。
WORD destOper 入力ソースで操作するジェネレータID
short modAmount 操作するジェネレータ量
WORD amtSrcOper モジュレータの元となる入力ソース。
フラグ形式でMIDI CCやピッチベンドなどを指定する。
WORD modTransOper 変化量は線形か?曲線か?

※WORD型はunsigned shortの再定義になります。

取り扱い例 必要なモジュレータを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが10Byteの倍数でない場合はファイルの読み込みを拒否します。
備考 Soundfont規格バージョン 2.0ではこのチャンクは定義されておらず、終端データのみになります。

igenチャンク

概要 SoundFontファイル内のインストルメントレベルにおけるすべてのジェネレータの情報が入ったチャンクです。
ジェネレータとはマッピングや音声波形データの開始・終了位置や音量やフィルタのエンベロープ、割り当てサンプル(音声波形)等の設定情報になります。
必須・任意 必須 チャンクサイズ 4Byte×(ジェネレータ数+1)
データ部 データ部には下記 構造体がジェネレータ数+1個分入ります。
igenチャンク最後のデータは終端データで構造体の変数の値はすべて「0」となります。
genOperで変更が必要なパラメータを指定し、genAmountで変更する量を指定します。
genOperで使用されるジェネレータIDの詳細はこちらに記載しております。 → SoundFontのジェネレータについて

変数名 意味
WORD genOper 変更するパラメータ(音量やフィルタのエンベロープ等)の番号(ジェネレータID)
WORD genAmount パラメータを変更する量

※WORD型はunsigned shortの再定義になります。

ジェネレータIDルール ゾーン内のジェネレータIDには下記のルールがあります。

  • ゾーン内には変更のあるジェネレータのみが保存されている。
  • keyRangeジェネレータ(genOper=43)がある場合、必ずゾーンの最初になります。
  • velRangeジェネレータ(genOper=44)がある場合、必ずkeyRangeの次になります。keyRangeがない場合はゾーンの最初になります。
  • sampleIDジェネレータ(genOper=53)がある場合、必ずゾーンの最後になります。また、sampleIDジェネレータがない場合。グローバルゾーンとなります。
取り扱い例 必要なジェネレータを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが4Byteの倍数でない場合はファイルの読み込みを拒否します。
備考

shdrチャンク

概要 SoundFontファイル内のすべてのサンプル(音声波形)のヘッダ情報が入ったチャンクです。
実際の音声波形データはsmplチャンクの内容になります。
必須・任意 必須 チャンクサイズ 46Byte×(サンプル数+1)
データ部 データ部には下記 構造体がサンプル数+1個分入ります。
shdrチャンク最後のデータは終端データで必ず
  name…「EOI」
  bagIndex…「ibagチャンクの最後のデータ(終端データ)のインデックス」
となります。

変数名 意味
char name サンプルの名前。終端文字(\0)含め20文字の文字列
DWORD start 音声波形データの開始位置(単位:サンプル)
DWORD end 音声波形データの終了位置(単位:サンプル)
DWORD loopstart 音声波形データのループ開始位置(単位:サンプル)
DWORD loopend 音声波形データのループ終了位置(単位:サンプル)
DWORD sampleRate 音声波形データのサンプリングレート
BYTE originalKey 音声波形データのオリジナルの音程
60の時、音声波形はC4(中央のド、261.62Hz)の音程で録音された波形であることを示す
char correction オリジナルの音程に対しての補正(単位cent)
WORD sampleLink 音声波形データのタイプ(下記)が1の場合…0、2(4)の場合…左(右)サンプルのSFSampleHeaderへのインデックス
WORD type 音声波形データのタイプ
1…モノラル、2…右サンプル、4…左サンプル、8…リンクサンプル(未定義)

※BYTE型はunsigned char、WORD型はunsigned short、DWORDはunsigned longの再定義になります。

取り扱い例 必要なサンプルを読み込んで使用します。
エラー処理
(仕様書内容)
このチャンクがない場合やサイズが22Byteの倍数でない場合はファイルの読み込みを拒否します。
備考

最後に

SoundFontのファイルフォーマットとそれぞれのチャンクについての説明は以上になります。

SoundFontを取り扱う上では音声波形チャンク(主にsmplチャンク)と音色情報チャンクの情報が重要となります。

次回はSoundFontの音色情報チャンクから音色情報を組み立てる際に特に重要となるジェネレータについての説明をいたします。

各説明のリンクはこちらにまとめております → SoundFontの読み込みと組み立て

質問はコメント欄や掲示板Twitterでいただけばとおもいます。
また、「この部分を詳しく」などの要望も掲示板Twitterでいただければと思います。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


コメントを残す