SFZ音源を元サンプルから作る(例2:ピアノベロシティレイヤーを組む)

(2021.08.17執筆)


前回の記事では、簡易なオルゴール音源を元に.sfzを1から組み上げました。
今回は、音源を組むのに一番重要な「音の強弱」を司るベロシティ調整について。ピアノ音源の組み方のメモを記します。

ベロシティの強弱(大小)が流れるように調整

ピアノの場合、昨今の有料音源にもなると18段階とか24段階ベロシティレイヤーとか。すっごい容量食いの音源に化けてます。 それくらいピアノの音は強弱の加減が繊細で、キータッチでの音量だったり音質の変化が重要な音源です。

生楽器の音源を一から組むに辺り、小さな音から大きな音までを、どう自然な流れに組み上げるか?というのが音源制作の最も、最も重要な所でしょう。 ピアノの場合はベロシティレイヤーの調整が肝。

既に完成された、信頼のおけるピアノ音源を使うなら、基本そのままでOK。
しかしこの記事の目的は、音は良いが元々レイヤー数の少ない、入門者向けのサンプル音源を最大限まで活かすこと。
この経験は、ピアノだけでなく色んな打楽器、ギターやハープなどにも活用できると思います。
(メモリ消費が極小で済むというメリットも◎)

SFZ音源のベロシティ強弱について

まず前提知識。SFZ音源のベロシティカーブは2次曲線的に変化する仕組みです。ベロシティ値が大きくなるほど上昇率が緩やかに変化していきます。
ベロシティ音量変化の計算式は...

(-db)=20log((ベロシティ値*ベロシティ値)/(127*127))

。。。よくわからん。。。(' '*)


とまぁ、電卓アプリを叩いてみたら何となく目安の数値が出てきます。
v001=-84db
v032=-24db
v064=-12db
v127=-0db

sfz音源ベロシティ推移

グラフにすると2次曲線的に推移していくのが分かります。
これはamp_veltrack=100(初期値)とした場合のベロシティ変化を表しています。

もしこの振れ幅を少なくしたい場合、<global>にamp_veltrack=50を指定すると変化量が半分になるし、amp_veltrack=25にすると変化量は1/4です。


例)<global> amp_veltrack=50
ベロシティ1のノートは-42dbで再生
ベロシティ32のノートは-12dbで再生
ベロシティ64のノートは-6dbで再生
ベロシティ127のノートは-0dbで再生


例)<global> amp_veltrack=25
ベロシティ1のノートは-21dbで再生
ベロシティ32のノートは-6dbで再生
ベロシティ64のノートは-3dbで再生
ベロシティ127のノートは-0dbで再生


ちなみにamp_veltrack=0を指定すると、ベロシティによる音量変化は無くなります(ベロシティによる音量変化が必要ない楽器にこれを使います)

補足

このSFZ音源の仕組みは2000年の1桁台から開発されており、当時の音源は16bitで「ノーマライズ(-0db)された状態」で収録されたWAVが主流でした。

KontaktLibraryFactoryに含まれるVSL音源の中身を見て分かるとおり、弱い演奏サンプルも強い演奏サンプルも、16bitの音質劣化を最小に抑えるため全て最大音量のノーマライズが掛かったサンプルが用いられている。。。つまり初期(lv1)のSFZ音源は、演奏の強弱関わらず音量MAXで均一に揃った状態、からの組み立てを想定されてます。

現代の24bit音源(音量強弱がそのまま収録された状態)を最適化するには別の方法がありますが、とりあえず今回のベロシティ推移はレガシー音源組み立ての基本として抑えておくと良いかと思います。

実践例:Logic EXS24 SteinweyGrandPiano

では実践。昔からの付属音源で私の愛用してるLogicのSteinwayGrandPiano、ベロシティレイヤー4つ。今の音源と比較したらやや物足りない?

<サンプル確認>
V2(p)弱く


V3(mp)やや弱く


V4(mf)やや強く


V5(f)強く


サンプルはノーマライズ掛かってるのでデータ上では最大音量(-db)が揃った状態。 ここから、sfzでベロシティレイヤーを組むとどうなるか実践してみます。

《Logic9 Steinway Grand Piano 初期状態》

まず、Logicでの初期設定をSFZで再現します.



鳴らしてみたのが今回の動画です。

