SoundFontの取り扱い03 – SoundFontの音色とジェネレータについて

はじめに

複数回にわたって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の値を加算したり置き換えたりします。

最後に

ジェネレータについての説明は以上となります。
ジェネレータや各オペレータの扱いや組み立ては別途 記載いたしますので、一旦は上記のようなオペレータがあることだけ覚えておいてください。

次回はSoundFontの音色と音色情報(Hydra)チャンクの関係性の説明をいたします。

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

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

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


コメントを残す