ymfmでOPM仮想音源を制御するサンプルコード

Programming

FM音源エミュレーションライブラリ「ymfm」を使って、YM2151(OPM)仮想音源チップを直接制御するサンプルコードをGitHubで公開しました。基本的なサイン波から、ステレオアルペジエーターまで、8つのデモプログラムを通じてOPMの制御を段階的に理解していく構成になっています。

ymfm/examples/opm at main · hiroaki0923/ymfm
BSD-licensed Yamaha FM sound cores (OPM, OPN, OPL, and others) - hiroaki0923/ymfm

ymfmとは

ymfmは、Aaron Giles氏によって開発されたBSDライセンスのヤマハFM音源エミュレーションライブラリです。OPM、OPN、OPLなど、様々なFM音源チップをサポートしています。

GitHub - aaronsgiles/ymfm: BSD-licensed Yamaha FM sound cores (OPM, OPN, OPL, and others)
BSD-licensed Yamaha FM sound cores (OPM, OPN, OPL, and others) - aaronsgiles/ymfm

このブログでも、これまでいくつかymfmに言及しています:

これらのプロジェクトは、既存のS98ファイルを再生することが目的でしたので、FM音源のレジスタをゴリゴリいじるというよりは、それらの情報が詰まったダンプファイルをレジスタにいいタイミングで流し込んでいくようなものでした。

今回のサンプルコードはそれとは異なり、「OPMを制御して意図した音を出力させる」ことが目的となります。アドレスに値を書き込む関数を知っているだけではなく、どの値をどのアドレスに書き込むとどういったことが起こるのか、を理解しないといけません。

スポンサーリンク

なぜOPMの直接制御サンプルを作ったか

今回のサンプルコードを作成した動機は主に2つあります:

1. 自分の意図した音を作りたい

S98ファイルのような「既に完成された楽曲データ」を再生するのではなく、OPMのレジスタを直接設定して、自分が意図した音を一から生成したいと思いました。

FM音源の仕組みを理解し、アルゴリズムやエンベロープ、フィードバックなどのパラメータを調整することで、どのような音が作れるかを実験できます。

2. VOPMのようなAudio Unitを作りたい

最終的な目標は、VOPMのようなAudio Unit(macOS/iOSの音楽制作アプリで使えるプラグイン)を自作することです。そのためには、まずymfmを使ってOPM音源をプログラムから制御する基本的な方法を理解する必要がありました。

スポンサーリンク

8つのデモプログラム

今回公開したサンプルコードは、基本から応用まで段階的に学べる8つのデモプログラムで構成されています。プログラムを実行すると、それぞれのデモがWAVファイルとして出力されます。

  1. 01_sine_wave_scale.wav – シンプルなサイン波でOPMの基本を理解
  2. 02_piano_scale.wav – FM合成によるピアノ風音色の生成
  3. 03_twinkle_twinkle_chords.wav – 4チャンネルを使った「きらきら星」の生成
  4. 04_lfo_effects.wav – ビブラートやトレモロなどLFO効果
  5. 05_fm_algorithms.wav – 異なるアルゴリズムによる音色変化の比較
  6. 06_envelope_control.wav – ADSRエンベロープで音の表情を制御
  7. 07_detune_effects.wav – デチューンで音に厚みを加える方法
  8. 08_stereo_arpeggiator.wav – ランダムに定位を左右に振ったアルペジエーター

各コードにはコメントが含まれており、レジスタ設定がどのように音に影響するかを理解できるようになっています。

なお、出力されるWAVファイルはこんな感じです(以下は01、03、08)。あくまでサンプルなので派手さはありませんが、どうやって音が出力されるかはわかると思います。

01 sine wave synth
03 twinkle twinkle little star
08 stereo arpeggiator

Claude Codeとの共同作業

ちなみに、今回のサンプルコードはほとんど全てClaude Codeに書いてもらいました(「きらきら星」の譜面までお願いしてます)。最初はいきなりVOPMのようなAudio Unitの実装にトライしたのですが、さすがに複雑すぎてうまくいきませんでした。

そこで、まずは基本に立ち返り、シンプルなサンプルコードから始めることにしました。このサンプルコードは、Claude Codeがymfmの使い方を理解するための教材としても活用できると考えています。今後、より複雑な実装に挑戦する際の土台になるはずです。

スポンサーリンク

実際に試してみる

コード構成やビルド方法の詳細については、GitHubリポジトリのREADMEを参照してください。基本的にはmakeコマンドでビルドして実行するだけで、8つのWAVファイルが生成されます。それぞれの音を聴き比べることで、OPMの各機能がどのように音に影響するかを体感できます。

今後の展望

このサンプルコードは、ymfmを使ったOPM音源プログラミングの実践的な第一歩です。今後は以下のような発展を考えています:

  1. リアルタイム演奏への対応
    • MIDIキーボードからの入力に対応
    • レイテンシーの最適化
  2. Audio Unit化
    • macOS/iOS向けのAudio Unit実装
    • DAW(Digital Audio Workstation)での使用
  3. GUI の実装
    • パラメータを視覚的に調整できるインターフェース
    • VOPMライクな操作性の実現
スポンサーリンク

まとめ

今回公開したサンプルコードは、OPMプログラミングを段階的に学べるように設計されています。基本的なサイン波から始まり、FM合成の核心であるアルゴリズム、エンベロープ、LFO、そして最終的にはステレオアルペジエーターまで、実際に音を聴きながら理解を深められます。

Claude Codeのような AI ツールを活用することで、複雑なライブラリの使い方を効率的に学習し、実践的なコードを短期間で作成できることも実感しました。AIと協力しながら、より高度な音楽ソフトウェアの開発にトライしてみようと思います。

ソースコードはGitHubで公開していますので、ぜひ実際にビルドして音を聴いてみてください。

ymfm/examples/opm at main · hiroaki0923/ymfm
BSD-licensed Yamaha FM sound cores (OPM, OPN, OPL, and others) - hiroaki0923/ymfm

コメント

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