Skip to content

内蔵シンセサイザー (NativeSynth)

NativeSynth は MIDI を単体で音にします — ダウンロードするサンプルも、同梱する SoundFont も要りません。libsonare に組み込まれているので、MIDI トラックは何もしなくても最初から音が鳴ります。

最初に押さえることは 3 つだけです。

  1. acoustic-pianowarm-paddrum-kit のような名前付きプリセットを選ぶ。
  2. そのプリセットを使う送出先(デスティネーション)へ MIDI ノートを送る。
  3. 必要なら cutoffHzampAttackMsstereoSpread など、聞いて分かりやすい項目だけを上書きする。

内部的には、NativeSynth は 15 個の差し替え可能な音作りエンジンを備えた 1 台のシンセです。それぞれ、元になる音の作り方が異なります。アコースティック楽器系のいくつかは、まだ仮実装の物理モデルです。データ不要のプレビューやフォールバックには使えますが、最終的な音色調整/キャリブレーションは完了していません。

  • バーチャルアナログ減算合成(定番のシンセリードやパッド)
  • FM(エレクトリックピアノ、ベル、クラビネット)
  • Karplus-Strong 撥弦(ギター、ベース、ハープ、ハープシコード)
  • モーダル打楽器(マリンバ、ビブラフォン)
  • 加算ドローバーオルガン
  • 膜打楽器(ドラムキット)
  • 拡張導波路アコースティックピアノ
  • 持続型フルーパイプオルガン
  • ボウイング弦の導波路
  • リード木管の導波路
  • 金管リップリード導波路
  • エアジェットフルート導波路
  • バズブリッジの撥弦(箏、シタール、タンプーラ)
  • ソースフィルター方式のボイス(合唱・ソロ)
  • フリーリード(アコーディオン、ハーモニカ、バンドネオン)

15 個すべてが、モジュレーション、エンベロープ、フィルター、ステレオ幅、ポリフォニーを扱う共通の制御層を通るため、違う音色でも同じパッチ項目で調整できます。音を出すには、プリセットを名前で選ぶか、プリセットを出発点に SynthPatch で必要な項目だけを上書きします。鳴らし始めるのにエンジン内部へ触れる必要はありません。

音作りの用語をまとめて把握

以下のエンジン名は、音色を生成する方式の違いです。最初から全部を知る必要はありません(プリセットを選んで鳴らせば十分です)。それぞれを 1 行で説明します。

  • subtractive(減算合成) — 明るい波形から始め、フィルターで削っていく古典的なアナログシンセの手法です。
  • FM/位相変調 — 1 つのオシレーターの出力をもう 1 つの位相に加えます(DX 系が採る FM の実装方式です)。金属的で鐘のような音色になります。
  • Karplus-Strong — 撥弦をモデル化する短い遅延ループです。
  • modal(モーダル) — 叩いたバーや鐘をモデル化する、チューニングされた共鳴器のバンクです。
  • additive/drawbar(加算/ドローバー) — ハモンドオルガンのドローバーのように、倍音のサイン波成分を足し合わせます。
  • (拡張)waveguide(導波路) — 振動する弦や管をモデル化する遅延ラインです。
  • reed/brass/flute waveguide — 木管・金管のための、息で励起される持続音モデルです。
  • バズブリッジ撥弦 — ブリッジを弦に触れさせて上部倍音へエネルギーを撒ける撥弦ループです。buzz が 0 ならクリーンに終端し(ハープ、箏)、buzz を上げるほどきらめきとびりつきが強くなります(シタール、タンプーラ)。
  • ソースフィルター方式のボイス — 声門音源(ノコギリ波+スペクトルティルト)を母音フォルマント共鳴のバンクに通し、合唱やソロの声を作ります。
  • フリーリード — 駆動される金属リードの発振器(アコーディオン、ハーモニカ、バンドネオン)です。ミュゼットデチューンで 2 枚のうなるリードにもできます。

パッチ操作でよく出てくる用語が 2 つあります。ADSR エンベロープ(attack/decay/sustain/release。音量などが、ノートの間にどう立ち上がり減衰するか)と、モッドマトリクス(LFO やエンベロープなどの変化の元を、ピッチやフィルターカットオフなどの送り先へつなぐ表)です。

MIDI は決して無音にならない

NativeSynth は SoundFont プレイヤーデータ不要な土台でもあります。SF2 経由でプロジェクトをバウンスしたとき、あるプログラム(または SoundFont 全体)が欠けていると、その音は NativeSynth の GM フォールバックバンクへ落ちます。128 種すべての General MIDI プログラムとドラムマップを備えているため、いずれにせよ音は出ます。

NativeSynth の位置づけ

NativeSynth パッチはインストゥルメントです。MIDI デスティネーションへバインドすると、そのデスティネーションへルーティングされたトラックの MIDI が内蔵シンセサイザーで鳴ります。オフラインでは bounceWithSynthInstrument でバインドし、ライブでは engine.setSynthInstrument でバインドして MIDI 入力を送ります。サンプルベースのマルチサンプル音色が必要なら、代わりに SoundFont プレイヤー を使ってください。

どのノートにも、NativeSynth の中を 1 本のシグナルパスが流れます。MIDI ノートが 15 個のうち 1 つのエンジンを選び、そのエンジンの素の音色が共通の制御層を通ってからステレオ出力へ届きます。

NativeSynth のシグナルパス
15 個のうち 1 つ共通の制御層MIDI ノートエンジン選択フィルターアンプ/フィルターの ADSRLFO/モッドマトリクスボディ共鳴ステレオスプレッドステレオ音声出力
どのエンジンが選ばれても、その後は同じ共通の制御層とパッチ項目が適用されます。

このページで身につくこと

このページを読むと、次のことができるようになります。

  • 音色に合った音作りエンジンと、適切な名前付きプリセットを選べる。
  • プリセットを出発点に、SynthPatch で個々のフィールドを上書きできる。
  • プリセット名と enum 名を推測せず、ランタイムから実際の名前を取得できる。
  • va: ルーティング接頭辞と、drum-kit の GM ドラムマップを理解できる。
  • bounceWithSynthInstrument でオフライン、setSynthInstrument でライブに MIDI を音声化できる。
  • ある音が NativeSynth で鳴るのか、読み込んだ SoundFont で鳴るのかを判断できる。

15 個の音作りエンジン

各プリセットは 1 つの engineMode を選びます。共通部分(フィルター、エンベロープ、LFO、モッドマトリクス、ボディ共鳴、ポリフォニー)は、選択中のどのエンジンの上にも適用されます。エンジン固有の深いパラメータ(FM オペレータスタック、モーダルのモードテーブル、ドローバー設定、キットの各パーツ、ピアノの弦、パイプランク、ボウイング摩擦、リード/金管の管体、フルートのジェット形状)は、パッチではなく名前付きプリセットの中に収まっています。

subtractive — バーチャルアナログ

オシレーター → フィルター → アンプという古典的なボイスです。デチューンユニゾン、ドリフト、フィルター前段のドライブ、4 種のフィルターモデルにより、太いソウリードから広がりのあるパッドまで作れます。リード・ベース・パッド・プラック、つまりアナログシンセで作りたいものに向きます。プリセット: sinesawsquaretrianglesaw-leadsquare-leadsub-basswarm-pad

SYNTH · SUBTRACTIVEIDLE
音を形づくる — オシレーター・フィルター・エンベロープ

内蔵シンセが A3 を1音レンダリングします。輪郭はその振幅エンベロープ。アタックを上げると音が徐々に立ち上がり、カットオフを下げると音色が暗くなります。再生でパッチを試聴できます。

オシレーター
カットオフ
2200 Hz
アタック
8 ms

「キャラクター」の核はフィルターモデルです。filterModel で 4 種の古典モデルを選べます。

モデル模した音色備考
svfTPT ステートバリアブル(SEM 系)クリーン。filterOutput(lowpass / bandpass / highpass)を選べる唯一のモデル
moog-ladder4 ポールトランジスタラダーゼロディレイフィードバック、飽和ループ、自己発振する
diode-ladderダイオードラダー(VCS3 / TB-303 系)結合段 ZDF、自己発振する
sallen-keyKorg35 ザレンキー(MS-10 / 初期 MS-20)自己発振する

