Skip to content

物理モデル ​

内蔵シンセサイザーのエンジンの多くは、波形から出発してそれを加工します。一方、アコースティック系のエンジンは楽器そのものから出発します — ハンマーで叩かれる弦、リードに駆動される管、スロットを行き来する金属の舌、フォルマントを通る声門音源。録音を再生するのではなく、機構から 1 音を計算します。1 音ごとにサンプリング周波数で小さなシミュレーションが走り、そのシミュレーションが放射したものがそのまま音になります。

このページではこれらのエンジンを扱います。モデルが実際に何を計算しているのか、各ボイスがどの物理量を軸にしているのか、どの調整作業が完了し、何がまだ残っているのかを説明します。

どの方式をいつ使うか

そもそも物理モデルが適切な選択なのか — SoundFont、サンプリング、減算方式と比べてどうか — は 音源方式 の話題です。このページは方式を選び終えた前提で書かれています。これらのボイスが収まっている共通パッチ層は 内蔵シンセサイザー、用語は シンセシスの基礎 を参照してください。

導波管モデルとは何か ​

振動する弦や気柱の中では、波が進み、両端で反射して戻ってきます。導波管モデルは、それを計算するいちばん素直な方法です。進行を遅延線で、反射端での損失をフィルターで表し、この 2 つをループに配線する。あとはエネルギーを注ぎ込めば、ループはそれ自身の長さだけで決まる音高で鳴りはじめます。

仕掛けはこれだけですが、使う前に知っておきたい帰結が 2 つあります。

録音データが不要です。 サンプリングされたグランドピアノは、音域・ベロシティレイヤー・アーティキュレーションの録音を多数収めるため、大きなデータになります。モデルはコンパクトなパラメータ集合を持ち、モデル化した範囲内の音高や演奏値を計算します。SoundFont を一切伴わずに届いた MIDI ファイルの受け皿をこれらのボイスが担えるのは、そのためです。

ボイスごとに計算コストがかかります。 サンプラーがメモリを読みながら再生ボイスを進めるのに対して、モデルは 1 サンプルごと・1 ボイスごとに物理を解きます。ボイスはそれぞれ自前の遅延線、損失フィルター、ボディ共鳴器を抱えます。ここで制約になるのはディスク容量ではなく同時発音数です。擦弦を厚く重ねたアレンジは、同じものをサンプルで鳴らすより重いレンダリングになります。

そして、これは録音ではなくモデルです。 機構を再現するので、サンプルには出せない振る舞いが出ます — 強打が明るいのは、明るいサンプルを別に録ったからではなく、フェルトがより深く潰れるからです。ただし特定の 1 台の個性は自動的には手に入りません。そのためには調整と較正が必要です。

ループとモデル固有の段 ​

共通の抽象化とモデル固有の段
励振部バルブや摩擦ボイスごとに差し替え遅延線進行する波オシレーターは無い — 長さが音高損失フィルター1 往復ごとのローパス × ゲイン放射耳に届くものモデル固有のボディ/放射brightness · damping注入反射して戻る戻ってくる波出力1 往復 = サンプルレート ÷ f0モデル固有の段擦弦弓のスティックスリップ摩擦bow_positionbow_forceリード無記憶のリードバルブbreath_pressurereed_stiffness金管共振する唇のバルブbreath_pressurelip_tensionフルート空気ジェット、専用の遅延breath_pressurejet_ratiopiano・plucked-string:励振は一度きり、あとはループが鳴り止む
  • 共通する導波管の抽象化
  • モデル固有の段
  • ループの外側にある出力タップ
励振、伝搬、損失、放射。遅延線は伝搬を、損失フィルターは減衰を表せますが、トポロジー、放射、制御のふるまいはモデルごとに異なります。弓・リード・唇・ジェットは同一のループではなく、共通する抽象化で説明します。

導波管モデルでは、左から読むと、励振部が遅延線にエネルギーを注ぎ、波が進み、向こう端で折り返して損失フィルターを通り、励振部のところへ戻ってきます。この 1 往復の長さ — サンプリング周波数を基音で割ったもの — がこの抽象化での音高を決めるため、導波管系のボイスには別のチューニング用オシレーターが要りません。放射段はループの外側から取り出したタップで、ボディやベルが内部の波をマイクに届く音へ変える場所にあたります。

