FX INTRODUCTION / 19
YM2612フォルマント:FM音源で母音を作る
YM2612を倍音のある音源にして、同じliveFxのフォルマントフィルターで加工します。チップのFeedback、音程、母音の響きを、別々の操作として比べます。
Keyboardでメロディーを弾いてみよう
PlaygroundのBasicサンプル一覧にあるsinging-keyboard.js(examples/basic/singing-keyboard.js)でも、この音作りを試せます。鍵盤演奏用の設定と、操作手順のコメントを入れたサンプルです。まずは鳴らしてから、数値を変えて遊んでください。
このページのコードで演奏する場合は、次の手順で鍵盤モードに切り替えます。
- Stopし、コード先頭の
experiment = 'A'をexperiment = 'K'に変更してRunします。 - 下側のKeyboardタブを開き、Mo: Fixed channel、Ch: CH1、Pre: Currentを選びます。Currentを使うことで、コードで作ったYM2612音色をそのまま演奏できます。
- 画面の鍵盤をクリックしてメロディーを弾いてみましょう。PCのキーで弾く場合は、コード入力欄からフォーカスを外してKeyboard側をクリックし、画面に表示される数字・文字のキー割り当てを使います。
Kでは音色とFXだけを準備し、自動の持続音や音程変更ループは鳴らしません。鍵盤がYM2612の音程を決め、その後段のフィルターが母音を巡回します。feedbackやvowelSecondsを変えて、同じメロディーの響きを比べられます。
Keyboardとコードは同じYM2612音色とFXを共有します。FILESでTFI音色を開いたときの試聴鍵盤は別経路です。KとA・B・Cを切り替えるときはStop → Runにしてください。Keyboardから別タブへ移ると押している鍵盤は離されるため、FX Monitorで鳴り続ける音を比較する場合はA・B・Cを使います。
1. まず聴いてみる
Runすると、130 HzのYM2612音が鳴り続けます。実験Aでは音程を固定し、フィルターが「あ → い → う → え → お」と動きます。チップの倍音と、ソフトウェアで作る共鳴を組み合わせた、電子的な声の響きです。
Runで再生、Stopで停止します。再生中にコードを編集したら、もう一度Runすると反映されます。同名のFXはフィルター履歴を保持し、livePrepareにより音源を再発音しません。最初から試すときやK・A・B・Cを切り替えるときはStopしてからRunします。別々のPlaygroundは同時に鳴るので、ほかのサンプルは停止して1つずつ比べてください。
2. チップの音を作り、その後でフィルターをかける
YM2612のOP1+Feedback → 倍音を含む音 → 3つの並列フォルマントフィルター → Mix → 出力
出発点はFM_PRESETS["sine"]です。この例では、4つのOperatorがすべてキャリアになれるAlgorithm 7を選び、OP1だけを鳴らします。ほかのOperatorはミュートします。チップのFeedback経路がOP1にあるため、このOperatorを使います。
feedback = 0では、OP1はサイン波に近い音源です。Feedbackを上げると発振波形が変形し、フィルターが強調できる倍音が増えます。まずfeedback = 6から始め、0、3、6を比べてください。Feedbackはチップ側の音色を変え、F1・F2・F3の位置は動かしません。
operatorLevelはYM2612のTotal Level(TL)で、チップの減衰量を表す生の値です。小さいほど大きな音、大きいほど小さな音になります。パーセントではありません。例ではOP1をTL 16、ミュートするOperatorをTL 127にしています。Feedbackを変えて比べるときは、TLの変更も少しずつ試してください。
フォルマントフィルターは、チップ出力の後段に置くAudioWorklet上のliveFxによるソフトウェア処理です。YM2612の中に3つのフォルマントフィルターがあるわけではありません。LPC音声チップの再現や、マイク音声の分析でもありません。
3. 3種類の変化を分けて考える
| 設定 | 変わるもの | まず試すこと |
|---|---|---|
carrierHz | YM2612音源の周波数(Hz) | 65、130、260を比較 |
feedback | 音源の波形と倍音。チップの値0〜7 | 0、3、6を比較 |
operatorLevel | OP1の減衰量。生のTL値0〜127 | 16と28を比較。大きいほど小さな音 |
vowel/fixedVowel | 共鳴の目標。0=あ、1=い、2=う、3=え、4=お | 0と1に固定して比較 |
vowelSeconds | 自動で次の母音へ進む間隔(実時間の秒) | 1.4と2.5を比較 |
transitionMs | フォルマント設定を平滑化する時間尺度(ミリ秒) | 20、60、200を比較 |
lfoHz/lfoDepth | 共鳴を動かす周期数/秒と幅(オクターブ) | 0.8と0.3で周期的な母音の響きを試す |
mix | 原音と加工音の割合。0〜1 | 0でチップの音、1でフィルター後の音 |
formantsは母音ごとの[F1, F2, F3]をHzで指定する表です。各バンドパスに同じ入力を渡し、3つの出力を混ぜます。F1は母音の開き、F2は舌の前後位置との関係があり、F3は声の響きをさらに特徴づけます。値は実験用の目安で、すべての話者に共通するものではありません。表とフィルターの仕組みはフォルマント母音の章で説明しています。
4. 実験A・B・Cを比べる
| experiment | YM2612の音程 | フォルマントフィルター |
|---|---|---|
'A' | carrierHzに固定 | 5つの母音を巡回 |
'B' | 周波数パターンを反復 | fixedVowelに固定 |
'C' | 同じ周波数パターンを反復 | 5つの母音を巡回 |
- Aで
mix: 0にし、feedbackを6から0へ変えて、もう一度Runします。YM2612自体が作る音の違いを確認します。 - Feedbackを6、
mix: 1に戻します。フィルターが加工できる倍音が増えます。Feedback 0では主な成分が1つなので、3つのフォルマントの共鳴を十分に作れません。 experiment = 'B'、fixedVowel = 0にします。音程が動いても共鳴の目標は同じです。次にfixedVowel 1を試します。- Cを試し、
vowelSeconds: 2.5で母音の移動をゆっくりにします。音源の音程と母音の動きは、別々に制御されています。 - LFOも試すならBを選び、
lfoHz: 0.8、lfoDepth: 0.3にします。音源用ループが音程を動かしながら、フィルターは周期的に動きます。
音源用ループはfm.setFrequencyを呼びます。フォルマント処理は音声スレッド側の位置から共鳴周波数を動かします。これらは秒で進むため、BPMを変えても速さは変わりません。基音を高くすると共鳴の帯域に入る倍音が減るので、同じ母音設定でも聞こえ方は変わります。
5. FX Monitorでチップの音と加工後を比べる
RunしたらFX Monitorでformant-ym2612を選びます。青が音源からの入力、オレンジがフィルター後の出力です。View → Spectrumで倍音の強さを、Oscilloscopeで波形を比較します。高さを比べるときはYを固定してください。入力と出力は同じ表示スケールです。
mix 0なら入力と出力が重なります。Feedback 6・mix 1では、オレンジのSpectrumがフォルマント付近の帯域を強調します。個々のピークは音源の倍音付近に立つため、F1・F2・F3の中心と完全には一致しません。Aでは倍音の間隔を変えずに全体の形が動き、Bでは共鳴の目標を保って倍音の間隔が変わります。
FXは音源を混ぜた後の音声を処理します。特定のYM2612 Operatorや演奏チャンネルだけを選んでいるわけではありません。比較するときは、ほかの音源を鳴らさないようにします。
6. 平滑化するもの・しないもの
フォルマント処理は左右の音声チャンネルごとに履歴を保持し、実際のAudioWorkletのサンプルレートから係数を計算します。設定の目標を平滑化し、加工音の過大出力を抑えます。前の3つのフォルマント記事と同じ処理を使っています。
チップの生の設定変更は別です。Feedback、TL、音程を急に変えると、波形の段差やクリック音が生じる場合があります。フォルマントの移動を滑らかにしても、直接のYM2612レジスター変更までクリックなしになるとは限りません。コードの反映時に音源のキー状態は保ちますが、チップの値に自動の平滑化は加えません。
合成した声の響きを楽しむ実験です。子音の生成、人間の声道の再現、文章の読み上げは行いません。聴く人、音程、Feedback、再生機器によっても、母音の聞き取りやすさは変わります。無理のない音量から試してください。