Logic上でのSteinwayPiano音源のレイヤーマップは。。

ベロシティ0~39でV2のサンプル
ベロシティ40~59でV3のサンプル
ベロシティ60~105でV4のサンプル
ベロシティ106~127でV5のサンプル

となっているので、これを鍵盤一個分だけSFZに記述してテスト再生してみました。

<記述例>
<global>
amp_veltrack=100 //初期値
ampeg_release=1


//V2(p)
<group> lovel=1 hivel=40
<region> key=68 //〜〜
<region> key=69 sample=Steinway V2 069.wav
<region> key=70 //〜〜

//V3(mp)
<group> lovel=41 hivel=59
<region> key=68 //〜〜
<region> key=69 sample=Steinway V3 069.wav
<region> key=70 //〜〜

//V4(mf)
<group> lovel=60 hivel=105
<region> key=68 //〜〜
<region> key=69 sample=Steinway V4 069.wav
<region> key=70 //〜〜

//V5(f)
<group> lovel=106 hivel=127
<region> key=68 //〜〜
<region> key=69 sample=Steinway V5 069.wav
<region> key=70 //〜〜

lovel=, hivel=,で再生させるベロシティ範囲を指定できます。
この方法が、レガシー音源(全てノーマライズが掛かった状態のサンプル)でベロシティレイヤーを組む基本形となるでしょう。


意外と簡単。。。?

...いや、音量の異なる複数サンプルを整理するのって難しいんですよ。 .sfz形式では音量を弄る設定だけでも、

volume
lovel, hivel(velocity)
amp_veltrack
amp_velcurve_数字

とあるので、レイヤー毎に適切な音量を設定するのは何も知らないと骨が折れます。
しかし、仕組みをある程度知っておくことで、最低限の記述でしっかりした土台ができる。
土台を築いて初めて、この後の仕上げが生きてくる感じです。


(仕上げ;各サンプルのPANやPitchのズレを均一にしたり等...)

ベロシティクロスフェードを施してみる

前の方法では完全にサンプルの領域が別れているため、未だ音の切り替わる境目が目立ちます。
↓これをベロシティクロスフェード(xfin_, xfout_)で記述すると、スムーズなサンプルの切り替わりができるようになります。

<記述例>
<global>
amp_veltrack=100 //初期値
ampeg_release=1
xf_velcurve=power //velocityクロスフェードモードの指定(gain or power)

//V2(p)
<group> xfout_lovel=36 xfout_hivel=64
<region> key=68 //〜〜
<region> key=69 sample=Steinway V2 069.wav
<region> key=70 //〜〜

//V3(mp)
<group> xfin_lovel=36 xfin_hivel=64 xfout_lovel=64 xfout_hivel=96
<region> key=68 //〜〜
<region> key=69 sample=Steinway V3 069.wav
<region> key=70 //〜〜

//V4(mf)
<group> xfin_lovel=64 xfin_hivel=96 xfout_lovel=96 xfout_hivel=120
<region> key=68 //〜〜
<region> key=69 sample=Steinway V4 069.wav
<region> key=70 //〜〜

//V5(f)
<group> xfin_lovel=96 xfin_hivel=120
<region> key=68 //〜〜
<region> key=69 sample=Steinway V5 069.wav
<region> key=70 //〜〜

《クロスフェードカスタム後のSteinway Grand Piano》




どうでしょう、一つ前のと比べると好みが分かれそうな。。
境目がスムーズになった分、音の位相がぼんやり打ち消し合ってる部分もありそうです。(一長一短)
まぁ、クロスフェードを用いるとダイナミクスの推移はスムーズになる。というのは覚えておいて良いと思います。


ベロシティクロスフェードはxfin_lovel、xfin_hivel、xfout_lovel、xfout_hivel、をグループ毎に記述するとOKです。
今回の記述の場合は

ベロシティ0~36でV2のサンプル
ベロシティ36~63の間でV2とV3のクロスフェード
ベロシティ64~96の間でV3とV4のクロスフェード
ベロシティ96~120の間でV4とV5のクロスフェード

繊細なタッチでピアノを表現することを想定して、弱いベロシティの領域を広めに確保してる。

クロスフェードの被せ加減も、今回の例ではがっつり行ってますが、サンプルの構成とか、自分の感覚で色々試してみると良いです。