モデルがこれらを公開する場合、brightness と damping は伝搬段や放射段のスペクトルの開きとエネルギー損失を表します。具体的な効き方はモデルごとに異なります。擦弦や吹奏のボイスでは励振部が損失を補えるため、音を持続させながら色と減衰を変えられます。

励振部は楽器間で変わる重要な要素ですが、それだけではありません。弓は弦に対するスティックスリップ摩擦、リードは口腔圧と管内圧で開閉するバルブです。唇には固有の共振があり、ジェットには固有の通過時間があります。遅延トポロジー、損失、放射、ボディ結合もエンジンごとに異なります。

打弦・撥弦のボイス — piano、plucked-string、karplus-strong、harpsichord — は導波管または遅延線の構造と短い励振部を使います。ハンマー、ピック、爪がエネルギーを渡したあとは、残った状態が鳴り止みます。そのため発音中に動かしたコントロールは、持続する擦弦ボイスには届いても、打撃系では受け取る励振軸が残っていないことがあります。

アコースティックモデル ​

エンジンモード何をモデル化しているか軸に据えている物理量識別子
pianoフェルトハンマー、連成したユニゾン弦、響板ハンマーが弦を打つ位置piano.strike_position
pipe-organ共通の風箱から風を受けるフルー管歌口での風圧pipe_organ.breath
bowed-string弦に食いついては滑る松脂つきの弓接触位置と弓圧bowed_string.bow_position
reed円筒管・円錐管を開閉するケーンリード吹奏圧とリードの硬さreed.breath_pressure
brass朝顔付きの管に対する唇バルブ吹奏圧とアンブシュアbrass.lip_tension
fluteエッジを横切って開管を駆動する空気ジェット管の周期に対するジェット通過時間flute.jet_ratio
plucked-string湾曲した駒をかすめ続ける弦撥弦位置と駒のびびりplucked_string.pick_position
vocal声門音源と 5 つの母音フォルマントどの母音かvocal.vowel
free-reedスロットを行き来する金属の舌蛇腹の圧力と舌の硬さfree_reed.breath_pressure
harpsichordクイルで弾く弦列と駒の後ろの短い区間撥弦位置と後部結合harpsichord.pluck_8a

上の多くのモデルは、図が示した意味での導波管です。vocal はループを持たないソースフィルターモデル、free-reed は連成する気柱を持たない駆動舌です。harpsichord は弦列ごとに独立した遅延線を使い、駒の後ろに短い区間を持ちます。いずれも録音を再生するのではなく機構から解くため、このページで扱います。

以下の識別子はエンジン側のフィールド名です。各モデルはこれらで音づくりされており、名前付きプリセットが設定しているのもこれらですが、呼び出し側が個別に触れるものではありません。実際に設定できるものは コードから触る を参照してください。

piano — ハンマー、ユニゾン弦、響板 ​

フィールド既定値範囲意味
piano.strike_position0.0850 – 0.5ハンマーが弦に当たる位置を弦長に対する比率で。そこに節を持つ倍音に櫛型のノッチが入ります。グランドではおよそ第 8 倍音あたり。
piano.hammer_exponent2.51.5 – 4フェルトの圧縮則(変位に対する力)。強打が弱打よりどれだけ短く明るくなるかを決めます。
piano.hammer_contact_ms1.20.2 – 10A4・mf でフェルトが接触している時間。この接触時間の最初のスペクトルヌルが、その打鍵で励起できる上限になります。
piano.strings31 – 31 音あたりの連成ユニゾン弦の本数。
piano.detune_cents1.60 – 50ユニゾン内のマイクロデチューン。弦どうしが歩調を崩し、プロンプトサウンドが長いアフターサウンドへ移ります。
piano.dispersion1.00 – 1鍵盤位置で段階づけられた剛性ストレッチへの係数。0 は完全に調和的な弦。