4 種とも、サンプル単位のカットオフ/レゾナンス変調下でも安定しジッパーノイズがなく、自己発振も決定論的です。

SYNTH · SUBTRACTIVEIDLE
ローパスフィルター — カットオフ・レゾナンス・モデル

ノコギリ波をローパスフィルターに通します。シンセで最も象徴的な操作です。カットオフを下げると高次の倍音が削れて音色が暗くなり、レゾナンスを上げるとフィルターがカットオフ付近で共振して「ワウ」がかかります。モデルは模倣するフィルター回路を選びます。SVF はクリーンなまま、ラダーや Sallen-Key はサチュレーションがかかり、高いレゾナンスでは自己発振します。下段のスコープは波形です。再生して聞いてください。

カットオフ
2200 Hz
レゾナンス
3
フィルターモデル

fm — 周波数変調

小さなアルゴリズムテーブルを持つ位相変調オペレータスタック(1 つのオシレーターの出力をもう 1 つの位相に加える → 金属的・鐘的な音色)で、指数エンベロープ、フィードバックオペレータ、ベロシティ → インデックス(明るさ)スケーリングを備えます。エレクトリックピアノ・ベル・マレット・クラビネット・ブラス、つまり減算合成が苦手な金属的・鐘的・非整数次倍音の音に向きます。プリセット: e-piano

karplus-strong — 撥弦

位相が正確にチューニングされた分数遅延導波路ループ(撥弦をモデル化する短い遅延ループ)に、ピック位置コム、ベロシティ駆動の明るさ、ディケイストレッチ、ノートオフ時のループダンピング(フィンガー/パームミュート)を加えたものです。ギター、ハープ、ベース系プリセットでは、仮実装の物理的な細部として、ピックアップ位置、ボディ結合、スチール弦の分散、開放弦の共鳴、弦の張りによるベンド、2 方向の振動による減衰差も使います。アコースティックなリアリティは調整中であり、完成済みの楽器モデルではありません。撥弦・ストローク弦、すなわちギター・ベース・ハープ・ハープシコード・撥弦系民族楽器に向きます。プリセット: classical-guitarsteel-guitarelectric-guitarharpbass-acousticbass-fingeredbass-pickedbass-fretlessbass-slap

物理的なモード比(一様バーのグロッケン、深いアーチのマリンバ/ビブラフォン)に合わせたモーダル共鳴バンク(叩いたバーや鐘をモデル化する、チューニングされた共鳴器のバンク)で、マレット硬さのベロシティ重みづけとモードごとのディケイを持ちます。音程のあるマレット楽器、グロッケン・ビブラフォン・マリンバ・シロフォンに向きます。プリセット: marimbaglassbell

additive — ドローバーオルガン

9 本のハモンドドローバーのピッチ(倍音のサイン波成分を、ドローバー 1 本につき 1 成分として足し合わせる)をステップ状のストップレベルで鳴らし、フリーランの倍音位相とキークリックの接点トランジェントを備えます。オルガン、すなわち持続して倍音成分が豊かなレジストレーションに向きます。プリセット: organ

percussion — 膜打楽器

レイリーの円形膜モードに、下降するストライクピッチのエンベロープとフィルタードノイズを重ねたものです。このエンジンが GM ドラムキット(キック、スネアの胴とスナッピー、タム、ハット、非整数次倍音のリングモードを持つシンバル)を支えます。ワンショットで決定論的です。プリセット: drum-kit

piano — 拡張導波路アコースティックピアノ

データ不要のグランドピアノのスケッチで、ピアノを定義する 4 要素を備えます。剛性弦の分散(鍵盤を上がるほど倍音成分がシャープに伸びる)、非線形フェルトハンマー(強打ほど短く明るい)、2-3 本の微デチューンユニゾン弦、響板共鳴バンクです。さらに音域ごとに音作りを変えるため、低音、中央の和音、高音が同じ単純な明るさカーブにはなりません。ただし、これは内蔵プレビュー向けの仮モデルであり、サンプルピアノの代替ではありません。アコースティックピアノに向きます。プリセット: acoustic-piano

pipe-organ — 持続型フルーパイプ

共有風圧、複数ランクのレジストレーション、リードパイプ色、マウス/放射補正を備えた、仮実装の導波路フルーパイプモデルです。プリンシパルやブルドンからフルート、トランペットランクまでの教会オルガン系プレビュー音色に向きます。プリセット: church-organchurch-flutechurch-bourdonchurch-trumpet

bowed-string — 摩擦励起の弦

ボウ速度/圧力/位置の制御、共鳴弦、第二偏波のうなり、ヴァイオリン属のボディ共鳴を備えた、持続型のボウイング弦導波路です。モデルは仮実装で、参照音源に対する調整は継続中です。ヴァイオリン属のプレビューに向きます。プリセット: violinviolacellocontrabass

reed — リード木管

円筒管/円錐管の違い、トーンホール/成長円錐のふるまい、音域に応じた音作り、ライブの息・明るさ制御を備えたリード管体導波路です。キャリブレーション中の、GM フォールバック/プレビュー用の仮ボイスです。シングルリード/ダブルリード木管とサックスのプレビューに向きます。プリセット: clarinetsoprano-saxalto-saxtenor-saxbaritone-saxoboeenglish-hornbassoon

brass — リップリード金管

リップテンション、金管ベルのボディ共鳴、円筒/円錐の音色差、音域に応じた音作り、大音量時の明るい cuivré エッジを備えた金管導波路です。これは仮実装の物理モデルなので、完成済みの金管シミュレーションではなく、内蔵の金管フォールバックとして扱ってください。プリセット: brasstrumpettrombonetubafrench-hornmuted-trumpetcornetflugelhorneuphonium

flute — エアジェットフルート

ジェット/反射の明るさ、息ノイズとチフ、オーバーブローの挙動、ビブラート制御を備えた、息駆動のエアジェット/開管モデルです。現在はフルート、笛、オカリナ系のエッジトーン楽器向けの仮フォールバックボイスです。プリセット: concert-flutepiccolorecorderpan-fluteshakuhachitin-whistleocarinablown-bottle

plucked-string — バズブリッジ撥弦

ブリッジのモデルが弦をこすり続け、エネルギーを上部倍音へ撒き戻すことで、鳴っている間ずっと音がきらめき、うなる撥弦導波路です。buzz コントロールは、バズのないクリーンなハープや箏から、シタールの湾曲したジャワリブリッジや三味線のサワリが生む明るく持続するびりつきまでを連続的に変化させます。クリーンに終端する撥弦をモデル化する karplus-strong とは別物です。箏/シタール系のバズブリッジ撥弦に向きます(名前付きの harp プリセットは karplus-strong のままです。pluckbellbrass は GM フォールバックのエイリアスで、名前から連想されるエンジンとは実際のエンジンが異なります)。プリセット: pluckharp-pluckedkotositartanpura

vocal — ソースフィルター方式のボイス

2 段構成のボイスです。声門音源(1 次のスペクトルティルトで整形されたノコギリ波に、気息ノイズを加えたもの)が、歌唱母音に合わせた 5 つの共鳴バンドパスフォルマントのバンクを駆動します。この音源のノコギリ波は帯域制限されていない素のノコギリ波です。ソースフィルターの経路はフィードフォワードなので、生のノコギリ波が持つエイリアスは、オシレーターの段で防がれるのではなく、狭いフォルマントバンドパスによって減衰されます。vowel フィールドがフォルマントテーブル(/a/、/e/、/i/、/o/、/u/)を選び、brightness が音源を傾けて上部フォルマントを開き、ボイスごとのビブラートがピッチを変調します。合唱・ソロの声のプレビューに向きます。プリセット: choir-aahchoir-oohvoice-eeh

free-reed — 駆動されるフリーリード

