
PATCHSYNTH MK3 Plugin開発
PATCHSYNTH MK3 開発ノート — 試行錯誤の記録
このノートについて
ブラウザ上で動くシンセサイザーのプロトタイプ(HTML/JavaScript)を、実際にDAW(音楽制作ソフト)で使えるプラグイン(Cabbage/Csoundで作るVST3)に作り直すプロジェクトの記録です。「動かして→エラーが出る→直す→また動かす」を何十回も繰り返しながら完成に近づけていった過程を、専門用語をなるべく使わずにまとめました。
1. プロジェクトの出発点
もともと存在していたのは、ブラウザだけで動くシンセサイザーのおもちゃ(HTMLファイル)でした。鍵盤をクリックすると音が鳴り、ツマミで音色を変えられるものです。これを本格的な音楽制作ソフト(DAW)の中で使える「プラグイン」に作り直すことになりました。
作り直す際は、いきなり全部を作るのではなく、1つの仕組みずつ確認しながら積み上げる方法を取りました。家を建てるときに土台から一段ずつ確認して積んでいくのと同じイメージです。
| 段階 | 作ったもの |
|---|---|
| Phase 1 | 鍵盤を弾くと音が鳴る、一番シンプルな仕組み |
| Phase 2 | 音を作る発振器を2つにして、音を太くする |
| Phase 3 | 音のこもり具合を変えるフィルターを追加 |
| Phase 4 | 音を自動で揺らす仕組み(ビブラート・ワウ)を追加 |
| Phase 5 | 響き(リバーブ)とこだま(ディレイ)を追加 |
| Phase 6 | 自動演奏(16ステップシーケンサー)を追加 |
| Phase 7 | 50種類の音色プリセット、音質調整(EQ)、全体音量、見た目の仕上げ |

2. 最初の壁:「音が鳴らない」との戦い(Phase 1)
一番最初の関門は、ごく単純な「鍵盤を押しても音が出ない」でした。原因は一つではなく、直しては新しいエラーが出る、を何度も繰り返しました。
計算式の書き方が1文字足りなかった(掛け算の式に `=` を書き忘れていた)
音の波形の種類を指定する数値が、そもそも存在しない値だった
音の高さ・強さを取得する命令が、実は「その場で一度きり使う」タイプの命令だったのに、間違った使い方をしていた
音量を決める仕組みが、存在しない設定表を参照していて動いていなかった
音の立ち上がり・減衰を作る命令の書式が、必要な数の情報を渡せていなかった
さらに厄介だったのが、「エラーは出ないのに音も出ない」という状態でした。ここでは「今どこまで処理が進んでいるか」をコンソール(ログ画面)に逐一表示させる方法で、どこで処理が止まっているかを一つずつ切り分けていきました。最終的に、鍵盤の音符情報を表示に使っていた部分が原因で無言のまま処理全体が止まってしまうという、かなり見つけにくい不具合にたどり着き、その部分を取り除くことで解決しました。
教訓: エラーメッセージが出ない = 正常、とは限らない。疑わしい処理を一つずつ止めて反応を見る「消去法」が有効。


3. 音色を安定させる戦い(Phase 2〜4)
複数の音の波形(ノコギリ波・矩形波・三角波など)を切り替えられるようにしたところ、特定の波形を弾いたときだけ、たまに音が出なくなるという不安定な現象が発生しました。原因は「初めて使う波形のデータを、演奏中にその場で作ろうとして、複数の音が同時に鳴ると準備が間に合わない」というものでした。
この時点で、その波形生成の仕組みを丸ごともっとシンプルで壊れにくい方式に置き換えました。これによって、波形の不安定さが解消されただけでなく、演奏中でも波形をリアルタイムに切り替えられるというおまけの利点も得られました。

4. 大事件:「プリセットを切り替えると音が消える」(Phase 7)
50種類の音色プリセットを作り、ボタン一つで音色を一括切り替えできるようにしたところ、新たな深刻な問題が発生しました。
自動演奏(シーケンサー)を鳴らしながらプリセットを切り替えると、音が完全に鳴らなくなり、二度と復活しない

これは今回のプロジェクトで一番手強かった不具合です。解決までの流れは以下の通りです。
4-1. まずログを仕込んで観察する
音のどこで何が起きているかをリアルタイムに表示するようにしたところ、プリセット切り替えの瞬間に出力レベルが 「NaN」(数字にならない数字、コンピューターが計算不能になった状態)になっていることが判明しました。