つまみ駆動の撥弦モデルには真似できないことが 3 つあります。インハーモニシティは U 字カーブを描き、高音側へ単調に増えるのではなく C2 付近で最小になります。低音の巻線が下端で再び持ち上げるので、鍵盤のいちばん下はそのすぐ上の音より非調和です。縦振動モードが計算されており、打たれた弦は横だけでなく長さ方向にも伸び縮みし、その張力変化が低音のアタックを埋めるうなりを放射します。これが無いと低音は聴こえるより「感じる」ものになります。現在のピアノ調整作業では、このボイスに明示的な出力ゲインを持たせています。ほかのフォールバック音源と混ぜるときにレベルを設定できるためです。

pipe-organ — 共通の風箱に乗ったフルー管 ​

フィールド既定値範囲意味
pipe_organ.breath0.350 – 1ジェットを駆動する歌口の圧力。音量ではなく音色を決めます — 管は帯域全体で自励振動し、音量はアンプエンベロープ側が持ちます。
pipe_organ.brightness0.50 – 1開口端が上の倍音をどれだけ明るく反射するか。上端がプリンシパル、下端がストップトフルート。
pipe_organ.stoppedfalse—蓋つき管。基音優位でオクターブポンプが抑えられ、反射が暗くなります。
pipe_organ.rank_count00 – 8同時に鳴るランク数。0 は上の 2 フィールドから作られる暗黙の 8′ 1 ランク。
pipe_organ.wind_sag0.00 – 1引かれる管が増えたとき共通風圧がどれだけ落ちるか。和音を張ると少し沈み、また戻ります。
pipe_organ.tremulant_rate_hz0.00 – 12風圧のうねり。音高と音量が一緒に揺れます。0 でオフ。

風の供給は 1 音ごとではなくランク間で共有されます。wind_sag に意味があるのはそのためで、これは風箱の性質であり、複数の管が同時に鳴ったときにだけ現れます。

bowed-string — 食いついて、滑る ​

フィールド既定値範囲意味
bowed_string.bow_position0.130.02 – 0.5駒からの接触位置を弦長比で。小さいほど駒寄り(スル・ポンティチェロ、明るく硬い)、大きいほど指板寄り(スル・タスト、柔らかい)。0.13 が自然な運弓位置です。
bowed_string.bow_force0.50 – 1弓圧。摩擦曲線の固着領域の幅を決めます。低いと弦をつかみきれない細い音、高いとしっかりした、やや粗い音。
bowed_string.bow_speed0.50 – 1運弓速度、すなわちダイナミクス。
bowed_string.brightness0.50 – 1駒側の反射の開き具合。
bowed_string.damping0.40 – 1駒ループの損失。どちらにせよ弓が補うので音は持続します。
bowed_string.rosin0.00 – 1松脂の食いつきの粗さを、弓速に乗る決定的な微小ノイズとして。

弓の位置と圧力は奏者が実際に操作している対です。そして互いの代わりにはなりません。位置が決めるのは「どの倍音が立つか」、圧力が決めるのは「擦弦を擦弦たらしめるヘルムホルツ運動へどれだけきれいにロックするか」です。放射タップにはヴァイオリン属のボディ共鳴が乗ります。実測されたヴァイオリンの胴体であり、bowed_string.corpus_scale で置けるのは最低次のモードだけです。チェロは拡大されたヴァイオリンではないからです。

reed — 息が開けるバルブ ​

フィールド既定値範囲意味
reed.breath_pressure0.60 – 1定常口腔圧、すなわちダイナミクス。リードは閾値を超えないと発音しないので、極端に低い値は無音に近づきます。
reed.reed_stiffness0.50 – 1リードテーブルの傾き。柔らかく暗い側から、硬く明るくバジーな側まで。
reed.reed_opening0.50 – 1静止時にリード先端がどれだけ開いているか。低いと早く閉じ切り、鼻にかかった音になります。
reed.conicalfalse—false はリード側が閉じた円筒管、つまりクラリネットで奇数倍音のみ。true は円錐管で、開管近似により全倍音列が出ます(サックス、オーボエ、ファゴット)。
reed.brightness0.50 – 1ベル側の反射の開き具合。
reed.chiff0.40 – 1リードが発音しはじめる瞬間の短い明るいノイズ。音が膨らんで始まるのではなく、輪郭を持って立ち上がります。