駆動される金属リードの発振器(非対称サチュレーターとボディローパスで整形された位相アキュムレータ)で、アコーディオン・ハーモニカ・バンドネオンのフリーリードをモデル化します。リード自身のピッチがノートを決め、連成する気柱はありません。detune コントロールは、1 枚目より数セント高い 2 枚目のリードを加えます。この 2 枚が生むうなりが、きらめくミュゼットの響きです(detune が 0 なら 1 枚のリードに戻ります)。アコーディオン・ハーモニカ・リードオルガンのプレビューに向きます。プリセット: accordionharmonicabandoneonreed-organ

GM フォールバックバンク

GM フォールバックは、最後の手段として単純なサイン波を鳴らすだけのバンクではありません。SoundFont が未読み込み、または一部のプログラムを持たないとき、NativeSynth は要求された GM プログラムに近い内蔵の合成音源を選びます。その一部は、まだキャリブレーション中の仮実装物理モデルです。目的は、データ不要のプレビューと欠けたプログラムのカバーであり、完成済みのサンプル楽器並みのリアリティではありません。

GM 領域データ不要のフォールバック音源
プログラム 0-7、鍵盤拡張導波路グランドピアノ、FM エレピ/クラビ、Karplus-Strong ハープシコードのバンク違い
プログラム 8-15、クロマチックパーカッションモーダルのチェレスタ、グロッケン、オルゴール、ビブラフォン、マリンバ、シロフォン、チューブラーベル、それに Karplus-Strong のダルシマー
プログラム 16-23、オルガン加算ドローバーオルガン(16-18)、物理モデルの教会オルガンのフルーパイプ(19)、フリーリードエンジンのリードオルガン/アコーディオン、ハーモニカ、バンドネオン(20-23)
プログラム 24-37、ギター/ベースKarplus-Strong のナイロン、スチール、エレキ、ミュート/オーバードライブ/ディストーションギター、ベース各種
プログラム 40-47、弦/オーケストラボウイング弦、トレモロ弦のパッド、Karplus-Strong のピチカート弦とハープ、ティンパニのフォールバック
プログラム 52-54、合唱/声専用のソースフィルター方式のボーカルエンジンで鳴らす choir、voice ooh、synth voice
プログラム 56-79、金管/リード/フルート仮実装のリップリード金管(56-60)と FM 金管(61-63)、リード木管/サックス、エアジェットフルート
プログラム 104-107、エスニック撥弦バズブリッジ撥弦のシタール(104)、三味線(106)、箏(107)。バンジョー(105)は Karplus-Strong のまま
プログラム 112-119、パーカッシブパーカッションエンジンのチンクルベル、アゴゴ、スティールドラム、ウッドブロック、太鼓、メロディックタム、シンセドラム、リバースシンバル
ドラムと GS バリエーションGM/GS ドラムキットのバリエーション、GM2/GS バンクフォールバック。利用可能な場合は GS EFX を内蔵インサートチェーンへルーティング

あらかじめ知っておきたい点が2つあります。bourdontrumpet-rank のような名前付きパイプオルガン色は名前付きプリセットカタログにのみ存在し、GM プログラムルーティングには現れません(プログラム19は教会オルガンのフルーパイプで、プログラム20-23はフリーリードのリードオルガン、ハーモニカ、バンドネオンです)。また、プログラム6(Harpsichord)は唯一 Bank Select も読み取る GM プログラムで、プレーン、オクターブミックス、ワイドステレオ、キーオフノイズの各レジストレーションを選べます。

初学者向けに言い換えると、正確な音色や本番向けのサンプル楽器が必要なら SoundFont を使い、軽量で常に鳴るプレビューや欠けたプログラムの保険には NativeSynth フォールバックを使う、という使い分けです。

名前付きプリセットカタログ

NativeSynth は名前付きプリセットカタログを同梱します。プリセット名をハードコードしないでください。ランタイムから synthPresetNames() で一覧し、synthPresetPatch(name) で各プリセットを SynthPatch として確認します。

SYNTH · PRESETIDLE
代表的なプリセット — 1 音で多彩なエンジンを

同じ A3 を、現在の NativeSynth カタログにある代表的なプリセットで試聴します。各パッチは `synthPresetPatch(name)` から読み込み、減算、FM、バズブリッジ式の撥弦、モーダル、ドローバーオルガン、打楽器、ピアノ、パイプオルガン、擦弦、リード、金管、フルートという実際のエンジン特性を保ちます。例外はドラムキットで、GM のパーカッションマップを鳴らすためキーは音高ではなくキットの打楽器を選び、このキーはクラッシュシンバルになります。プリセットを切り替え、エンベロープと波形を見てから再生して比べてください。

プリセット
typescript
import { init, synthPresetNames, synthPresetPatch } from '@libraz/libsonare';

await init();

synthPresetNames();
// ['sine', 'saw', 'square', 'triangle', 'saw-lead', 'square-lead', 'sub-bass',
//  'warm-pad', 'e-piano', 'bell', 'brass', 'pluck', 'classical-guitar',
//  'steel-guitar', 'electric-guitar', 'harp', 'bass-acoustic', ...,
//  'church-organ', 'violin', 'clarinet', 'trumpet', 'concert-flute', ...,
//  'harp-plucked', 'koto', 'sitar', 'tanpura', ...]

const pad = synthPresetPatch('warm-pad');
// { preset: 'warm-pad', engineMode: 'subtractive', waveform: 'saw',
//   unison: 7, detuneCents: 18, cutoffHz: 2800, ampAttackMs: 400, ... }
python
import libsonare as sonare

sonare.synth_preset_names()
# ['sine', 'saw', 'square', 'triangle', 'saw-lead', 'square-lead', 'sub-bass',
#  'warm-pad', 'e-piano', 'bell', 'brass', 'pluck', 'classical-guitar',
#  'steel-guitar', 'electric-guitar', 'harp', 'bass-acoustic', ...,
#  'church-organ', 'violin', 'clarinet', 'trumpet', 'concert-flute', ...,
#  'harp-plucked', 'koto', 'sitar', 'tanpura', ...]

pad = sonare.synth_preset_patch("warm-pad")
# SynthPatch(preset='warm-pad', engine_mode='subtractive', waveform='saw',
#            unison=7, detune_cents=18.0, cutoff_hz=2800.0, ...)

カタログとエンジンの対応は次のとおりです(各エンジンの感触は 1 行で十分つかめます)。

プリセットエンジン向いている用途
sine saw square triangle saw-lead square-lead sub-bass warm-padsubtractiveリード・ベース・パッド
e-pianofmエレピ・ベル・ブラス
classical-guitar steel-guitar electric-guitar harp bass-acoustic bass-fingered bass-picked bass-fretless bass-slapkarplus-strong撥弦とベース
marimba glass bellmodal音程のあるマレット
organadditiveドローバーオルガン
drum-kitpercussionGM ドラムマップ
acoustic-pianopianoアコースティックピアノ
church-organ church-flute church-bourdon church-trumpetpipe-organパイプオルガンのランク
violin viola cello contrabassbowed-stringボウイング弦
clarinet soprano-sax alto-sax tenor-sax baritone-sax oboe english-horn bassoonreedリード木管
brass trumpet trombone tuba french-horn muted-trumpet cornet flugelhorn euphoniumbrass金管
concert-flute piccolo recorder pan-flute shakuhachi tin-whistle ocarina blown-bottlefluteエアジェットフルートと笛
pluck harp-plucked koto sitar tanpuraplucked-stringバズブリッジの撥弦
choir-aah choir-ooh voice-eehvocal合唱・ソロの声
accordion harmonica bandoneon reed-organfree-reedアコーディオン、ハーモニカ、リードオルガン

下のロールは1つの3声フレーズをシーケンスし、bounceWithSynthInstrument(presetName, …) でバウンスします。楽器セレクタは、ピアノ、FM、撥弦、モーダル、オルガン、ボウイング弦、リード、金管、フルートの代表プリセットをまたぐので、同じ音符がそれぞれのエンジンの性格を帯びるのが聞き取れます。

MIDI · PIANO ROLLIDLE
MIDI のフレーズ — 同じ音符を、どの楽器でも

旋律・和音・低音の3声フレーズをピアノロールで表示します。音符はそのまま、楽器を切り替えると、まったく同じ MIDI をエンジンが別の内蔵音色でバウンスします。テンポを動かせばシーケンス全体が速く・遅くなります。再生でフレーズを試聴でき、再生ヘッドは音声に追従します。