4-2. 原因の見当違い(1回目)
最初は「各音を作っている部分のフィルターが、パラメータの急変化についていけずに壊れている」と推測し、その部分に対策を入れましたが、直りませんでした。ログを見返すと、実際に壊れていたのはそこではなく、常に1つだけ動き続けている「音響効果(響き・こだま)担当」の部分だとわかりました。
家に例えると、各部屋(=それぞれの音)の照明がおかしいのかと思って各部屋の配線を直したけれど、実は家全体で共有している電源(=音響効果の処理)がショートしていた、という感じです。共有部分は一度壊れると誰にも直せないまま延々と壊れた状態を引きずってしまうので、これが「音が二度と復活しない」の正体でした。

4-3. 対策:急激な変化を「なめらかに」する
プリセットを切り替えた瞬間、音質を決めるいろいろな数値が「パッ」と一瞬で切り替わっていたのが引き金でした。これを、0.05秒ほどかけてなめらかに移り変わるように変更しました。急な段差ではなく緩やかな坂道にする、というイメージです。

4-4. さらに保険をかける:壊れたら自動で生き返らせる
上記の対策だけでは万全とは言えないため、「もし音響効果担当が再びおかしくなったら、自動的にその部分だけ作り直す(再起動する)」という自己修復の仕組みも追加しました。人間が気づかなくても、裏側で自動的に立て直しが行われるようになっています。
4-5. それでも見つかった落とし穴
自己修復の仕組みを入れた直後、今度は「音質調整(EQ)を高音側だけ下げると音が消える」という別の症状が出ました。調べると、自動修復で作り直された直後の音響効果担当が、毎回ゼロから設定を組み立て直す際に、一瞬だけ「あり得ない設定値」を通り過ぎてしまい、そこでまた同じ不具合を起こしていたことがわかりました。作り直すたびに変な状態を経由してしまう、まさに「直したはずが自分で同じ穴にまた落ちる」状態でした。ここは、作り直す際の初期値をきちんと「安全な値」に固定することで解決しました。

4-6. 音質調整(EQ)自体の癖
さらに、EQを「下げる」方向に動かすと無音になり、「上げる」方向は問題ない、という左右非対称な不具合も見つかりました。これはEQの処理方式そのものに癖があると判断し、より単純で壊れにくい方式に処理方法自体を丸ごと取り替えることで解決しました。

5. 見た目の仕上げ
機能が安定したあとは、見た目を「いかにも本格的なハードウェアシンセサイザーらしく」仕上げました。ダークな配色に、往年の名機を思わせる黒いツマミと金色の差し色を採用し、素人目にも「ちゃんとした楽器」に見えるデザインに整えました。

6. 外部キーボードにまつわる教訓
外部の本物のMIDIキーボードを接続して試したところ反応しない、という相談がありました。設定を変えて試したところ、画面上の鍵盤も外部キーボードも両方反応しなくなるという後退が起きたため、元の設定に戻しました。この結果からわかったのは、「テスト用の簡易環境(Cabbage単体)では外部キーボードの確実な動作までは保証しづらく、本来の目的であるDAWに読み込んでの確認が一番確実」ということでした。

7. 今回得られた主な教訓まとめ
エラーが出ないからといって正常とは限らない — ログを仕込んで実際の数値を見るのが一番の近道
複数の場所で同じような不具合が起きたとき、本当に壊れているのは「共有されている一箇所」であることが多い — 各所を疑う前に、常時動いている共通部分を疑う
急激な値の変化は不具合のもと — パラメータの切り替えは「なめらかに」を基本にする
保険は二重にかける — 「そもそも壊れないようにする」対策と、「万一壊れても自動で立て直す」対策の両方を用意する
「直したつもり」が同じ穴に落ちていないか、直した後の状態を必ず再確認する
本番に近い環境(今回で言えばDAW)でのテストが一番信頼できる — 簡易テスト環境の限界を理解しておく

8. 現在の状態
PATCHSYNTH MK3は、Phase 1〜7を経て以下の機能を安定して備えるところまで到達しています。
2基の発振器(音の元)+ フィルター + 2基のLFO(自動揺らぎ)
音質調整(EQ)、響き(リバーブ)、こだま(ディレイ)、全体音量
50種類の音色プリセット(すぐに呼び出せる音色の引き出し)
16ステップの自動演奏機能(10種類のリズムパターン付き)
ハードウェアシンセを思わせる見た目

次の段階として、実際にDAWへ読み込んでの最終確認や、外部MIDIキーボードとの接続テストが残っています。