conical は管体が支える共鳴モードを変えます。あとから EQ カーブをかけるのではなく、発音の段階で共鳴と倍音バランスが変わります。

brass — 唇がバルブそのもの ​

フィールド既定値範囲意味
brass.breath_pressure0.70 – 1唇バルブを駆動する定常口腔圧。
brass.lip_tension0.50 – 1アンブシュア。唇の共振が管に対してどこに位置するか。締めれば少し上に位置し、金管のエッジを生む外向き振動点へ。緩めれば下側の、広く安定した中心へ。
brass.lip_damping0.50 – 1唇共振器の極半径。低いと締まったバジーな唇、高いと柔らかく丸い唇。
brass.conicalfalse—円筒系(トランペット、トロンボーン)と円錐系(ホルン、チューバ、コルネット、フリューゲルホルン)。どちらも全倍音列を放射し、このフラグはベル反射の色づけを変えます。
brass.brightness0.50 – 1ベル反射の開き具合。
brass.damping0.40 – 1管ループの損失。

リードと違い、金管の唇は自分の共振を持っています。音高は唇と管が折り合った場所に立つので、lip_tension は音色であると同時にイントネーションのコントロールでもあり、同じ運指で複数の音がスロットに入るのもそのためです。

flute — エッジを横切るジェット ​

フィールド既定値範囲意味
flute.jet_ratio0.50.1 – 0.9ジェットの通過時間を管の周期に対する比で。0.5 付近でジェットは基音を駆動し、小さくするとオクターブ以上を駆動します。音域を物理的に決めているのがこの値です。
flute.breath_pressure0.550 – 1口腔圧 — ダイナミクスとジェット駆動力。
flute.jet_reflection0.50 – 1管から戻る圧力が歌口でジェットをどれだけ偏向させるか。
flute.end_reflection0.50 – 1開口端が波をどれだけ強く管内へ戻すか。
flute.damping0.350 – 1管の損失。低ければフルート、高ければオカリナや瓶で、オーバーブローしません。
flute.breath_noise0.150 – 1ジェットの乱流。フルートの持ち味です。尺八では高く、ティンホイッスルでは低く。

フルートの軸になる物理量は、圧力でも位置でもなく「2 つの時間の比」です。ジェットが歌口を渡る時間を、管が 1 往復する時間で割った比が、管の音域を決める要因になります。

plucked-string — 弦がかすめる駒 ​

フィールド既定値範囲意味
plucked_string.pick_position0.20 – 0.5撥弦位置を周期に対する比率で。そこに節を持つ倍音が励振側の櫛型フィルターで抜かれます。0 で櫛は無し。
plucked_string.buzz0.00 – 1湾曲した駒が戻る波をどれだけ制限し、上の倍音へ撒き散らすか。0 はきれいに終端されたハープや箏、上げていくとシタールのジャワリや三味線のサワリの、きらめくびびりになります。
plucked_string.brightness0.70 – 1ループローパスの開き具合。基音に対して上の倍音がどれだけゆっくり減衰するか。
plucked_string.decay_s4.00.05 – 60A4 における弦の t60。
plucked_string.decay_stretch0.50 – 1低音弦がどれだけ長く鳴るか。t60 が「2 の(stretch × A4 からのオクターブ数)乗」でスケールします。
plucked_string.release_damp_s0.120.01 – 10ノートオフ時に適用される減衰 t60。指や掌が弦に戻って触れる瞬間にあたります。

このエンジンが素の撥弦ループと別に存在する理由は、まるごと buzz にあります。湾曲した駒は弦を一点で終端しません。弦は駒をかすめ続け、かすめるたびにエネルギーが倍音列の上へ投げ返されるので、音はなめらかに減衰するのではなく鳴っている間ずっときらめき続けます。

vocal — 音源と 5 つのフォルマント ​

フィールド既定値範囲意味
vocal.vowel00 – 4/a/、/e/、/i/、/o/、/u/。フォルマントテーブルを選びます。
vocal.brightness0.50 – 1声門音源を傾け、上側のフォルマントを開きます。
vocal.breath_noise0.10 – 1音源に混ぜる気息成分。0 は締まった声、上げるほど息っぽくなります。
vocal.vibrato_rate_hz5.50.1 – 12歌手自身のビブラート速度。ノートオンで読まれます。
vocal.vibrato_depth0.30 – 1ビブラート量。0 なら LFO 自体が省かれます。

