Lost Technology

レトロPC、レトロゲーム、チップチューン等の主に技術的な雑記

YMF825(SD-1)ざっくりまとめ(発音制御編)

USB-SPIアダプタを使ってPCからYMF825を演奏させることができたので、YMF825のレジスタを叩いて実際に音を鳴らす手順についてまとめてみました。

シリーズもくじ
YMF825(SD-1)ざっくりまとめ(スペック編) - Lost Technology
YMF825(SD-1)ざっくりまとめ(音作り編) - Lost Technology
YMF825(SD-1)ざっくりまとめ(発音制御編) - Lost Technology

※この記事は、パソコン向けFM音源(OPM/OPN/OPL等)の制御について基本的な知識がある人向けに書いています。

概要

YMF825で音楽を演奏する方法として、内蔵シーケンサーによる自動演奏と、制御レジスタの逐次操作によるプログラム演奏がありますが、シーケンサーの詳細はなぜか公開されていないので、今回は制御レジスタを直接操作するプログラム演奏について解説します。

制御手順としては以下のようになります。

  1. ハードウェアリセット
  2. 初期設定
  3. 音色テーブル設定
  4. 各チャンネル制御

基本的には、公式の資料に書いてあるとおりなんですが、注意すべきポイントを各フェーズごとに解説していきます。

ハードウェアリセット

リセット期間は最低1ms必要です。
100ms以上のパワーオフ期間を経てパワーオンから10ms以内に規定電圧に達すればパワーオンリセットが働くので手動でのリセットは不要ですが、別に減るもんでもないので念のためマニュアルリセットします。

初期設定

初期設定の内容は主に電源制御とソフトウェアリセットです。
パワーセーブモードがある関係で、アナログ部の電源を個別に制御することができます。
また、内部の機能ブロックごとにソフトウェアリセット機能があるので、念のためリセットします。

動作電源設定

レジスタ#29のbit0で、5V単一電源動作(0)か2電源動作(1)かを設定します。この設定はアナログ電源ONの前に実施します。

アナログ電源制御

アナログ電源はレジスタ#2で制御します。リセット時はすべてOFF(1)になっています。
VREF/SPOUT1/SPOUT2/DACの4ブロックに対して個別にパワーON/OFFができますが、最初にVREFのみONにして、各機能ブロックのソフトウェアリセットを済ませてからSPOUT/DACをONにするとポップノイズを軽減することができます。
と書かれていましたが、実のところあんまり変わりませんでした。

クロック

パワーオン直後はパワーセーブ状態になっていて、内部回路にクロックが供給されていません。レジスタ#0のbit0を1にすることで内部回路へのクロック供給が開始されます。

ソフトウェアリセット

最後に、レジスタ#1のbit7を1→0にすれば内部ブロックのリセットが解除され、初期設定は完了です。このビットを下げるまでは、レジスタ#0-2,4,29以外へのアクセスは無効です。
公式のArduinoサンプルではさらにレジスタ#26をA3H→0としています。各ビットが機能ブロックのどれかに対応していると思われますが、なぜかこのレジスタの詳細は公開されていません。

その他の初期設定

マスターボリューム(レジスタ#25)、イコライザーレジスタ#32~#79)をお好みで設定します。イコライザーの設定はちょっと複雑なので別の機会に。

音色テーブル設定

音色テーブルは1音色あたり30バイト、最大で480バイトを丸ごと設定します。
規定のヘッダとフッタを付与した上で、レジスタ#7に対して頭から順に送ることで内部の音色テーブルにプリセットされます。
SPIバースト転送が使えますが、レジスタ#7に対して1バイトずつ設定でももちろん構いません。
ヘッダでは音色テーブルの設定数を0~16で指定します。音色番号ではない点に注意。
各音色データは必ず1音色30バイト単位での設定になります。特定のレジスタだけをピンポイントで変更する手段はありません。
また、音色テーブルの設定時には全てのチャンネルで発音が停止している必要があります。
公式資料では、この後にシーケンスデータを続けることができる様に書かれてます。シーケンスデータのみを送る場合は音色テーブルの設定数が0になります。
ただし、シーケンスデータのフォーマットはなぜか開示されていませんので、音色データのみを設定します。この場合、単に音色データの後にフッタを書くだけでいいようです。

各チャンネル制御

ここまでで演奏の準備ができました。
実際に演奏するには、

  • チャンネルの音階(周波数)
  • チャンネルの音量
  • チャンネルの音色
  • キーオン/オフ

の情報が必要です。

チャンネルの選択

これらは、各チャンネルに対応したControl Registerに値を書き込むことで制御できますが、実は全てのチャンネルのControl Registerが常時表に出ているわけではありません。
レジスタ#11の下位4ビットに操作したいチャンネル番号を0~15で書き込むことで、レジスタ#12~20に対応するチャンネルのControl Registerが現れます。
公式資料では「The CRGD_VNO is used to specify a tone number.」と書かれていますが、ここでいうtone numberは実はいわゆるチャンネルのことです。
ヤマハの英語資料ではvoiceとかtoneとかが文脈によっていろんな意味で使われているので、読み解くのに苦労します。

周波数

周波数は、おなじみのF-numberとBlockで指定します。F-numberの精度はOPL系と同じ10bitで、算出式も同じく以下のようになります。

 Fnumber=f*2^{19}/fs/2/2^{Block-1}
(f=目的の周波数, fs=サンプリング周波数=fM/256=48kHz, fM=マスタークロック=12.288MHz)

平均律12音階分だけであれば、公式資料にF-numberテーブルが載っていますのでそのまま使えます。
F-numberとBlockはレジスタ#13,14で設定しますが、ビットの配置があまり一般的でない(bit7を使用しない、上位下位に分けたF-numberの間にBlockが入る、等)ところに注意。

SD-1では、F-numberとBlockの他にFineTuneによる周波数補正ができます。シーケンスデータに手を加えず(=F-numberの再計算をせず)にキーの上げ下げができるちょっとお得な機能です。
FineTuneは、原周波数に対する倍率を整数部2bit、小数部9bitで指定します。

音量

音量はVOVOLとCHVOLの2種類で設定します。MIDIでいうCC#11とCC#7みたいなもんでしょうか。それぞれ5bitと精度は荒いですが、5bit*5bitで補間されて最終的に6bitの精度になるらしいです。
それぞれレジスタ#12、#16で設定します。

音色

レジスタ#15の下位4bitに、あらかじめ設定した音色テーブルのインデックスを0~15で指定します。
これは発音中に変更できるようです。OPLLではこれを利用してROM音色の挙動を変えるというテクニックがありましたが、同様のことができるかも知れません。やる意味があるかどうかはデータ作成者次第でしょう。

キーオン/オフ

レジスタ#15のbit6がキーオン/オフです。

サンプルプログラム

以上を踏まえて、実際にPCとYMF825をUSB-SPIで接続して演奏した動画がこちら。

演奏サンプルのソースコードGitHubで公開しています。
github.com