ArduinoでFM音源 (YMF825)

以前から気になっていた,ウダデンシのYAMAHA YMF825搭載FM音源ボードを試してみました。Arduino Unoと一緒に秋月電子で購入。

「ヤマハ製YMF825使用FM音源LSIモジュール」にピンヘッダをつけたもの

ボードにはピンがついていないので,ピンヘッダを一緒に買ってはんだ付け。斜めについてしまったのはご愛嬌。ただ,年のせいか,細かいところが見えにくくて,はんだ付けがちょっと厳しい。😓

Arduinoのプログラムは,以前M5 Stackをちょっと試した程度だけど,まあ,ほぼC言語なので,プログラム言語自体はあまり問題なく書けます。ただ,Arduino Unoは,SRAM 2KBとFlashメモリ32KBなので,メモリのことをちゃんと意識しないといけない。(あふれます)特に,プログラム内で変数などで使用するのがSRAM 2KBの方なので,大きいデータをメモリ中におくのは難しい。

YMF825についての資料は,もともとヤマハからGitHubで公開されていたようなのだけど,どうも閉鎖されてしまったよう。ただ,もともとMITライセンスで公開されていたもののようで,有志の方が公開されています。
https://github.com/hasebems/YMF825_sample
ここにサンプルプログラムがあるので,これを参考に。

あとは,いろいろな方が解説を書かれているのを参考に。その中でも,下記の2点がありがたかったです。

最初は,Arduino上で動くMMLパーサ A tiny MML parser を使ってみたのですが,複数チャンネルをやろうとすると難しそうだったので諦めて,

  • PCでMMLで演奏データを書く
  • それをrubyのプログラムでコンパイルして,独自形式のバイト列にパックしてCのヘッダファイルとして書き出す
    • バイト列はFlashに配置できるようPROGMEMとして宣言する
    • MIDIのSMFを使えという話もあるけど,結局バイト列にしないといけないので,独自形式
  • それをArduinoのプログラムから#includeする
  • プログラムからは,loop()内で1パケット(8バイト)ずつ読み込んで,タイミングを合わせて再生する。

という方法をとってみました。また,せっかくのFM音源なので,音色も。

音色はそこそこパラメータもあるので,Excelで入力するようにし,それをrubyプログラムでコンパイルして,YMF825に書き込める形式のバイト列にパック。それを演奏データと同じようにArduinoプログラムから読み込んで,チップの初期化時に書き込み。

という感じで,YMOのライディーンを演奏してみました。せっかくの16音ポリ音源なので,演奏も3チャンネル(メロディー+コード+ベース)にしています。(自分がエレクトーン弾きなので,この形が自然なのと,楽譜も持っていたので)

なんとかそれっぽい形になりました。

奇しくも,これにチャレンジしていた頃,YMOでライディーンを作曲された高橋幸宏さんがお亡くなりになってしまいました。大変残念です。

もちろん,MIDIで専用音源を叩いたり,エレクトーンで弾いたりすれば,もっと簡単なんですけど,あえてそれをプログラムから演奏させることと,音色づくりが今回の目的だったので。

コメント

このブログの人気の投稿

MSFS2020 G1000でのVORの使い方 (C172)

Linuxでの省電力設定

Word 2016の不具合