これは導波管ではありません。 ソースフィルターモデルであり、声門音源 — 1 次のチルトで整形された鋸歯波に気息成分を足したもの — を、母音に合わせた 5 つの共振バンドパスに通しています。ループが無いので反射するものも無く、信号経路は完全にフィードフォワードです。ひとつ注意しておきたいのは、この音源オシレーターは帯域制限されておらず、エイリアシングを出力から遠ざけているのはオシレーター側の対策ではなくフォルマントバンドパスの狭さだという点です。

free-reed — スロットを抜ける舌 ​

フィールド既定値範囲意味
free_reed.breath_pressure0.70 – 1蛇腹の圧力 — ダイナミクスと駆動力。
free_reed.reed_stiffness0.50 – 1舌の非線形性の非対称さ。柔らかいほど丸く、硬いほどバジーに。
free_reed.detune0.30 – 11 音に配された 2 枚の舌のうなり、いわゆるミュゼット。0 で 1 枚に戻ります。
free_reed.brightness0.60 – 1リードプレートがどれだけ高域を放射するか。下端は穏やかなリードオルガン、上端はバジーなハーモニカ。
free_reed.slot_duty0.00 – 0.9舌の往路がスロットを開けている時間の割合。実測リファレンスが共通して持つ第 7 倍音付近のヌルは、これが置きます。0 では単純な整形鋸歯波の音源が使われます。
free_reed.radiation1.00 – 1プレートが自由な単極子にどれだけ近いか。0 は流量そのもの、1 はその時間微分を放射します。ハルモニウムは 1、手で包んだハーモニカは 0 で実測されます。

こちらも導波管ではありません。 フリーリードの音高は連成する気柱ではなく舌そのものから来るので、遅延線も往復もありません。アコーディオンが蛇腹の加減によらず同じ音高で鳴り、フルートは強く吹くとオクターブ跳ぶ — その違いは、まさにここです。

撥弦系のもう 2 つのモデル ​

karplus-strong — 素の撥弦ループ ​

フィールド既定値範囲意味
ks.pick_position0.180 – 0.5撥弦位置を周期に対する比率で。
ks.decay_s3.00.05 – 60A4 における弦の t60。
ks.decay_stretch0.50 – 1低音弦がどれだけ長く鳴るか。
ks.mute_harmonic0.00 – 16ハンドミュート。固定周波数ではなく、その音自身の基音の何倍かで指定します。掌は音高によらず同じ倍音のところに切れ目を作るからです。2 前後で詰まった音、6 で軽いパームミュート、0 で開放。
ks.exc_brightness0.850 – 1最大ベロシティにおける励振ローパスの開き具合。
ks.release_damp_s0.080.01 – 10ノートオフ時の減衰 t60。

きれいに終端された撥弦弦で、かなり多くの GM プログラムがここにフォールバックします — ギター、ベース、ハープ。plucked-string との違いは駒です。こちらは反射するだけなので、音はきらめかずになめらかに減衰します。このエンジンにはより凝った挙動もいくつか入っていますが既定ではオフで、フレットスラップ、第 2 偏波、2 平面間の駒結合などがそれにあたります。

harpsichord — 爪と、3 組の弦 ​

フィールド既定値範囲意味
harpsichord.pluck_8a0.140 – 0.5第 1 の 8′ 弦列を弾く位置を弦長比で。
harpsichord.pluck_8b0.220 – 0.5第 2 の 8′ 弦列。弾く位置が違うことが、2 つのレジストレーションを「音量違い」ではなく別の音にしています。
harpsichord.pluck_40.110 – 0.54′ のオクターブ弦列。
harpsichord.plectrum_edge0.80 – 1爪が離れる瞬間の鋭さ。
harpsichord.velocity_range_db5.00 – 24打鍵速度で得られるダイナミックレンジの幅。実物は 3〜6 dB 程度で、しかも単調ですらありません。ある速度を超えると爪が早く外れるため、音はかえって小さくなります。
harpsichord.rear_coupling0.350 – 1駒の向こう側にあるダンプされない短い区間がどれだけ出力に届くか。この楽器の非調和なきらめきの出どころで、発音部の倍音自体は数セント以内で調和的なままです。

