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で専用音源を叩いたり,エレクトーンで弾いたりすれば,もっと簡単なんですけど,あえてそれをプログラムから演奏させることと,音色づくりが今回の目的だったので。
コメント
コメントを投稿