楽器
テンポ
100 BPM

va: ルーティング接頭辞

プリセット名には va: 接頭辞を付けられます(例: va:saw-leadva:e-piano)。この接頭辞はプリセット名を受け取るすべての場所 — synthPresetPatchbounceWithSynthInstrumentsetSynthInstrument — で受け付けられ、接頭辞なしと同じパッチに解決されます。これは「このデスティネーションはバーチャルアナログの NativeSynth を鳴らす」と印を付けるためにホストが使うルーティング規約で、シンセは検索前に取り除きます。

drum-kit プリセットと GM ドラムマップ

drum-kitpercussion エンジンを選び、入ってくる MIDI ノートを General MIDI ドラムマップへ割り当てます。ノート番号をピッチとして扱うのではなく、ノート 36 はキック、ノート 38 はアコースティックスネア、というように対応づけます。ドラムパターンのノートを drum-kit をバインドしたデスティネーションへ送ると、各ノートが対応するパーツを鳴らします。

GS / GM ドラムキットバリエーション

drum-kit は GS 系のドラムキット選択(GS は Roland による General MIDI の拡張セット。キットはバンク128のプログラム番号で指定します)も認識し、ノートオンの時点で Standard キットをバリエーションごとに作り変えます。Room ならシェルの鳴りを増やし、Power なら音を下げて長くする、といった具合です。キット25では2つの命名体系が重なります。GS バンク128の名称と GM2 パーカッションセットの名称が異なるのは、両規格の性質によるもので不具合ではありません。

キット番号GS(バンク128)名GM2 パーカッションセット名Standard との音色差
0StandardStandard
8RoomRoomシェルの鳴りが増え、残響の尾が長くなる
16PowerPowerシェルが大きく/低く/長くなる
24ElectronicElectronicサイン波化し、乾いた膜音になる
25TR-808Analog定番の減衰サイン波キック/スネア/タム
32JazzJazzタイトで高め、柔らかい
40BrushBrushスネアが持続するスウィッシュ音になる
48OrchestraOrchestra膜/シンバルの尾が長くなる
56SFXSFXアドレスと名前は認識されるが、各ノートの SFX 音はまだモデル化されておらず Standard の音色で鳴る

SFX キットとサウンドエフェクト・プログラムはアドレスのみで未モデル化

GS 系の SFX ドラムキット(キット56)と GM のサウンドエフェクト・プログラム(120-127、後述の GM 音色マップを参照)は、アドレスと名前は認識されますが、各ノートの効果音はデータ非依存フォールバックではまだ個別に合成されていません。SFX キットは Standard キットの音色で鳴り、プログラム120-127は共通の汎用ノイズ音色を共有します。これらのアドレスに実際の効果音サンプルを持つ SoundFont を読み込めば、SF2 プレイヤー経由で通常どおり再生されます。

SynthPatch オブジェクト

SynthPatch は「プリセット + あなたの調整」と考えてください。ベース(名前付き preset。省略すると既定の減算合成 init パッチ)から始まり、設定した各フィールドがそのベースを上書きします。フィールドを省けば、ベース値がそのまま残ります。

初学者には、小さく戻しやすい調整から始めるのがおすすめです。たとえば warm-pad を選び、ampAttackMs を長くしてゆっくり立ち上がる音にする、cutoffHz を下げて暗い音にする、stereoSpread を上げて広がりを出す、という具合です。オブジェクト全体を埋める必要はありません。

「省略」と「0」は別物

ベースを上書きするかどうかを決めるのは、値ではなく設定されたかどうかです。数値フィールドを省けばベース値が残り、設定すれば可聴域にクランプされたうえでベースを上書きします。これは明示的な 0 も同じで、ampSustain: 0 と書けばサスティンは本当に 0 まで下がり、stereoSpread: 0 と書けば本当に中央へ寄ります。enum フィールドは従来どおり 'default' が「保つ」を意味します。

パッチはフィールドごとの「設定済みか」の記録を構造体バージョンとともに持っており、これが「省略」と「0」を区別しています。以前のビルドは両者を区別できず 0 を「未変更」として扱うほかなかったため、古いコードでは本当の 0 に近づけるために ampSustain: 0.001 のような便宜的な値を書くことがありました。この回避策はもう不要です。意図した 0 をそのまま書いてください。

もう 1 つのルールとして、空でない modRoutings 配列は、ベースのモッドマトリクスへ追加するのではなく、まるごと置き換えます。空配列は消去し、キーを省略した場合はベースのマトリクスが保たれます。

パッチは、すべてのエンジンが共有する共通部分を公開します。

SYNTH · SUBTRACTIVEIDLE
ADSR エンベロープ — 音の立ち上がりと減衰

同じ A3 を、振幅エンベロープで形づくります。アタックとディケイは音がピークへ到達し離れる速さを、サステインはキーを押している間に保つレベルを、リリースはキーを離した後の減衰を決めます。上段の輪郭がそのエンベロープです。コントロールを動かして形を見て、再生で確かめてください。(サステインを 0 まで下げると、キーを押したままでも音が減衰しきって無音になります。持続する音ではなく、弾いて減衰するだけの形です。)

アタック
8 ms
ディケイ
140 ms
サステイン
0.75
リリース
280 ms

セント・ベロシティ・キートラッキング

  • セント(cent) — 半音の 1/100 です。100 セントでピアノの 1 鍵分、1200 で 1 オクターブです。ピッチやデチューンの量はセントで表します。
  • ベロシティ — ノートをどれだけ強く弾いたか(0〜127)です。プリセットはこれで明るさや音量を制御します。
  • キートラッキング — フィルターカットオフなどのパラメータを、鍵盤を上がるほどノートの音高に追従させることです。
グループフィールド
オシレーターengineModewaveformunison(1-7)、detuneCentsdriftCentsdrive(0-1)
フィルターfilterModelfilterOutput(SVF のみ)、cutoffHzresonanceQkeyTrack(0-1)、envToCutoffCentsvelToCutoffCents
アンプエンベロープampAttackMsampDecayMsampSustainampReleaseMs
フィルターエンベロープfilterAttackMsfilterDecayMsfilterSustainfilterReleaseMs
LFO とグライドlfoRateHzlfoToPitchCentslfo2RateHzglideMs
ボディ共鳴bodynone / guitar / violin / wood-tube / brass-bell / vocal)、bodyMix(0-1)
ステレオと出力stereoSpread(0-1)、gain(リニア)、polyphony(1-64)、busDrive(0-1)
モッドマトリクスmodRoutings(最大 8 本)
バインディング(JS のみ)destinationId(既定 0

ポリフォニーは同時に鳴らせるノート数、ボイスは鳴っている 1 つのノートで、ボイススティールは足りなくなったとき最も古いノートを止めることです。)

LFO 2 にはルーティングが必要

2 つの LFO は挙動が異なります。LFO 1(lfoRateHz + lfoToPitchCents)はピッチへ固定配線されており、単独でビブラートを生みます。LFO 2 はマトリクス経由専用で、modRoutings のエントリが source: 'lfo2' で送り先を指定するまで、lfo2RateHz を設定しても何も起きません。

モッドルーティング{ source, destination, depth } です。モッドマトリクスにより、エンベロープ・LFO・ベロシティ・キートラッキング・モッドホイール・シード付きのボイスごとランダムソースが、ピッチ・フィルターカットオフ・音量・パンを変調できます。depth はソースが最大振れたときの destination 単位です。

SYNTH · SUBTRACTIVEIDLE
LFO トレモロ — 目に見える変調

LFO(低周波オシレーター)はピッチとして聴くには遅すぎ、代わりに別の何かを動かします。ここでは LFO 1 を振幅に接続 — トレモロ — しているので、エンベロープが平らに保たれず波打ちます。レートは脈打つ速さを、深さはその振れ幅を決めます。深さを 0 にすると波打ちが消え、ただの持続音になります。再生すると脈動が聴けます。これはモッドマトリクスの 1 接続で、同じ LFO をピッチに向ければビブラート、カットオフに向ければフィルターのうねりになります。

レート
6 Hz
深さ
0.6