このモデルは、ピアノ以外のすべての物理モデルと同じく、まだ調整・キャリブレーションを行っていません。レジストレーションは別々の弦列です。2 組の 8′ ユニゾンと 1 組の 4′ オクターブは、3 つの周期を持つ 3 本の独立した遅延線であって、1 本の弦にミックスつまみが付いたものではありません。

A/B する前にゲインを下げてください

エンジン間で生の出力レベルはそろっていないため、harpsichord が隣の音源より大きく聞こえることがあります。ほかのエンジンと並べる前にパッチの gain を下げ、同じレベルで聴き比べてください。

聴き比べる ​

下のデモは複数のエンジンモードで同じ 1 音を鳴らします。何より聴いてほしいのは、立ち上がりです。モデルと波形の差が最も大きく出るのはそこです。減算方式は大きく始まってから削られ、撥弦ループはバーストで始まって即座にエネルギーを失いはじめ、擦弦は数周期かけて食いついてから音がロックし、吹奏系は圧力を立ち上げて発音の立ち上がりにチフを伴います。カットオフは共通フィルターに効くので、これらのボイスで同じ意味を持ちます。エンジン間の生のレベルはそろっていないため、音色を判断する前に gain を合わせてください。

SYNTH · SUBTRACTIVEIDLE
同じ音を 8 つのエンジンで — 波形と物理モデル

ピアノ以外の物理モデルは未調整で、今後のパッチリリースで音を調整する予定です。同じ A3 を 8 つのシンセエンジンで鳴らします。減算方式はオシレーターから出発してフィルターで削りますが、残りは振動する物体のモデルを解いています — 自らの損失で減衰する撥弦、食いついては滑る弓、息で駆動される気柱。モデルには選ぶべきオシレーターが無いので、減算方式以外ではオシレーターの選択肢が消えます。エンジンごとに音量が異なり、まだ揃えていません。再生して、それぞれの「鳴りはじめ」を聴いてください。モデルと波形の差が最も出るところです。

エンジン
カットオフ
2200 Hz

この一族の境界 ​

2 つのエンジンは導波管ではありませんが、物理的な考え方を使っており、ここではなく 内蔵シンセサイザー 側で扱われます。modal は同時に叩かれる同調共振器のバンクで、モードが既知でどれも伝搬しない棒や鐘にはこちらが正しいモデルです。percussion はレイリーの円形膜にフィルタードノイズを重ねたもので、シェーカーやギロには確率的な粒子音源も加わります。ノイズ層を持つモーダルモデルであって、ループではありません。additive は物理モデルではなく、ドローバーの倍音を足し合わせる加算合成です。

ただしパーカッションエンジンには、ここで触れておきたいフィールドが 1 組あります。古いビルドに合わせて追い込んだキットは、調整し直しが必要になるからです。

フィールド既定値範囲意味
percussion.wire_threshold0.10 – 1スナッピーが接触するまでにヘッドがどれだけ振れる必要があるか。基準は絶対レベルではなく、そのピースで最大ベロシティの打撃が到達する振幅に対する比率です。0 は常に接触、1 は決して接触しない。だから区間全体がどのピースでも同じ意味を持ちます。打撃の強さも同じ比較に入ります。ストレイナーという機構そのものが持つ非線形性であり、弱い打撃は最後まで閾値を下回ったままでいられます。
percussion.wire_decay_ms0.00 – 2000スナッピー自体の減衰。ヘッドが先に止まってもびびりだけが残ります。スネアのテールがヘッドの音色より後まで広帯域なのは、これが理由です。0 では単なるゲートとして振る舞い、ストレイナーを持たないピースはすべてこの値です。

コードから触る ​

上に挙げた深い階層のフィールドは、どのバインディングからも個別には設定できません。 これらはエンジン内部のパッチに存在し、名前付きプリセットを構成している中身そのものです。一方 C ABI を越えるパッチ構造体は — したがってブラウザ・Node・Python の呼び出し側が見る SynthPatch も — エンジンを包むラッパー層だけを意図的に含みます。オシレーター、フィルター、エンベロープ、LFO、モッドマトリクス、ボディ、ゲイン。C ABI 側のパッチ入口は sonare_synth_preset_patch(name, out) ひとつだけで、埋めるのはこのラッパーのみの構造体です。

