シンセの音作りの基礎
シンセサイザーは、録音を再生するのではなく、音をゼロから生成する楽器です。シンセのノートの裏側にはマイクも音声ファイルもありません。コンピューターが波形をサンプル単位で、リアルタイムに計算します。これが、録音を再生する サンプル音源 とシンセサイザーを分ける唯一の本質的な違いです。
本ページでは、あらゆるシンセに共通する構成要素を説明し、続いて選択できる 17 種類の音作り方式(エンジン)を紹介します。概念のみで、コードはありません。
なぜ録音せず生成するのか
生成されたノートは、どんな高さ・長さ・音色にもでき、録音データを保存する必要もありません。「録音を引き伸ばす」ことで起きる不自然さも避けられます。代わりに、音は設計する必要があります。誰かが波形を選び、整形し、どう変化させるかを決めます。その設計をパッチと呼びます。
古典的な 3 つのブロック
どれほど複雑でも、ほとんどのシンセ音は 3 段の連なりから生まれます。信号は左から右へ流れ、各段はより仕上がった信号を次の段へ渡していきます。オシレーターの生の音はフィルターで整形され、フィルターが整形した音にアンプが音量の形を与えます。
1. オシレーター(生の音)
オシレーターは、ノートのピッチで連続して繰り返す波を作ります。その波形が音の生の色を決めます。波形ごとに、基音の上に積み重なる 倍音成分 の混ざり方が異なるからです。
| 波形 | 聞こえ方 | 理由 |
|---|---|---|
| サイン波 | 純粋で、空洞のような、フルートに近い音 | 基音のみで倍音がない |
| ノコギリ波 | 明るく、ブザーのように厚い音 | すべての倍音を含む。定番のシンセリード/ベース |
| 矩形波 | 空洞のような、木質の、リード楽器的な音 | 奇数倍音のみ |
| 三角波 | 柔らかくまろやかな音 | 奇数倍音だが弱く、サイン波に近い |
| ノイズ | ピッチのないノイズ | すべての周波数が同時に鳴る。打楽器・風・息に使う |
倍音、部分音、インハーモニシティ
音に含まれる周波数成分の 1 つ 1 つを部分音と呼びます。部分音が基音のちょうど整数倍(f、2f、3f…)に並ぶとき、それを倍音と呼び、耳には 1 つのはっきりした音高が聞こえます。上の表の音高を持つ波形は、どれもこの形で作られています。実際の弦や棒や鐘には硬さがあるので、部分音は整数倍から、たいていは高い側へずれます。このずれがインハーモニシティ(非調和性)です。硬い弦では n 番目の部分音が fₙ = n · f₀ · √(1 + B·n²) に来ます。B は小さな硬さの係数で、ピアノの A4 ではおよそ 0.0008 です。これだけでも 10 番目の部分音は 10 × f₀ より約 64 セント高くなります。この伸びはピアノらしさの一部で、内蔵のピアノモデルはこれを再現しています。
デジタルのノコギリ波に注意が要る理由:エイリアシング
ノコギリ波や矩形波は倍音を際限なく含みますが、デジタル信号が保持できるのはサンプルレートの半分(ナイキスト周波数。48 kHz なら 24 kHz)より下の周波数だけです。素朴に計算したノコギリ波はそこで止まらず、ナイキストより上の倍音が下へ折り返してエイリアシングになります。音符に従わない非調和な音で、高い音ほど目立ちます。NativeSynth の減算式オシレーターはこれを避けるために帯域制限されています。ノコギリ波と矩形波は、跳躍のたびに短い多項式の補正(PolyBLEP。多項式で帯域制限したステップ)でなめらかにし、三角波はその補正済み矩形波を積分して作ります。出力段の sampleHoldHz と bitDepth は、ローファイ効果として意図的にエイリアシングを持ち込みます。
2. フィルター(音色を整える)
フィルターは周波数成分の一部を削ったり持ち上げたりします。最も一般的なのはローパスフィルターで、低域を残して高域を落とします。重要なつまみは 2 つです。
- カットオフ:フィルターがエネルギーを削り始める周波数です。下げると音は暗くこもり、上げると明るくなります。
- レゾナンス:カットオフ周波数の直上を持ち上げる量です。少量で声のような「ワウ」の強調が加わり、多量だとフィルターが共鳴して口笛のように鳴ります。
カットオフを時間とともにスイープさせる動きは、最もシンセらしい音の動きです。その動きをどう作るかは エンベロープとモジュレーション を参照してください。
3. アンプ(時間にわたる音量)
アンプは、キーを押した瞬間から音が完全に消えるまでのノートの音量を制御します。生のオシレーターは延々と鳴り続けるだけですが、エンベロープで制御されたアンプがノートに始まり・本体・終わりを与えます。弾いた瞬間のアタック、ゆっくりとした立ち上がり、長い余韻です。
エンベロープそのもの(4 つの段階とその聴き方)は エンベロープとモジュレーション で扱います。
17 種類の音作り方式
上記のブロックは減算式の音作りを説明したものですが、音の作り方はそれだけではありません。libsonare 内蔵の楽器エンジンである NativeSynth は 17 種類のエンジンを備え、それぞれ異なる楽器に向いています。
| エンジン | 音の作り方 | 向いている用途 |
|---|---|---|
| 減算式/バーチャルアナログ | オシレーター → フィルター → アンプ(上記の古典的な連なり) | リード、ベース、パッド |
| FM | 1 つのオシレーターが別のオシレーターのピッチを変調する | 金属的な音、ベル、エレクトリックピアノ、クラビ系の鍵盤音 |
| Karplus-Strong | 短いフィードバックディレイのループで弦の振動を模す | 撥弦楽器、ギター、ベース、ハープ |
| モーダル | 同調した共鳴器のバンクで打たれた物体を模す | マリンバ、グロッケンシュピール、打たれたバーやベル |
| 加算式/ドローバー | 倍音のサイン成分を足し合わせる(オルガンのドローバーのように) | トーンホイールオルガン、倍音パッド |
| 膜鳴(膜)打楽器 | 太鼓の膜の振動モードを模す | ドラム、タム、打楽器 |
| 拡張導波路ピアノ | 打弦されたピアノ弦の物理モデル | アコースティックピアノ |
| パイプオルガン | 風圧とランク挙動を持つ持続型フルーパイプ導波路 | 教会オルガンのストップ |
| 擦弦 | 摩擦励起の弦導波路 | ヴァイオリン、ヴィオラ、チェロ、コントラバス |
| リード木管 | リードと管体の導波路 | クラリネット、サックス、オーボエ、ファゴット |
| 金管 | リップリード金管導波路 | トランペット、トロンボーン、チューバ、ホルン |
| フルート | エアジェットが開管導波路を励起する | フルート、リコーダー、パンフルート、笛 |
| バジングブリッジ撥弦 | 駒を弦に触れさせて、エネルギーを上側の倍音へ撒き散らせる撥弦。buzz が 0 なら終端はクリーンなまま(ハープ、箏) | シタール、箏、ハープ |
| ソース・フィルター声 | 声門音源(ブザー的なノコギリ波)を母音の フォルマント(母音の違いを生む共鳴のピーク)を再現した共鳴器バンクで整形する | 合唱・独唱の母音 |
| フリーリード | 空気流に駆動され、スロット内で振動する金属の舌。数セント高い 2 枚目の舌を加えると、揺らめくミュゼットのうなりが生まれる | アコーディオン、ハーモニカ、バンドネオン |
| ハープシコード | ジャック&プレクトラムの機構が、独立した弦のレジストレーションを弾く。2 組の 8′ ユニゾンと 1 組の 4′ オクターブは、ミックスつまみ付きの 1 本の弦ではなく 3 本の独立した弦 | ハープシコード |
| サンプル | 利用者が用意した PCM 音声を鍵盤上にマッピングして再生し、他のエンジンと同じフィルター・エンベロープ・モッドマトリクスを通す | 自前の録音、ワンショットのドラム |
FM を一言で
FM(周波数変調)では、倍音豊かな波形をフィルターで削る代わりに、2 つの単純なサイン波オシレーターを使い、一方にもう一方のピッチを高速で揺らさせます。その結果、減算式では作りにくい、複雑で金属的・ベル的な音色が得られます。
FM:オペレーター、比率、インデックス、アルゴリズム
FM には独自の小さな語彙があり、fm エンジンのパラメータはそのすべてを使います。
- オペレーターは、自分のエンベロープと出力レベルを持つ 1 つのサイン波オシレーターです。NativeSynth の
fmエンジンは最大 4 つ(ops0〜ops3)を持ちます。 - キャリアは耳に聞こえるオペレーターです。モジュレーターは直接は聞こえないオペレーターで、その出力がキャリアの位相を前後に揺らし、その動きが部分音を増やします。
- 比率は、オペレーターの周波数をノートの何倍にするかです。キャリアとモジュレーターが整数比(1 : 1、1 : 2、1 : 3)なら、増えた部分音は倍音の位置に乗り、音高のはっきりした音になります。高めの整数比(たとえば e-piano プリセットがティンに使う 14 : 1)では高い倍音が足され、すぐに消えるので、叩いたティンの「ピン」という音になります。1 : 1.41 のような整数でない比率なら部分音が倍音の間に入り、ベルのような音になります。
- モジュレーションインデックスは、モジュレーターがどれだけ強く揺らすかで、位相の振れ幅をラジアンで表します。モジュレーターでは、オペレーターの
levelがこのインデックスです。0 ならキャリアはただのサイン波で、インデックスが上がるほどエネルギーが多くの高い部分音へ広がり、音が明るくなります。モジュレーターはそれぞれ自分のエンベロープに従うので、明るさをノートの途中で下げられます。FM エレクトリックピアノの、明るいアタックと柔らかいテールはこれで作られます。 - アルゴリズムは配線です。どのオペレーターがどれを変調し、どれがキャリアかを決めます。エンジンの
algorithmフィールドで 6 種類(0〜5)から選びます。オペレーターはfeedbackで自分自身を変調することもでき、サイン波をノコギリ波に近づけます。
厳密には、NativeSynth はモジュレーターの出力をキャリアの周波数ではなく位相に足しています(位相変調、PM)。サイン波のオペレーター同士なら、2 つは同じ系統のスペクトルを生むので、PM も一般に FM と呼ばれます。インデックスがどう動いてもノートの音高がずれないため、実装では PM を使うのが普通です。
このうち Karplus-Strong・モーダル・ピアノ・パイプオルガン・擦弦・リード・金管・フルート・バジングブリッジ撥弦・ソース・フィルター声・フリーリード・ハープシコードは物理モデリングです。波形を積むのではなく、振動する物体(弦、金属バー、管、リード、声道、エアジェット)のふるまいを近似します。現在の NativeSynth で録音に対して較正済みなのは、ピアノモデルだけです。完成済みの楽器シミュレーションではなく、データ不要のプレビュー/フォールバック音色として扱ってください。
サンプルエンジンだけは性格が異なり、音を生成しません。ホスト側がすでに持っている PCM フレームを受け取り、ノートオン時にノート番号とベロシティの範囲を解決して、減算式チェーンのオシレーターの位置に差し込みます。つまり、自前の音声が合成音とまったく同じ共鳴フィルターとモッドマトリクスの手前に届きます。SoundFont リーダーではありません。解析するファイル形式はなく、マッピングは自分で記述します。
フィルターのキャラクター
フィルター自体のキャラクターも変えられます。フィルターのスロープは、カットオフより上をどれだけ急に削るかを表し、ポール(共振段 1 つ)が 1 つ増えるごとにオクターブあたり 6 dB 急になります。2 ポールなら 1 オクターブで 12 dB、4 ポールなら 24 dB です。NativeSynth は 5 つのフィルターモデルを備え、それぞれレゾナンスとサチュレーションの性格が異なります。
svf:クリーンで柔軟なステートバリアブルフィルター(中庸な既定値)。transistor-ladder:4 ポールのトランジスタラダー。太く温かい音で、レゾナンスを極端に上げると自己発振し、カットオフ周波数のサイン波として勝手に鳴り続けます。diode-ladder:ダイオードで組んだラダー。よりざらついた、攻撃的な音です。sallen-key:2 ポールの Sallen-Key 回路。なめらかで音楽的な、傾きの緩いフィルターです。svf-4-pole:ステートバリアブルの段を 2 つ直列にした 4 ポールのローパス。飽和しないので、2 つのオシレーターを通しても相互変調が起きません。
パッチフィールドとエンジンパラメータ
NativeSynth の音はパッチで記述します。パッチには、設定の仕方が異なる 2 つの層があります。
パッチフィールドは最上位の操作子です。エンベロープ、フィルター、LFO、ドリフト、グライド、ボディ共鳴、ステレオの広がり、ゲイン、ポリフォニーなどがこれに当たります。どのエンジンの出力もこれらを通るので、ほとんどはどのエンジンでも同じ意味を持ちます。一部は 1 つのエンジン専用で、waveform・unison・detuneCents は減算式エンジンだけが、sample* のフィールドはサンプルエンジンだけが読み、ほかのエンジンは無視します。
エンジンパラメータは、選んだエンジン自身のモデルです。擦弦なら弓圧と弓の位置、FM ならオペレーターの比率とレベル、ピアノならハンマーと弦のデータ、パーカッションなら膜のモード比です。これらは持ち主のエンジンにしか存在しません。設定は engineParams という 1 つのフィールドで行い、フィールド名をキーにしたレコードで渡します({ bowForce: 0.6 }、{ 'ops0.level': 0.8 })。
どちらの層も厳密に検査されます。範囲外の値、有限でない値、整数フィールドへの小数、(エンジンパラメータでは)別のエンジンに属するキーは拒否され、エラーはフィールド名を示します(synth patch field 'ampSustain': out of range [0, 1]、engine param 'bowForce': out of range [0, 1]、engine param 'algorithm': not a field of the bowed_string engine)。黙って補正された値は頼んでいない音になってしまうので、補正はされません。2 つの層の違いは性質にあります。パッチフィールドはどのエンジンも通る大まかな操作子で、エンジンパラメータは 1 つのモデルの物理量です。
どちらの層もベースから始まり、指定したものだけが変わります。省略したパッチフィールドは名前付きプリセットの値を保ちます。省略したエンジンパラメータは、そのプリセットのエンジンセクションを保ちます。名前付きプリセットが別のエンジンを使っている場合は、そのエンジン自身のベースプリセットの値になります。engineMode を選ぶとほかのエンジンのセクションはすべて空になるので、エンジンパラメータが効くのは鳴っているエンジンだけです。
libsonare での実装
NativeSynth は SynthPatch で設定します。engineMode フィールドが 17 種類のエンジンのいずれか('subtractive'・'fm'・'karplus-strong'・'modal'・'additive'・'percussion'・'piano'・'pipe-organ'・'bowed-string'・'reed'・'brass'・'flute'・'plucked-string'・'vocal'・'free-reed'・'harpsichord'・'sample')を選び、waveform がオシレーター波形('sine'・'saw'・'square'・'triangle'・'noise')を、filterModel がフィルターのキャラクター('svf'・'transistor-ladder'・'diode-ladder'・'sallen-key'・'svf-4-pole')を cutoffHz・resonanceQ とともに選びます。パッチを手で組む代わりに、synthPresetNames() で用意済みのカタログを一覧し、synthPresetPatch(name) で 1 つ読み込めます。内蔵プリセットはすべてこの 17 エンジンに基づいており、各プリセットは実体としては上記いずれかの方式にパラメータを埋めたものです。データを利用者側から渡す必要があるのは 'sample' エンジンだけで、PCM は自分で構築してバインドする SampleBank から読み出されます。バンクを持たない 'sample' パッチは無音をレンダリングします。各方式固有の深いデータ(FM のオペレーター構成、モーダルのモード表、ドローバーのレジストレーション、キットの各ピース、ピアノの弦、パイプランク、ボウイング摩擦、リード/金管の管体、フルートのジェット形状)は、名前付きプリセットそれぞれが持つエンジンセクションで、engineParams でキーごとに上書きできます。synthPatchParamInfo() は数値のパッチフィールドすべてを範囲、単位、初期パッチの既定値とともに返し、synthEngineParamInfo(engineMode) はエンジンのパラメータをそのエンジンのベースプリセットの値とともに返します。数は 'fm' が 50、'bowed-string' が 30、'piano' が 14、'percussion' が 93、'subtractive' が 13 で、セクションを持たない 'default' と 'sample' は 0 です。synthPresetPatch(name) はプリセットのパッチフィールドを返しますが、エンジンセクションは返しません。
関連: 内蔵シンセサイザー(NativeSynth)、エンベロープとモジュレーション、オーディオの基礎、SoundFont とサンプル音源