body フィールドは NativeSynth のボディ/フォルマント共鳴層 — 楽器の物理的な筐体や声道がもつ共鳴的なキャラクターです。アコースティックギター、ハープ、ヴァイオリン属、木管、金管、合唱/声のフォールバックはこの層を使います。ソリッドボディのエレキは bodynone のままにできます。

ピッチベンド・コントローラーリセット・チャンネル単位の状態

NativeSynth はピッチベンドメッセージに反応し、ベンドレンジは RPN 0(ピッチベンドレンジの標準パラメータ。CC6/CC38 の Data Entry MSB/LSB 微細バイトペアで設定、既定は ±2 半音)に従います。MIDI の Reset All Controllers メッセージは、演奏系コントローラー(モッドホイール、エクスプレッション、ピッチベンド値、各ペダル)と RPN/NRPN の選択状態を既定へ戻しますが、ベンドレンジは設定した値のまま意図的に残します。±2 半音へ戻したいときは、RPN 0 をあらためて送ってください。必要なのは通常の MIDI イベントです。ピッチベンドイベント(オフラインなら Project.midiPitchBend(...) など)と、ストリーム中の RPN 0/Data Entry/リセットの各 CC です。

この状態はチャンネル単位で管理され、ノート単位ではありません。NativeSynth はポリフォニック(ノートごと)圧力もチャンネルプレッシャーも一切追跡せず、MIDI 2.0 のノートベロシティは 16 ビットのフル解像度ではなく通常の 7 ビットへ丸められます。MPE(MIDI Polyphonic Expression)スタイルのノートごとピッチベンド/プレッシャーやフル 16 ビットのベロシティが必要な場合は、代わりによりシンプルな内蔵の波形シンセ(setBuiltinInstrument)を使ってください。詳しくはMIDI 入力を参照してください。

ピアノ系のペダル操作も通常の MIDI CC としてデコードされます。ただし、サスティンペダル CC64 のハーフペダルダンピングが効くのは piano エンジンだけです。そこでは 64〜126 の中間値が、鍵を離して鳴り続けているノートを値に応じて減衰させます。他のエンジンでは CC64 は 64 を境にした単純なオン/オフのサスティンで、64 でも 126 でも 127 と同じ鳴り方になります。CC66 はソステヌート、CC67 は対応プリセットで una corda/ソフトペダルの音色として働きます。

enum 名テーブル

各 enum フィールドは、名前文字列または C の序数のどちらも受け付けます。名前と序数がずれないよう、synthEnumTables() でランタイムから正規のテーブルを取得してください。

typescript
import { init, synthEnumTables } from '@libraz/libsonare';

await init();
synthEnumTables();
// {
//   engineModes:      ['default', 'subtractive', 'fm', 'karplus-strong',
//                      'modal', 'additive', 'percussion', 'piano',
//                      'pipe-organ', 'bowed-string', 'reed', 'brass', 'flute',
//                      'plucked-string', 'vocal', 'free-reed'],
//   waveforms:        ['default', 'sine', 'saw', 'square', 'triangle', 'noise'],
//   builtinWaveforms: ['sine', 'saw', 'sawtooth', 'square', 'triangle'],
//   filterModels:     ['default', 'svf', 'moog-ladder', 'diode-ladder', 'sallen-key'],
//   filterOutputs:    ['default', 'lowpass', 'bandpass', 'highpass'],
//   bodyTypes:        ['default', 'none', 'guitar', 'violin', 'wood-tube',
//                      'brass-bell', 'vocal'],
//   modSources:       ['none', 'amp-env', 'filter-env', 'lfo1', 'lfo2',
//                      'velocity', 'key-track', 'mod-wheel', 'random'],
//   modDestinations:  ['none', 'pitch-cents', 'cutoff-cents', 'amp-gain', 'pan-units'],
// }

同じ配列は名前付き定数(SYNTH_ENGINE_MODESSYNTH_OSC_WAVEFORMSSYNTH_FILTER_MODELSSYNTH_FILTER_OUTPUTSSYNTH_BODY_TYPESSYNTH_MOD_SOURCESSYNTH_MOD_DESTINATIONS、および BUILTIN_SYNTH_WAVEFORMS)としてもエクスポートされます。多くのテーブルでインデックス 0 は 'default'(ベース値を保つ)で、modSources / modDestinations は代わりに 'none' を使います。

builtinWaveforms / BUILTIN_SYNTH_WAVEFORMS は別系統のリストです。これは NativeSynth の waveform フィールドではなく、最小構成の内蔵オシレーターシンセ(setBuiltinInstrument)が受け付ける名前を表します。'default' を持たず、'saw' に加えて 'sawtooth' も受け付け、'noise' は受け付けません。

オフラインでレンダー: bounceWithSynthInstrument

MIDI アレンジを音声化するには、NativeSynth インストゥルメントを MIDI デスティネーションへバインドしてバウンスします。プリセット名の文字列、SynthPatch、またはそのどちらかの配列を渡して、複数のデスティネーションを一度にバインドできます。配列を渡すと、各 SynthPatchdestinationId(既定 0)でバインドする MIDI デスティネーションを選べます。たとえば [{ preset: 'saw-lead', destinationId: 0 }, { preset: 'drum-kit', destinationId: 1 }] なら、1 回のレンダー呼び出しで 2 つのデスティネーションをレンダリングします。destinationId は JS のバインディング用の便宜機能で、NativeSynth パッチそのものの一部ではありません(Python ではデスティネーションを別の引数として渡します)。明示的に空の配列 [](または実行時の null)を渡すとバインディングは 0 件になります。引数を省略した場合や undefined を渡した場合は {} にフォールバックするため、既定パッチのバインディングが 1 件作られます。レンダーはプロジェクト・オプション・パッチが固定なら決定論的です。

パッチを固定せず GM プログラムに追従させる

バインディングは通常、1 つのデスティネーションに 1 つのパッチを固定します。MIDI にどんな プログラムチェンジが入っていても、そのデスティネーションを通る音はすべて同じ音色で鳴ります。一般的な MIDI ファイルではこれは望ましくありません。チャンネルごとに自分の楽器を選んでほしいからです。

GM プログラム追従を有効にすると、シンセはメロディックなボイスを、追跡しているバンクと プログラムチェンジから解決し、MIDI チャンネル 10 は GM ドラムキットマップへルーティング します。マップが対応しない部分にはバインドしたパッチがフォールバックとして残るので、 音が消えることはありません。モードを切っていれば、上記の固定パッチの挙動は変わりません。

python
# Python
audio = project.bounce_with_synth_instrument(
    "acoustic-piano",          # マップ外プログラムのフォールバック
    auto_select_gm=True,
    sample_rate=48000,
)
typescript
// JS バインディングのオプションは SynthPatch オブジェクトに指定する(文字列には指定できない)。
const audio = project.bounceWithSynthInstrument(
  { preset: 'acoustic-piano', useGmPrograms: true },
  { totalFrames: 48000, numChannels: 2 },
);

このフラグは C ABI の SonareSynthInstrumentBinding では use_gm_programs、Python では auto_select_gm、WASM/Node の JavaScript では SynthPatch 記述子の useGmPrograms です。 いずれも既定値は false で、固定パッチをフォールバックにする挙動を保ちます。 useGmPrograms は JS バインディングの便宜機能で、NativeSynth パッチのフィールドではありません。 2 つの CLI では値なしの --synth フラグがこれにあたります (sonare project bounce --in project.json --synth -o out.wav)。プリセット名を渡した場合は そのパッチに固定されます。

typescript
import { init, Project } from '@libraz/libsonare';

await init();

const project = new Project();
project.setSampleRate(48000);

// MIDI クリップ 1 つ: 出力先 0 へルーティングした 2 拍の C4 ノート
const { trackId, clipId } = project.addMidiClip(0, 4);
project.setTrackMidiDestination(trackId, 0);
project.setMidiEvents(clipId, [
  Project.midiNoteOn(0, 0, 0, 60, 100),
  Project.midiNoteOff(2, 0, 0, 60, 0),
]);