したがって、実際にできることは 3 つです。

プリセットを選び、その物理的な音づくりをまるごと受け取る。 物理モデル系のプリセットは深いフィールドが設定済みで出荷されており、それを使うには名前でプリセットを選びます。カタログはハードコードせず、ランタイムから取得してください。

typescript
const names = synthPresetNames();
// 'violin', 'cello', 'clarinet', 'alto-sax', 'trumpet', 'french-horn',
// 'concert-flute', 'shakuhachi', 'koto', 'sitar', 'accordion', 'harmonica',
// 'choir-aah', 'acoustic-piano', 'church-organ', 'harpsichord', ...

const patch = synthPresetPatch('cello');
// 返るのはラッパー層だけ。patch.engineMode は 'bowed-string' になり、
// 弓そのものの音づくりはフィールドではなくプリセットの中を旅します。

const audio = project.bounceWithSynthInstrument(
  { preset: 'cello', cutoffHz: 3600, ampAttackMs: 40 },
  { totalFrames: 48000, numChannels: 2 },
);
python
names = sonare.synth_preset_names()
patch = sonare.synth_preset_patch("clarinet")

audio = project.bounce_with_synth_instrument(
    {"preset": "clarinet", "cutoff_hz": 3600},
    total_frames=48000,
    num_channels=2,
)

その上から共通層を上書きする。 ラッパーにあるもの — フィルターのカットオフとレゾナンス、両方のエンベロープ、LFO、グライド、ボディミックス、ステレオスプレッド、ゲイン — はプリセットが選んだエンジンの上に乗ります(percussion エンジンだけは例外で、このうち効くのはゲインだけです)。同じフィールドは resolveInstrumentAutomationId で連続オートメーションの対象としても解決できます。そこで動かせないのは構造にあたるもので、プリセット、エンジンモード、波形、フィルターモデル、同時発音数、モッドルーティングは平滑化されるのではなく拒否されます。

励振軸を通じて、励振部を演奏する。 物理モデルそのものを動かせる経路はこれだけです。bow_force や breath_pressure を名前で公開する代わりに、エンジンは force・position・brightness・morph という 4 つの抽象的な軸を定義しており、コントローラーの操作やモッドマトリクスのルートが発音中にこれらを動かせます。どの軸を読むかは各エンジンが宣言します。

エンジンモード読む軸
bowed-stringforce、position
pipe-organ、reed、brass、flute、free-reedforce、brightness
vocalbrightness
additivemorph(発音中ではなくパッチ単位)
piano、plucked-string、karplus-strong、harpsichord、percussion、subtractive、fm、modal、sampleなし

打弦・撥弦のボイスが発音中の励振軸を宣言しないのは、励振部がワンショットだからです。ノート開始後に励振ルートを受け取る対象がありません。

軸を動かす方法は 2 つあります。ひとつは、コントローラープロファイル。デバイスの操作を軸へ割り当てるもので、既定の gm プロファイルは CC2(ブレス)を force へ、CC74 をそのエンジンが読むほうの brightness または position へ送ります。選択と拡張はリアルタイムエンジンの setControllerProfile と bindController で行います。もうひとつは、モッドマトリクスのルーティング。パッチの内側から同じことをします。breath、aftertouch、expressionCc、pitchBend のいずれかを excitationForce、excitationPosition、excitationBrightness、spectrumMorph へ結べば、パッチと一緒に持ち運ばれ、バインドし直す必要もありません。

聴き比べる前にもうひとつ。素のパッチで鳴るエンジンモードばかりではありません。 17 のうち 4 つ — fm、modal、percussion、sample — は既定のパッチが供給しない内容を必要とし、プリセット経由で(sample ならバンクを結んで)設定するまでは無音をレンダリングします。詳しくは 内蔵シンセサイザー を参照してください。

関連: 内蔵シンセサイザー · 音源方式 · GM / GS フォールバックバンク