FM音源プラグインのUIをClaude Codeで作り直す

Programming

先日、S98Player for iPhone 3.0をリリースしました。PC-98やX68000の音楽を鳴らすプレイヤーで、3.0からはS98とPMDに加えて、MDX、FMP、MFM / MF2を再生できます。

S98とそれ以外では、鳴らし方が違います。S98は、ドライバがチップに書き込んだ値を時刻付きで記録したログです。プレイヤーは記録された値をエミュレートしたチップに順番に流すだけで済みます。PMDやFMP、MDXは曲データのほうで、ドライバ本体を動かして、そのドライバにチップを叩かせます。

ドライバ側を動かすようになって分かったのは、当時の表現力の多くがチップではなくドライバにあったということです。YM2151のLFOは1系統しかなく、全チャンネルで共有します。パートごとに違う深さのビブラートをかけたり、音の出だしだけビブラートを遅らせたりはできません。ドライバは、それをキーコードの書き換えで作っていました。ポルタメントもアルペジオもディレイも同じで、チップの機能ではなくドライバの仕事です。

この視点で、昨年作ったFM音源プラグイン「YMulator Synth」を作り直しました。ドライバがやっていたことをプラグイン側に持ち込んで、音楽の言葉で触れるようにする。それが目的です。できあがったものが使えるかどうかは、1曲作って確かめました。

どんな音が鳴るか

…1曲作って確かめたなんて書きましたが、実はこれもClaude Codeに出力してもらいました(そんなことまでできるとは驚きました…)。「エレクトロニカで、YMulatorの機能をデモできる曲」というオーダーで。2分15秒の曲ですが、鳴っている音は全部YM2151(OPM)です。音色選定もClaude Codeまかせ。

8トラック全部が同じプラグインを使っています。DAW側ではディレイもリバーブもコンプレッサーもかけていません。ステレオの広がりも、エコーも、音の揺れも、ymfmのレジスタを書き換えて作っています。

再生中にレジスタをCCで動かしているわけでもありません。曲の頭でトラックごとに音色と動きを設定したら、あとはノートオンとノートオフだけです。MIDIファイルにコントロールチェンジは入っていません。

「Wideを45」「Echoを1/8」「パンは音ごとにランダム」と最初に決めておけば、鍵盤を押すたびにその通りに鳴ります。

FM音源を音楽の言葉で触る

FM音源のパラメーターは、4つのオペレーターそれぞれにTL、AR、D1R、D2R、D1L、RR、KS、MUL、DT1、DT2があり、チャンネル共通にアルゴリズムとフィードバックがあります。40以上あります。さらに「TLを下げる」が音量なのか音色なのかは、そのオペレーターがキャリアかモジュレーターかで変わります。

これを直感的に触れるようにしたいということで2つの画面を用意しました。

Quick画面には、レジスタ名を出さずに済むものだけを置きました。

  • TONE: Brightness、Harmonics、Attack、Decay、Release、Spreadの6つ。読み込んだ音色を基準にした相対値です。Brightnessを上げると、そのアルゴリズムでモジュレーターになっているオペレーターのTLがまとめて下がります。Attack / Decay / Releaseはキャリアのエンベロープだけを動かすので、余韻を伸ばしても音色は元のまま暗くなっていきます。
  • RECIPE: カテゴリ(Bass / Lead / Brass / E.Piano / Bell / Pad / SE)と6本のスライダー(暗い↔明るい、単純↔複雑など)で方向を決めてGenerateを押すと、その方向の音色ができます。Undoで戻れて、A / Bで2つを聴き比べられます。
  • MOTION: 時間で動く要素をまとめたカードです。Wide、Vib、Growl、Echo、Sweep、Swell、Glide、Arp、Kick、Trem、Panのチップを押すと、その機能が標準的な値で入ります。
  • OUTPUT: 現在の設定で1音鳴らした波形と包絡線を表示します。アタックからリリースまで再生位置が動くので、エンベロープをいじった結果が分かります。

Detail画面は全パラメーターです。上のマクロと下のオペレーターは同じ値を見ているので、Quickで方向を決めてからDetailで詰める、という使い方ができます。TONEのノブに触れると、それが動かすオペレーターのノブに琥珀色の輪が付きます。マクロが何を動かしているかを確認できます。

チップの外では何もしない

MOTIONは、冒頭に書いたドライバの仕事をまとめた場所です。ビブラートもエコーも定位の移動も、当時と同じくレジスタ書き込みだけで作ります。

  • ビブラート: 64サンプルごとにキーコードとキーフラクションを書き換えます。チャンネルごとに深さと速さを変えられて、ディレイとライズも付きます。波形は正弦・三角・ノコギリ・矩形・ランダムから選べます。
  • Wide: 2台目のYM2151インスタンス(シャドウチップ)を用意し、同じ音を数セントずらして鳴らして左右に振ります。1台で2音使うユニゾンと違い、同時発音数は8のままです。
  • Echo: シャドウチップへのキーオンとレジスタ書き込みを遅延キューに通し、キャリアのTLを下げます。原音は自分の定位のまま、エコーだけが音ごとに左右交互に置かれます。
  • パン: 中央 / 左 / 右 / 音ごとにランダム / 発音ごとに左右交互 / 拍ごとに左→中→右。YM2151のパンはL/Rの2ビットしかないので、3値の切り替えだけです。連続的な移動は作りません。
  • アルペジオ: 押さえた和音を1チャンネルで順に鳴らします。順序はUp / Down / Up-Down / ランダム / 押した順、オクターブは1〜4、音程だけを切り替える方式とゲート付きで鳴らし直す方式があります。上の曲のアルペジオは16分で打ち込んでいるのではなく、4声の和音を1小節ぶん伸ばして置いてあるだけで、刻んでいるのはプラグインです。

レートはホストのテンポに音価で同期できます。上の曲では、エコーが1/8や1/16、アルペジオが1/16、拍で動くパンが1/8です。

後段処理を入れない理由は、入れると実機では出ない音になるからです。ディレイをかけたければDAWのディレイを使えばいいので、プラグインの中でやる必要はありません。

使うには

GitHubのReleasesに各プラットフォームのパッケージを置いています。macOSはAudio Unit / VST3 / スタンドアロン、WindowsとLinuxはVST3です。

ソースは同じリポジトリにあります。音源部はymfm、UIとプラグイン化はJUCEです。

これから

もう少しFM音源の音色作りについて勉強して、UIや機能を洗練していこうと思います。ご期待ください。

GitHub – hiroaki0923/YMulator-Synth: 🎵 Modern YM2151 (OPM) FM synthesizer Audio Unit plugin for macOS with 8-voice polyphony and real-time pitch bend support
🎵 Modern YM2151 (OPM) FM synthesizer Audio Unit plugin for macOS with 8-voice polyphony and real-time pitch bend support – hiroaki0923/YMulator-Synth

一年ぶりにClaude Codeでいじって、その能力の向上ぶりにも驚かされました(また、一年前のコードがバグだらけだったことにも…)。このあたりも別記事でまとめようと思います。

コメント

タイトルとURLをコピーしました