try {
  // 名前付きプリセットを出力先 0 へバインドしてステレオでレンダー
  const audio = project.bounceWithSynthInstrument('va:saw-lead', {
    totalFrames: 48000,
    numChannels: 2,
  });
  // audio はインターリーブの Float32(frames * channels)。無音ではない
} finally {
  project.delete();   // WASM ハンドルは GC されない — 必ず解放する
}
python
import libsonare as sonare

project = sonare.Project()
project.set_sample_rate(48000)

track_id, clip_id = project.add_midi_clip(0, 4)
project.set_track_midi_destination(track_id, 0)
project.set_midi_events(clip_id, [
    sonare.Project.midi_note_on(0, 0, 0, 60, 100),
    sonare.Project.midi_note_off(2, 0, 0, 60, 0),
])

# 名前付きプリセットを出力先 0 へバインドしてレンダー -> (frames, channels) float32
audio = project.bounce_with_synth_instrument(
    "va:saw-lead", total_frames=48000, num_channels=2,
)
project.close()
bash
# --synth <preset> はオシレーター波形に限らず、NativeSynth プリセットカタログの
# どの名前でも受け付けます。全一覧は `sonare project synth-presets` で取得できます。
# 値なしの --synth はプロジェクトの GM プログラムチェンジに追従します。
# プリセット名ではなくカスタムの SynthPatch オブジェクトを渡せるのはバインディング
# 専用です(上のブラウザ/Python を参照)。
sonare project bounce --in song.json -o synth.wav --synth saw
sonare project bounce --in song.json -o pad.wav --synth warm-pad

カスタマイズするには、名前の代わりに SynthPatch を渡します。プリセットを出発点に上書きしてください。

typescript
const audio = project.bounceWithSynthInstrument(
  {
    preset: 'warm-pad',
    cutoffHz: 1200,                // プリセットの 2800 Hz より暗く
    resonanceQ: 3,
    modRoutings: [{ source: 'lfo1', destination: 'cutoff-cents', depth: 600 }],
  },
  { totalFrames: 48000, numChannels: 2 },
);

totalFrames を 0 のままにすると、アレンジとパッチのリリーステイルから長さを自動導出します。未知のプリセット名は例外を投げます。bounceWith* が共有するチャンネル・サンプルレート・レイテンシなどは プロジェクトバウンス を参照してください。

ライブでレンダー: setSynthInstrument + MIDI 入力

対話的な再生では、RealtimeEngine のデスティネーションにシンセをバインドして MIDI を送ります。次のスニペットは制御スレッドだけで動き(AudioWorklet 不要)、非ゼロのサンプルを生成します。

typescript
import { init, RealtimeEngine } from '@libraz/libsonare';

await init();

const engine = new RealtimeEngine(48000, 128);
try {
  engine.setSynthInstrument('va:saw-lead', 7);   // 出力先 7 へバインド
  engine.pushMidiNoteOn(7, 0, 0, 60, 100);       // 出力先, グループ, チャンネル, ノート, ベロシティ

  const out = engine.process([new Float32Array(128), new Float32Array(128)]);
  // out[0] / out[1] がレンダー済みのステレオブロック。無音ではない

  engine.midiInstrumentCount();                   // 1
} finally {
  engine.destroy();   // ネイティブハンドルを解放
}

実際のアプリではライブキーボードから pushMidiNoteOn / pushMidiNoteOff / pushMidiCc を呼ぶか、エンジン所有の MIDI 入力ソースを有効にしてイベントを到着順に送ります。詳しくは MIDI 入力 を参照してください。setSynthInstrument はプリセット名や SynthPatchbounceWithSynthInstrument とまったく同じように解決するため、オフラインで作り込んだ音色がライブでも同一に鳴ります。

NativeSynth と SoundFont フォールバック

NativeSynth は SoundFont プレイヤーの下にあるセーフティネットです。bounceWithSf2Instrument でレンダーする(またはライブで SF2 をバインドする)と、libsonare はアレンジが実際に鳴らす各 (channel, bank, program) を解決します。

  • 読み込んだ SoundFont がそのプログラムをカバーしていれば、そのノートは SF2 から鳴ります(GS バリエーションとドラムフォールバックを含む)。
  • そうでなければ — SoundFont を一切読み込んでいない場合も含めて — そのノートは NativeSynth の GM フォールバックバンク(128 種すべてのプログラムとドラムマップ)で鳴ります。

レンダー前にプログラムごとのバックエンドを確認するには soundFontManifest() を使います。最初に使われる順に、各プログラムについて 'sf2''synth' を報告します。

typescript
project.loadSoundFont(sf2Bytes);
const manifest = project.soundFontManifest();
// [{ channel, bank, program, backend: 'sf2' | 'synth', presetName }, ...]

GM フォールバックバンクが常に存在するため、データがないという理由で MIDI が無音になることはありません。SF2 データの読み込みやチャンネル/プログラムごとの解決は SoundFont プレイヤー を参照してください。

GM フォールバックのプログラムルーティング

フォールバックバンクは、GM プログラムのファミリーごとに最も近い NativeSynth エンジンを使います。楽器の挙動の違いが重要な箇所では、プログラム単位の上書きがあります。アコースティック楽器系の行はまだキャリブレーション対象の仮実装なので、完成済みのサンプル楽器並みのリアリティではなく、ルーティング上の対応範囲として読んでください。

GM プログラム楽器フォールバックエンジン理由
4-5Electric Piano 1 / 2fmタイン/ベル的な明るさを位相変調で表現
6Harpsichordkarplus-strongクイルで撥弦する、ベロシティ依存の小さい弦音
7Clavifm打弦とピックアップの色づけを、現状は FM で近似
8, 10, 14Celesta, Music Box, Tubular Bellsmodalフェルトで打つスティールバー、ツインティースによるタインの揺らぎ、基音を持たない打撃ピッチ
9, 11-13Glockenspiel, Vibraphone, Marimba, Xylophonemodal調律されたバーの共鳴
15Dulcimerkarplus-strong暫定実装。撥弦ではなく打弦
16-23Organ familyadditive / pipe-organ / free-reedドローバー系レジストレーション(16-18)、仮実装の教会オルガンのフルーパイプ(19)、フリーリードのリードオルガン、ハーモニカ、バンドネオン(20-23)
24-31Guitar familykarplus-strong撥弦の導波路モデル
32-37Acoustic, electric, fretless, slap basskarplus-strongベース弦導波路。スラップ/偏波はプログラム別
40-43Violin, Viola, Cello, Contrabassbowed-string仮実装の摩擦励起型・持続弦導波路
44Tremolo Stringssubtractiveデチューンしたのこぎり波セクションにアンプトレモロ LFO を重ねたもので、擦弦モデルではない
45-46Pizzicato Strings, Orchestral Harpkarplus-strongヴァイオリンボディまたはスチール弦のコーパスへの短い撥弦
47Timpanipercussionノートトラッキングするケトルドラムのフォールバックボイス
48String Ensemble 1subtractiveソロ弓弦ではなく、パッド的なアンサンブル音色
52-54Choir Aahs, Voice Oohs, Synth Voicevocalソースフィルター方式のボイス(声門音源+母音フォルマントバンク)で、減算合成のパッドではない
56-60Trumpet, Trombone, Tuba, Muted Trumpet, French Hornbrass仮実装のリップリード金管導波路
61-63Brass Section, Synth Brass 1 / 2fm金管導波路ではなく、設計上 FM
64-71Saxophones, Oboe, English Horn, Bassoon, Clarinetreed仮実装のリードと管体の導波路
72-79Piccolo, Flute, Recorder, Pan Flute, Bottle, Shakuhachi, Whistle, Ocarinaflute仮実装のエアジェット/開管導波路
104, 106, 107Sitar, Shamisen, Kotoplucked-stringバズブリッジ(ジャワリ/サワリ)の撥弦。バンジョー(105)は karplus-strong のまま
112-119Tinkle Bell, Agogo, Steel Drums, Woodblock, Taiko Drum, Melodic Tom, Synth Drum, Reverse Cymbalpercussionノートトラッキングするパーカッションエンジンのボイスで、ドラムキットのマップとは別

