はじめに
複数回にわたってSoundFontファイル(.sf2ファイル)を読み込んでシンセサイザーなどに使えるようにパラメーターを組み立てる方法を説明しています。
ここではSoundFontの音色情報を組み立てる際に重要となるジェネレータについて説明します。
各説明のリンクはこちらにまとめております → SoundFontの読み込みと組み立て
サンプルコードなども上記のリンクにあります。
SoundFontの音色の構成について
ジェネレータを説明する前にSounfFontの音色構成について説明します。
SoundFontでは音色はプリセットとして扱われます。
プリセット(音色)は1つ以上のインストルメント(楽器)で構成されています。
インストルメント(楽器)のパラメータを調整してMIDIのキー(ノートNo.)とベロシティにマッピングすることで、単純な楽器の再現だけでなく演奏上の表現を広げることができるようにしています。
例として下記のようなインストルメント(楽器)の組み合わせがあります。
インストルメント(楽器)は1つ以上のサンプル(音声波形)で構成されます。
サンプル(音声波形)のパラメータを調整してMIDIのキー(ノートNo.)とベロシティにマッピングすることで、よりリアルな楽器の再現ができるようにしています。

プリセット(音色)、インストルメント(楽器)、サンプル(音声波形)の関係をまとめると下記のようになります。
ジェネレータとは
ジェネレータとはマッピング情報(キーとベロシティ)やパラメータ、割り当てインストルメント(サンプル)をひとまとめにした設定情報になります。
マッピング情報(キーとベロシティ)やパラメータ、割り当てインストルメント(サンプル)等をオペレータといい、ジェネレータには下記のオペレータがあります。
各オペレータの扱いや組み立ては別途 記載いたしますが、今後の説明で重要なオペレータのkeyRange(No.43)、velRange(No.44)、instrument(No.41)、sampleID(No.53)は覚えておいてください。
| No | オペレータ名 | カテゴリ | 概要 |
|---|---|---|---|
| 0 | startAddrsOffset | サンプル | サンプルヘッダの音声波形データ開始位置に加算されるオフセット(下位16bit) |
| 1 | endAddrsOffset | サンプル | サンプルヘッダの音声波形データ終了位置に加算されるオフセット(下位16bit) |
| 2 | startloopAddrsOffset | サンプル | サンプルヘッダの音声波形データループ開始位置に加算されるオフセット(下位16bit) |
| 3 | endloopAddrsOffset | サンプル | サンプルヘッダの音声波形データループ終了位置に加算されるオフセット(下位16bit) |
| 4 | startAddrsCoarseOffset | サンプル | サンプルヘッダの音声波形データ開始位置に加算されるオフセット(上位16bit) |
| 5 | modLfoToPitch | LFO | LFOによるピッチの揺れ幅 |
| 6 | vibLfoToPitch | ホイール | モジュレーションホイール用LFOからピッチに対しての影響量 |
| 7 | modEnvToPitch | フィルタ | フィルタ・ピッチ用エンベロープからピッチに対しての影響量 |
| 8 | initialFilterFc | フィルタ | フィルタのカットオフ周波数 |
| 9 | initialFilterQ | フィルタ | フィルターのQ値(レゾナンス) |
| 10 | modLfoToFilterFc | LFO | LFOによるフィルターカットオフ周波数の揺れ幅 |
| 11 | modEnvToFilterFc | フィルタ | フィルタ・ピッチ用エンベロープからフィルターカットオフに対しての影響量 |
| 12 | endAddrsCoarseOffset | サンプル | サンプルヘッダの音声波形データ終了位置に加算されるオフセット(上位16bit) |
| 13 | modLfoToVolume | LFO | LFOによるボリュームの揺れ幅 |
| 14 | unused1 | 未使用 | 未使用 |
| 15 | chorusEffectsSend | エフェクト | コーラスエフェクトのセンドレベル |
| 16 | reverbEffectsSend | エフェクト | リバーブエフェクトのセンドレベル |
| 17 | pan | アンプ | パンの位置 |
| 18 | unused2 | 未使用 | 未使用 |
| 19 | unused3 | 未使用 | 未使用 |
| 20 | unused4 | 未使用 | 未使用 |
| 21 | delayModLFO | LFO | LFOの揺れが始まるまでの時間 |
| 22 | freqModLFO | LFO | LFOの揺れの周期 |
| 23 | delayVibLFO | ホイール | ホイールの揺れが始まるまでの時間 |
| 24 | freqVibLFO | ホイール | ホイールの揺れの周期 |
| 25 | delayModEnv | フィルタ | フィルタ・ピッチ用エンベロープのディレイ(アタックが始まるまでの時間) |
| 26 | attackModEnv | フィルタ | フィルタ・ピッチ用エンベロープのアタック時間 |
| 27 | holdModEnv | フィルタ | フィルタ・ピッチ用エンベロープのホールド時間 (アタックが終わってからディケイが始まるまでの時間) |
| 28 | decayModEnv | フィルタ | フィルタ・ピッチ用エンベロープのディケイ時間 |
| 29 | sustainModEnv | フィルタ | フィルタ・ピッチ用エンベロープのサステイン量 |
| 30 | releaseModEnv | フィルタ | フィルタ・ピッチ用エンベロープのリリース時間 |
| 31 | keynumToModEnvHold | フィルタ | キー(ノートNo)によるフィルタ・ピッチ用エンベロープのホールド時間への影響 |
| 32 | keynumToModEnvDecay | フィルタ | キー(ノートNo)によるフィルタ・ピッチ用エンベロープのディケイ時間への影響 |
| 33 | delayVolEnv | アンプ | アンプ用エンベロープのディレイ(アタックが始まるまでの時間) |
| 34 | attackVolEnv | アンプ | アンプ用エンベロープのアタック時間 |
| 35 | holdVolEnv | アンプ | アンプ用エンベロープのホールド時間 (アタックが終わってからディケイが始まるまでの時間) |
| 36 | decayVolEnv | アンプ | アンプ用エンベロープのディケイ時間 |
| 37 | sustainVolEnv | アンプ | アンプ用エンベロープのサステイン量 |
| 38 | releaseVolEnv | アンプ | アンプ用エンベロープのリリース時間 |
| 39 | keynumToVolEnvHold | アンプ | キー(ノートNo)によるアンプ用エンベロープのホールド時間への影響 |
| 40 | keynumToVolEnvDecay | アンプ | キー(ノートNo)によるアンプ用エンベロープのディケイ時間への影響 |
| 41 | instrument | その他 | 割り当てるインストルメント(楽器) |
| 42 | reserved1 | 未使用 | 未使用 |
| 43 | keyRange | その他 | マッピングするキー(ノートNo)の範囲 |
| 44 | velRange | その他 | マッピングするベロシティの範囲 |
| 45 | startloopAddrsCoarseOffset | サンプル | サンプルヘッダの音声波形データループ開始位置に加算されるオフセット(上位16bit) |
| 46 | keynum | その他 | どのキー(ノートNo)でも強制的に指定したキー(ノートNo)に変更する |
| 47 | velocity | その他 | どのベロシティでも強制的に指定したベロシティに変更する |
| 48 | initialAttenuation | アンプ | 調整する音量 |
| 49 | reserved2 | 未使用 | 未使用 |
| 50 | endloopAddrsCoarseOffset | サンプル | サンプルヘッダの音声波形データループ終了位置に加算されるオフセット(上位16bit) |
| 51 | coarseTune | サンプル | 半音単位での音程の調整 |
| 52 | fineTune | サンプル | cent単位での音程の調整 |
| 53 | sampleID | その他 | 割り当てるサンプル(音声波形) |
| 54 | sampleModes | その他 | サンプル(音声波形)をループさせるか等のフラグ |
| 55 | reserved3 | 未使用 | 未使用 |
| 56 | scaleTuning | その他 | キー(ノートNo)が+1されるごとに音程を何centあげるかの音階情報 |
| 57 | exclusiveClass | その他 | 同時に音を鳴らさないようにするための排他ID(ハイハットのOpen、Close等に使用) |
| 58 | overridingRootKey | サンプル | サンプル(音声波形)の音程の上書き情報 |
| 59 | unused5 | 未使用 | 未使用 |
| 60 | endOper | その他 | 最後を示すオペレータ |
ジェネレータのとる範囲(最大値・最小値・デフォルト値)
ジェネレータの各オペレータの値(ジェネレータ値)は16bit整数型(short型)の値で、それぞれの用途によって最大値・最小値・デフォルト値が異なります。
各オペレータの値(ジェネレータ値)はそのままソフトウェア音源等のパラメータ値としては使えないため用途に合わせて変換が必要になります。
下記に各オペレータとそれぞれのジェネレータ値、パラメータ値、ジェネレータ値からパラメータ値への変換方法を記載いたします。
| No | オペレータ名 | ジェネレータ値 | 実際のパラメータ値 | 変換式 | |||
|---|---|---|---|---|---|---|---|
| 最小値 ~最大値 |
デフォルト値 | 最小値 ~最大値 |
デフォルト値 | 単位 | |||
| 0 | startAddrsOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | sample | パラメータ値 = ジェネレータ値 |
| 1 | endAddrsOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | sample | パラメータ値 = ジェネレータ値 |
| 2 | startloopAddrsOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | sample | パラメータ値 = ジェネレータ値 |
| 3 | endloopAddrsOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | sample | パラメータ値 = ジェネレータ値 |
| 4 | startAddrsCoarseOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | 32k sample |
パラメータ値 = ジェネレータ値 |
| 5 | modLfoToPitch | -12,000 ~12,000 |
0 | -120 ~120 |
0 | 半音 | パラメータ値 = ジェネレータ値 / 100 |
| 6 | vibLfoToPitch | -12,000 ~12,000 |
0 | -120 ~120 |
0 | 半音 | パラメータ値 = ジェネレータ値 / 100 |
| 7 | modEnvToPitch | -12,000 ~12,000 |
0 | -120 ~120 |
0 | 半音 | パラメータ値 = ジェネレータ値 / 100 |
| 8 | initialFilterFc | 1,500 ~13,500 |
13,500 | 19.5 ~19,912.7 |
19,912.7 | Hz | パラメータ値 = 8.176 * pow(2, ジェネレータ値 / 1200) |
| 9 | initialFilterQ | 0 ~960 |
0 | 0 ~96 |
0 | dB | パラメータ値 = ジェネレータ値 / 10 |
| 10 | modLfoToFilterFc | -12,000 ~12,000 |
0 | -120 ~120 |
0 | 半音 | パラメータ値 = ジェネレータ値 / 100 |
| 11 | modEnvToFilterFc | -12,000 ~12,000 |
0 | -120 ~120 |
0 | 半音 | パラメータ値 = ジェネレータ値 / 100 |
| 12 | endAddrsCoarseOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | 32k sample |
パラメータ値 = ジェネレータ値 |
| 13 | modLfoToVolume | -960 ~960 |
0 | -96 ~96 |
0 | dB | パラメータ値 = ジェネレータ値 / 10 |
| 14 | unused1 | – | – | – | – | – | |
| 15 | chorusEffectsSend | 0 ~1,000 |
0 | 0 ~100 |
0 | % | パラメータ値 = ジェネレータ値 / 10 |
| 16 | reverbEffectsSend | 0 ~1,000 |
0 | 0 ~100 |
0 | % | パラメータ値 = ジェネレータ値 / 10 |
| 17 | pan | -500 ~500 |
0 | -50 ~50 |
0 | パラメータ値 = ジェネレータ値 / 10 |
|
| 18 | unused2 | – | – | – | – | – | |
| 19 | unused3 | – | – | – | – | – | |
| 20 | unused4 | – | – | – | – | – | |
| 21 | delayModLFO | -12,000 ~5,000 |
-12,000 | 0.001 ~17.959 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 22 | freqModLFO | -16,000 ~4,500 |
0 | 0.100 ~110.100 |
8.200 | Hz | パラメータ値 = 8.176 * pow(2, ジェネレータ値 / 1200) |
| 23 | delayVibLFO | -12,000 ~5,000 |
-12,000 | 0.001 ~17.959 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 24 | freqVibLFO | -16,000 ~4,500 |
0 | 0.100 ~110.100 |
8.200 | Hz | パラメータ値 = 8.176 * pow(2, ジェネレータ値 / 1200) |
| 25 | delayModEnv | -12,000 ~5,000 |
-12,000 | 0.001 ~17.959 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 26 | attackModEnv | -12,000 ~8,000 |
-12,000 | 0.001 ~101.594 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 27 | holdModEnv | -12,000 ~5,000 |
-12,000 | 0.001 ~17.959 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 28 | decayModEnv | -12,000 ~8,000 |
-12,000 | 0.001 ~101.594 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 29 | sustainModEnv | 0 ~1,000 |
0 | 0 ~100 |
0 | % | パラメータ値 = ジェネレータ値 / 10 |
| 30 | releaseModEnv | -12,000 ~8,000 |
-12,000 | 0.001 ~101.594 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 31 | keynumToModEnvHold | -1,200 ~1,200 |
0 | -12 ~12 |
0 | 半音/キー | パラメータ値 = ジェネレータ値 / 100 |
| 32 | keynumToModEnvDecay | -1,200 ~1,200 |
0 | -12 ~12 |
0 | 半音/キー | パラメータ値 = ジェネレータ値 / 100 |
| 33 | delayVolEnv | -12,000 ~5,000 |
-12,000 | 0.001 ~17.959 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 34 | attackVolEnv | -12,000 ~8,000 |
-12,000 | 0.001 ~101.594 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 35 | holdVolEnv | -12,000 ~5,000 |
-12,000 | 0.001 ~17.959 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 36 | decayVolEnv | -12,000 ~8,000 |
-12,000 | 0.001 ~101.594 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 37 | sustainVolEnv | 0 ~1,440 |
0 | 0 ~144 |
0 | dB | パラメータ値 = ジェネレータ値 / 10 |
| 38 | releaseVolEnv | -12,000 ~8,000 |
-12,000 | 0.001 ~101.594 |
0.001 | 秒 | パラメータ値 = pow(2, ジェネレータ値 / 1200) |
| 39 | keynumToVolEnvHold | -1,200 ~1,200 |
0 | -12 ~12 |
0 | 半音/キー | パラメータ値 = ジェネレータ値 / 100 |
| 40 | keynumToVolEnvDecay | -1,200 ~1,200 |
0 | -12 ~12 |
0 | 半音/キー | パラメータ値 = ジェネレータ値 / 100 |
| 41 | instrument | – | – | – | – | – | |
| 42 | reserved1 | – | – | – | – | – | |
| 43 | keyRange | – | 0~127 | – | 0~127 | – | パラメータ最小値 = ジェネレータ値 & 0x00FF パラメータ最大値 = ジェネレータ値 >> 8 |
| 44 | velRange | – | 0~127 | – | 0~127 | – | パラメータ最小値 = ジェネレータ値 & 0x00FF パラメータ最大値 = ジェネレータ値 >> 8 |
| 45 | startloopAddrsCoarseOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | 32k sample |
パラメータ値 = ジェネレータ値 |
| 46 | keynum | 0 ~127 |
– | 0 ~127 |
– | – | パラメータ値 = ジェネレータ値 |
| 47 | velocity | 0 ~127 |
– | 0 ~127 |
– | – | パラメータ値 = ジェネレータ値 |
| 48 | initialAttenuation | 0 ~1,440 |
0 | 0 ~144 |
0 | dB | パラメータ値 = ジェネレータ値 / 10 |
| 49 | reserved2 | – | – | – | – | – | |
| 50 | endloopAddrsCoarseOffset | 0 ~32,767 |
0 | 0 ~32,767 |
0 | 32k sample |
パラメータ値 = ジェネレータ値 |
| 51 | coarseTune | -120 ~120 |
0 | -12 ~12 |
0 | 半音 | パラメータ値 = ジェネレータ値 / 10 |
| 52 | fineTune | -99 ~99 |
0 | -99 ~99 |
0 | cent | パラメータ値 = ジェネレータ値 |
| 53 | sampleID | – | – | – | – | – | |
| 54 | sampleModes | 0 ~3 |
0 | 0 ~3 |
0 | フラグ値 | パラメータ値 = ジェネレータ値 |
| 55 | reserved3 | – | – | – | – | – | |
| 56 | scaleTuning | 0 ~1,200 |
100 | 0 ~1,200 |
100 | 半音/キー | パラメータ値 = ジェネレータ値 |
| 57 | exclusiveClass | 0 ~127 |
– | 0 ~127 |
– | パラメータ値 = ジェネレータ値 |
|
| 58 | overridingRootKey | 0 ~127 |
– | 0 ~127 |
– | パラメータ値 = ジェネレータ値 |
|
| 59 | unused5 | – | – | – | – | – | – |
| 60 | endOper | – | – | – | – | – | – |
ジェネレータのとる範囲の補足
ジェネレータのとる値についてはいくつか補足があります。
1つ目が、サンプルヘッダの音声波形データの開始・終了位置等を変更するオペレータです。
下記の○○Offsetと○○CoarseOffsetと名前のつくオペレータはペアになっており、2つ合わせて音声データの開始・終了位置等に影響します。
下位16bit用のオペレータだけでは開始・終了位置等を0.74秒(32,767/44,100sample)程度しか位置を変更することができず、制限が大きすぎるため上位16bit用のオペレータが追加されたのだと思われます。
- startAddrsOffset(下位16bit用)とstartAddrsCoarseOffset(上位16bit用)
- endAddrsOffset(下位16bit用)とendAddrsCoarseOffset(上位16bit用)
- startloopAddrsOffset(下位16bit用)とstartloopAddrsCoarseOffset(上位16bit用)
- endloopAddrsOffset(下位16bit用)とendloopAddrsCoarseOffset(上位16bit用)
2つ目は、panになります。
panはパラメータ値が0の時、パンが中心にありマイナス値になるほど左チャンネルよりに、プラス値になるほど右チャンネルよりになります。
- -50の時…左チャンネル:100%、右チャンネル:0%
- 0の時…左チャンネル:50%、右チャンネル:50%
- 50の時…左チャンネル:0%、右チャンネル:100%
3つ目はkeyRange、velRangeになります。
keyRange、velRangeはキー(ノートNo)とベロシティのマッピング情報になりますが、16bit整数型(short型)ではなく8bit整数型(char型)を2つ組み合わせた形となります。
下位8bitがマッピング範囲の最小値で上位8bitがマッピング範囲の最大値になります。
SoundFontファイルとジェネレータ
SoundFontファイル内のpgenチャンクとigenチャンクにジェネレータに関する情報はあります。
ただし、すべてのオペレータ情報がpgenチャンク・igenチャンクにあるわけではなく、変更するオペレータ情報のみがファイルに保存されています。
pgenチャンク・igenチャンクのデータは下記のSFGen構造体の配列になっており、genOperで示すオペレータに対してgenAmountの値を加算したり置き換えたりします。
|
1 2 3 4 5 |
struct SFGen // pmod,imodチャンク用の構造体 { WORD genOper; short genAmount; }; |
最後に
ジェネレータについての説明は以上となります。
ジェネレータや各オペレータの扱いや組み立ては別途 記載いたしますので、一旦は上記のようなオペレータがあることだけ覚えておいてください。
次回はSoundFontの音色と音色情報(Hydra)チャンクの関係性の説明をいたします。
各説明のリンクはこちらにまとめております → SoundFontの読み込みと組み立て
質問はコメント欄や掲示板、Twitterでいただけばとおもいます。
また、「この部分を詳しく」などの要望も掲示板やTwitterでいただければと思います。
■掲示板
■Twitterアカウント:@vstcpp URL:https://twitter.com/vstcpp