補足1:xf_velcurveについて

<global>
xf_velcurve=gain
<global>
xf_velcurve=power
「xf_velcurve」ベロシティクロスフェードのバランスをどうするかのパラメータ。 "gain"か"power"のいずれかなんですが、どっちが良いかは実際に試してみてください。

私の体感だと、最近の音源であればgainで安定。

一昔前の、弱い演奏サンプルにもノーマライズが掛かっている音源だとpowerなのかな?って感じでした。 sfz(Lv1)の規格だと、サンプルを大きく鳴らすのにvolumeで+6dbまでの制限が掛かっているんですよね。下は-144dbまで落とせる謎。 だから、昔は小さなサンプル音でも最大限の音量で.wavに収録してた。というのが何となく見えてきます。

補足2:ペダル(cc64)でのサンプル切り替えについて

Logicのsteinwayは、ペダルON時のサンプルが別で用意されてます。locc64=0 hicc64=63など使って以下のように書くと、ノートオン時のペダルCC64の位置で再生されるサンプルが切り替わります。
<group> //Pedalなしのサンプル
locc64=0 hicc64=63
<region> //・・・
<region> lokey=59 pitch_keycenter=60 hikey=61 sample=Steinway V2 060.wav
<region> //・・・

<group> //Pedalを踏んだ状態のサンプル
locc64=64 hicc64=127
<region> //〜省略
<region> lokey=59 pitch_keycenter=60 hikey=61 sample=Stw ped v1 060.wav
<region> //続く〜


加えてハーフペダル。ペダルの踏み加減による響き具合を調整する場合...
<global>
ampeg_releasecc64=5.5 //数字は秒単位

この記述は、ペダルの踏み加減でリリースタイムの増減が効くようにになります。
ペダルをゆっくり放した時の演奏のニュアンスが再現できると思います。

<global>
ampeg_release=1
ampeg_releasecc64=5.5 //疑似ハーフペダル、ペダルを踏むほどリリースを長めに
xf_velcurve=power

<group> //Pedalなしのサンプル
locc64=0 hicc64=59
<region> //・・・
<region> lokey=59 pitch_keycenter=60 hikey=61 sample=Steinway V2 060.wav
<region> //・・・

<group> //Pedalを踏んだ状態のサンプル
locc64=64 hicc64=127
<region> //〜省略
<region> lokey=59 pitch_keycenter=60 hikey=61 sample=Stw ped v1 060.wav
<region> //続く〜

補足3:FilterやEQで高音域の調整

クロスフェードに並行して、ベロシティが上がる毎にEQの高域を増やしたり、ローパスFilterのカットオフ値を上げたりといったのも効果的です。

サンプルコード

<group>
//filter
fil_type=lpf_1p
cutoff=14400
fil_veltrack=2400

//EQ
eq3_freq=6400
eq3_bw=0.71
eq3_vel2gain=4.8

必要に応じて、各グループにFilterもしくはEQの設定をしてあげます。 コードの意味は、ベロシティが低いほど音の高音域を下げる(カットする)。強く弾くほど、高音域を少し強調させるといったニュアンスです。

すると、ベロシティ推移がこのように立体的に鳴ります。

FilterやEQも踏まえた調整後



FilterやEQの調整前(クロスフェードのみ差分)



前回のと聴き比べると、平坦な感じが何となく変わってるのが分かる。


sfz音源

各グループのEQやフィルターの周波数帯をどの辺りにするかは、ReaEQなどのプラグインを挿して波形を確認しながら調整すると吉です。

なお、こういう見えないエフェクトは設定してるとやりすぎることが在る、後日の見直しで控えめにすると調度いいかも。

まとめ

sfz音源、突き詰めるほど柔軟な音のカスタマイズが出来る感じです。叩いたり弾いたりなど単純な奏法であれば、SFZ.Lv1(基本の設定項目)だけでも十分に実用範囲です。


次 ⇒ sfz音源制作・ダイナミクスレイヤーでCC11の強弱を設定する

SFZ音源・カスタマイズ設定項目

  1. SFZ-VSTi on Linux ⇒ サウンドフォント専用サンプラーの導入
  2. (例1:オルゴール音源を一から作る)
  3. (例2:ピアノ編・ベロシティレイヤー)
  4. (例3:ストリングス編・ダイナミクスレイヤー)