プログラム6(Harpsichord)は、フォールバックが Bank Select も読み取る唯一の GM プログラムです。バンク0はプレーンな8'レジストレーション、バンク1はオクターブ(8'+4')ミックス、バンク2は2クワイアのワイドステレオ、バンク3はキーオフのジャックノイズを加えます。

このルーティングは名前付きプリセットカタログとは別です。synthPresetNames() が返すのは手で設計されたプリセット(e-pianoharpdrum-kit など)であり、GM フォールバックバンクは SF2 フォールバック時に MIDI プログラム番号ごとの内部パッチを選びます。

GM 音色マップ — 全128プログラム

General MIDI の各プログラムは、15エンジンのいずれかに解決されます。下表は、SoundFont がそのプログラムを持たないときに NativeSynth が使うデータ非依存のフォールバック音色です(各プログラムの正式名称は実行時に Project.gmInstrumentName(program) からも取得できます)。「暫定」と付いた行は、較正が続いているアコースティック系の物理モデルを使います。

全128プログラムの音色マップを表示

モデルの状態安定: 減算合成、FM、モーダル、加算、パーカッションの各コアは成熟しています。暫定: ピアノ、Karplus-Strong、パイプオルガン、擦弦、リード、金管、フルート、撥弦(バズブリッジ)、ボイス、フリーリードの各物理モデルはまだ較正が続いています。

ピアノ(0-7)

Prog楽器エンジン備考
0Acoustic Grand Pianopiano暫定。共有のモーダル響板
1Bright Acoustic Pianopiano暫定
2Electric Grand Pianopiano暫定(FM ではなくアコースティック導波路)
3Honky-tonk Pianopiano暫定
4Electric Piano 1fmタイン/ベルの FM
5Electric Piano 2fmEP1 と同じ音作り
6Harpsichordkarplus-strongクイルで撥弦。バンクを認識するレジストレーション(前述の注記を参照)
7Clavifm明るい高比率の FM

クロマチックパーカッション(8-15)

Prog楽器エンジン備考
8Celestamodal柔らかいフェルト打撃のスティールバー
9Glockenspielmodal一様バーのモード比
10Music Boxmodalツインティースのうなりでタインの揺らぎを表現
11Vibraphonemodalモーターによるトレモロ(LFO → 音量)
12Marimbamodal深いアーチのバー、木管ボディ
13Xylophonemodal短く乾いた深いアーチのバー
14Tubular Bellsmodal基音を持たない打撃ピッチ、長い残響
15Dulcimerkarplus-strong暫定。撥弦ではなく打弦

オルガン(16-23)

Prog楽器エンジン備考
16Drawbar Organadditive9ドローバーのハモンド
17Percussive Organadditive
18Rock Organadditive
19Church Organpipe-organ暫定。マルチランクのプレナム
20Reed Organfree-reed暫定。ハルモニウム — 柔らかなプレート、柔らかいリード
21Accordionfree-reed暫定。リードオルガンの音作りを共有
22Harmonicafree-reed暫定。小さく明るい硬いリード+ハンドビブラート
23Tango Accordionfree-reed暫定。バンドネオン、ミュゼット(うなりのある)デチューン

ギター(24-31)

Prog楽器エンジン備考
24Acoustic Guitar (nylon)karplus-strong暫定。柔らかい撥弦、分散なし
25Acoustic Guitar (steel)karplus-strong暫定。スチール弦の分散+共鳴弦
26Electric Guitar (jazz)karplus-strong暫定。ブリッジ寄りピックアップ、ボディなし
27Electric Guitar (clean)karplus-strong暫定。jazz と同じ音作り
28Electric Guitar (muted)karplus-strong暫定。ミュート(パームミュート)による減衰
29Overdriven Guitarkarplus-strong暫定。フィルター前段のドライブ
30Distortion Guitarkarplus-strong暫定。より強いドライブ
31Guitar Harmonicskarplus-strong暫定

ベース(32-39)

Prog楽器エンジン備考
32Acoustic Basskarplus-strong暫定。大きく共鳴するボディ
33Electric Bass (finger)karplus-strong暫定。ピックアップ+2偏波のうなり
34Electric Bass (pick)karplus-strong暫定。ブリッジ寄りの明るいアタック
35Fretless Basskarplus-strong暫定。丸くグライドしやすい
36Slap Bass 1karplus-strong暫定。サムスラップ+フレットスラップのバズ
37Slap Bass 2karplus-strong暫定。より鋭いポップ
38Synth Bass 1subtractive設計上のシンセベース
39Synth Bass 2subtractive設計上のシンセベース

弦(40-47)

Prog楽器エンジン備考
40Violinbowed-string暫定
41Violabowed-string暫定。より暗く遅い
42Cellobowed-string暫定
43Contrabassbowed-string暫定。最も暗く遅い
44Tremolo Stringssubtractiveデチューンしたのこぎり波セクション+アンプトレモロ LFO
45Pizzicato Stringskarplus-strong暫定。ヴァイオリンボディへの短い撥弦
46Orchestral Harpkarplus-strong暫定。長く減衰しにくい響き
47Timpanipercussionノートトラッキングするケトルドラム

アンサンブル(48-55)

Prog楽器エンジン備考
48String Ensemble 1subtractiveセクションビブラートを持つ幅広のスーパーソウパッド
49String Ensemble 2subtractive
50SynthStrings 1subtractive
51SynthStrings 2subtractive
52Choir Aahsvocal暫定。開いた /a/ 母音、声門音源+フォルマント
53Voice Oohsvocal暫定。より暗く口を閉じた /u/ 母音
54Synth Voicevocal暫定。より明るく安定した合成母音
55Orchestra Hitsubtractive明るいデチューンのこぎり波のスタブ

金管(56-63)

Prog楽器エンジン備考
56Trumpetbrass暫定。リップリード導波路
57Trombonebrass暫定
58Tubabrass暫定。暗く円錐管
59Muted Trumpetbrass暫定。物理的なミュートモデル
60French Hornbrass暫定。より丸い円錐管
61Brass Sectionfm設計上 FM(金管導波路ではない)
62SynthBrass 1fm設計上 FM
63SynthBrass 2fm設計上 FM

リード(64-71)

Prog楽器エンジン備考
64Soprano Saxreed暫定。円錐管
65Alto Saxreed暫定。円錐管
66Tenor Saxreed暫定。円錐管
67Baritone Saxreed暫定。円錐管、サックスの中で最も暗い
68Oboereed暫定。円錐管、明るく鼻にかかった音
69English Hornreed暫定。円錐管
70Bassoonreed暫定。円錐管、低音
71Clarinetreed暫定。円筒管(奇数次倍音)

パイプ(72-79)— エアジェットフルートエンジン

Prog楽器エンジン備考
72Piccoloflute暫定。最も明るい
73Fluteflute暫定
74Recorderflute暫定
75Pan Fluteflute暫定。息っぽい渦流
76Blown Bottleflute暫定。暗く高いダンピング
77Shakuhachiflute暫定。最も息っぽい
78Whistleflute暫定
79Ocarinaflute暫定。閉じた容器の質感

シンセリード(80-87)— すべて減算合成

Prog楽器エンジン備考
80Lead 1 (square)subtractiveMoog ラダーフィルターを通す3オシレーターのデチューンリード
81Lead 2 (sawtooth)subtractive
82Lead 3 (calliope)subtractive
83Lead 4 (chiff)subtractive
84Lead 5 (charang)subtractive
85Lead 6 (voice)subtractive
86Lead 7 (fifths)subtractive
87Lead 8 (bass + lead)subtractive

シンセパッド(88-95)— すべて減算合成

Prog楽器エンジン備考
88Pad 1 (new age)subtractive7オシレーターのスーパーソウパッド
89Pad 2 (warm)subtractive
90Pad 3 (polysynth)subtractive
91Pad 4 (choir)subtractive
92Pad 5 (bowed)subtractive
93Pad 6 (metallic)subtractive
94Pad 7 (halo)subtractive
95Pad 8 (sweep)subtractive

シンセエフェクト(96-103)— すべて減算合成

Prog楽器エンジン備考
96FX 1 (rain)subtractive揺らぐデチューン三角波
97FX 2 (soundtrack)subtractive
98FX 3 (crystal)subtractive
99FX 4 (atmosphere)subtractive
100FX 5 (brightness)subtractive
101FX 6 (goblins)subtractive
102FX 7 (echoes)subtractive
103FX 8 (sci-fi)subtractive

エスニック(104-111)— バズブリッジ撥弦 + karplus-strong

Prog楽器エンジン備考
104Sitarplucked-string暫定。ジャワリブリッジのバズ、長くきらめく響き
105Banjokarplus-strong暫定。共有の撥弦スケッチ
106Shamisenplucked-string暫定。サワリのバズ、シタールより乾いて硬い
107Kotoplucked-string暫定。ブリッジバズの撥弦
108Kalimbakarplus-strong暫定。共有の撥弦スケッチ
109Bag pipekarplus-strong暫定。共有の撥弦スケッチ(リードドローンはまだない)
110Fiddlekarplus-strong暫定。共有の撥弦スケッチ(擦弦ではまだない)
111Shanaikarplus-strong暫定。共有の撥弦スケッチ(リードモデルはまだない)

パーカッシブ(112-119)— すべてパーカッション

Prog楽器エンジン備考
112Tinkle Bellpercussionまばらな非調和モード
113Agogopercussion2音のメタルベル
114Steel Drumspercussionほぼ調和的なモード
115Woodblockpercussion非常に短く、スティックのクリック音付き
116Taiko Drumpercussion強いピッチドロップ+シェルの鳴り
117Melodic Tompercussionノートトラッキング、シェルボディ付き
118Synth Drumpercussion減衰するサイン波の電子ドラム
119Reverse Cymbalpercussion長く立ち上がるスウェル(逆再生を模擬)

サウンドエフェクト(120-127)— 汎用プレースホルダー

GM · FALLBACKIDLE
GM サウンドエフェクト — データ非依存フォールバック

General MIDI のサウンドエフェクト・ファミリー(プログラム120〜127)の内蔵フォールバックを、SoundFont を読み込まずに試聴します。現在のビルドでは、これら8つのプログラムは共通の汎用ノイズ系プレースホルダー音色を共有しており、あえて似た音になります(効果音ごとの個別モデル化は今後の対応です)。実際の効果音サンプルを持つ SoundFont を読み込めば、これらのアドレスはそのサンプルを鳴らします。再生で現在のデータ非依存フォールバックを聴けます。

プログラム

上のデモでは、GM のサウンドエフェクト・プログラム8個を実際に試聴できます。これらが現状1つの音色を共有していることを、手早く確認できます。

Prog楽器エンジン備考
120Guitar Fret Noisesubtractive汎用の共鳴ノイズプレースホルダー(下の注記を参照)
121Breath Noisesubtractive汎用の共鳴ノイズプレースホルダー
122Seashoresubtractive汎用の共鳴ノイズプレースホルダー
123Bird Tweetsubtractive汎用の共鳴ノイズプレースホルダー
124Telephone Ringsubtractive汎用の共鳴ノイズプレースホルダー
125Helicoptersubtractive汎用の共鳴ノイズプレースホルダー
126Applausesubtractive汎用の共鳴ノイズプレースホルダー
127Gunshotsubtractive汎用の共鳴ノイズプレースホルダー

120-127についての注記: データ非依存フォールバックでは、この8プログラムは現状、共通の「ノイズ→共鳴バンドパス」音色を1つ共有しており、鳴らすノートによってのみ違いが出ます。個別の効果音を作るプロシージャルモデルはまだありません。これらのプログラムをカバーする SoundFont を読み込めば、そちらのサンプルが再生されます。

現状と制限

物理モデルは暫定であり、較正は継続中です。 15エンジンのうち10個(ピアノ、撥弦(Karplus-Strong)、擦弦、リード木管、金管、エアジェット・フルート、パイプオルガン、バズブリッジ撥弦、ソースフィルターボイス、フリーリード)はアコースティック楽器の暫定的な物理モデルです(モーダルと膜鳴パーカッションも物理モデルですが、こちらは既に成熟しています。後述)。これらはデータ非依存のプレビューおよび GM フォールバックの土台を目的としており、サンプル音源の完成版を置き換えるものではありません。音作りは、参照 SoundFont と比較する開発者向けの A/B ハーネスで調整していますが、これは手動かつ継続中の作業であり、自動較正でも参照楽器に対する検証済みでもなく、調整は完了していません。直近もピアノ・オルガン・金管・リード・ヴァイオリン属の音作りの再調整が続いています。

一部の高度な物理は実装済みですが、まだ到達できません。 擦弦・リード・金管・フルートの各エンジンには、より高度な非線形の要素(弾塑性の弓摩擦、トーンホール散乱、金管の「キュイヴレ」の輝き、フルートのオーバーブロー等)が含まれます。これらはコアに存在しますが既定でオフで、有効化するスイッチを公開しているバインディングはまだありません。したがって現状の音は、より単純な線形モデルです。今後のリリースで到達可能になり、音作りも改善が続く見込みです。

自己発振する一部のモデルにはわずかな残留音程誤差があります。 エアジェット・フルートとフルー式パイプオルガンは素朴なチューニングからわずかにずれてロックするため、較正係数で補正していますが、音域に依存する小さな残差が残ります。

残る5エンジンは安定しています。 減算(バーチャルアナログ)、FM、加算(ドローバーオルガン)は信号ベース(非物理)で、モーダル(マレット/ベル)と膜鳴(パーカッション)は既に成熟した物理モデルです。いずれも暫定的な注意書きはなく、安定したコアです。

音の出どころについて。各合成エンジンは、公開されている合成・物理モデリングのアルゴリズム系統を独自に実装したものであり、GM/GS の挙動は公開されている General MIDI/GS のアドレス指定に従います。サンプリングや録音による楽器音は同梱しておらず、特定機器の複製ではなく独立した再構成です。各エンジンの背景にある標準や論文については、アルゴリズム根拠を参照してください。

レシピ

1 つのプロジェクトで全エンジンを試聴

同じ MIDI クリップを、エンジンごとに 1 プリセットでバウンスして各ボイスを聴き比べます。

typescript
const project = new Project();
project.setSampleRate(48000);
const { trackId, clipId } = project.addMidiClip(0, 4);
project.setTrackMidiDestination(trackId, 0);
project.setMidiEvents(clipId, [
  Project.midiNoteOn(0, 0, 0, 60, 100),
  Project.midiNoteOff(2, 0, 0, 60, 0),
]);
try {
  for (const preset of ['saw-lead', 'e-piano', 'electric-guitar',
                         'marimba', 'organ', 'drum-kit', 'acoustic-piano',
                         'church-organ', 'violin', 'clarinet', 'trumpet',
                         'concert-flute']) {
    const audio = project.bounceWithSynthInstrument(preset, { totalFrames: 48000 });
    // 各プリセットの音声をレンダー/確認
  }
} finally {
  project.delete();
}
GM ドラムマップでドラムパターンを鳴らす

ドラムノート(キック 36、スネア 38、ハット 42、...)を drum-kit をバインドしたデスティネーションへ送ります。

typescript
project.setMidiEvents(clipId, [
  Project.midiNoteOn(0, 0, 9, 36, 110),   // キック
  Project.midiNoteOff(1, 0, 9, 36, 0),
  Project.midiNoteOn(0, 0, 9, 38, 100),   // スネア
  Project.midiNoteOff(1, 0, 9, 38, 0),
]);
const audio = project.bounceWithSynthInstrument('drum-kit', { totalFrames: 24000 });

各ノートはピッチとしてではなく、対応する GM のパーツを鳴らします。

LFO ワブルを足したカスタムパッチ

warm-pad を出発点に、フィルターを暗くし、LFO 1 でカットオフをゆらします。

typescript
const audio = project.bounceWithSynthInstrument(
  {
    preset: 'warm-pad',
    cutoffHz: 1200,
    resonanceQ: 3,
    lfoRateHz: 6,
    modRoutings: [{ source: 'lfo1', destination: 'cutoff-cents', depth: 600 }],
  },
  { totalFrames: 48000, numChannels: 2 },
);

空でない modRoutings は、プリセットのモッドマトリクスをまるごと置き換えます。

関連