curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

FM音源YM2203をArduinoで鳴らしたい #2

 

お疲れ様です。高橋です。

先に結論

FM楽曲及びPSG楽曲の演奏に成功しました。楽曲は全て先輩作のMMLを元にMUCOM88 for winでS98化したものです。

▼FM楽曲 #1: YS-II オープニング “To make the end of battle”

▼FM楽曲 #2: Socerian オープニング

▼PSG楽曲 #1: Night Mare(魔城伝説) Start BGM

▼PSG楽曲 #2: Night MareIII(SHALOM/シャロム) タイトルBGM


下記に前回からの流れを記しておきます。

YM2203の追加購入/8月1日(土)

前回、FM音源YM2203をArduinoで鳴らしたい #1にて、音が鳴らずに途方に暮れていましたが、

8月のお小遣いがチャージされたあと、aliexpressでYM2203とYM3014を10個ずつ購入し、再チャレンジしてみようと思います。

と結論付けました。8月1日の小遣いがチャージされた後ダッシュでVISAデビットに現金を入金し、aliexpressにてYM2203とYM3014を5個ずつ購入。aliexpressでの買い物には普通のクレカではなくデビット型クレカを使うのが賢い方法。

YM2203、YM3014到着 / 8月17日(月)

2週間経過した8月17日。

aliの例の小包が。

中にはマークが全然バラバラなYM2203が5個と、DAC YM3014が15個。15個????

YM2203もYM3014も、1~2個ずつ異なるストアから購入しまして、お値段はYM2203が\84+\83+\105*3=\482、YM3014が\103*3+\190*2=\689、合計\1,171となるはずです。

(・・・今これを書くために改めてaliexpressの注文履歴を見直したところ、YM3014の単価\103のやつは5個セットでした。\190のやつは、10個セットでした。。だから15個+20個になったのか・・・無駄に\586も遣ってしまったのですが、無事演奏出来たので良し。良い勉強になりました。。)

異なるストアから少量ずつ買うには訳があります。aliexpressは大小様々な規模の素性のわからない店が超大量に出店しているstoreですので、店によって当たり外れが非常に激しいのです。

案の定、5個買った内の1個は20番ピンが欠けていました。これはPSGのAnalog Achの出力という非常に重要な部分を担っているため、結構致命的です。使うには別途はんだ付けが必要です。

YM2203を換装して演奏 / 8月22日(土)

ICを換装しても鳴らなかった場合、心へのダメージが極大である事は容易に想像が付きますので、平日は作業を行わず、静かで神聖な時間が取れる8月22日の土曜日を待ちます。

たっぷり午後まで睡眠をとった後、いざYM2203を差し替えてみると、、、音が鳴りました。

心のどこかで「回路のどこかの配線がミスっているんだろうなあ・・・でも10回以上見直しても間違い無いんだよなあ・・・とはいえICが原因なんてそうそうないだろうなああ・・・」と、60%くらいは換装による効果が無いだろうと踏んでいたのですが、まさかの成功です。

今まで先輩に作ってもらったMUCを片っ端からS98に変換して、実機で再生し、至福のときを過ごす日曜日。

ところが、全部聴いていると、PSGのみの楽曲は完璧にMMLを再現しているのですが、FMとPSGが混在している楽曲が一定間隔で音が切れる現象に気づいてしまいました。

原因究明の道のり #1/8月23日(日)

楽曲再生までの道のりは下記の通りで、PSG楽曲の内、シャロム系は私が耳コピし、DAWで打ち込んだ物をSMFにし、先輩にMML化&原曲に忠実なチューニングを施してもらいます。非シャロム系のPSG楽曲とFM楽曲全ては先輩の耳コピ&MML化がなされます。ここまでが下図の「1.muc(MML)」にあたります。MUCOM88 for winで出力したS98をμSDに書き込み、NanoからμSDを読みつつYM2203に命令を送り、ampでmixして最終出力の発声に至ります。

PSG部は問題無いので、DACを疑って換装したり、様々な曲を聴きまくると、曲ごとに音が途切れる箇所が必ず固定している事が判明したところで、翌日に持ち越します。

原因究明の道のり #2/8月24日(月)

月曜日、会社で先輩と何が原因なのか議論を進めます。

原因究明議論の間に、この前YoutubeでソーサリアンのOpに感動したので、「SorcerianのOpening作ってほしいです」とぶっこみます。

議論して原因特定の方向性が定まりました。

  1. FMだけで構成されている楽曲「Ys / 未使用曲 / NHK教育」のテンポ普通・遅い・速い、の3パターンを作って状況が同じか確認。
  2. 参考にしているNano用ファームウェアをYM2608(OPNA)用命令を無視する修正を施しているが、何を無視しているのかシリアルモニタで観察。
  3. ファーム内のYM2203のイニシャライズ後に少しwaitを入れる。

議論結果を胸に早々に帰宅すると、DACがまた届いていました。合計35個です。

今後DACが故障しても交換部品が潤沢にあるので憂い無し!

シリアルモニタでデバッグしていると先輩からソーサリアンOpを送ったとの連絡を受け、異常なMML化速度に恐怖しつつも、まずはMUCOM上で演奏してひとしきり感動。

感動しつつも低テンポNHK教育を繰り返し聴いていると、明らかに音が途切れている箇所の前後でOPNA用命令が発行されています。

先輩から当該命令の前後のレジスタと書き込み値を確認するよう言われます。除外するYM2608向け命令及びその前後を出力するようにファームを修正します。

画面を見せると先輩から「あー これですよー」と5秒で答えが。

原因について

何が「これ」なのかわからないまま先輩の解説が続きます。

mucom88 for windowsが出力するS98は、原則、OPNA向けとして出力されます。OPNA専用レジスタへの書き込みはファーム上で完全に無視するよう修正していますが、OPN向けレジスタへの書き込みはそのままYM2203へ送っています。

ところが、YM2608のレジスタと、YM2203のレジスタで共通している箇所が0x28のKey on/off。YM2203はD0, D1の2bitしか使いませんが、YM2608は下記の通りD0, D1, D2の3bitを使用します。0x28への命令の内、3bit目(D2)を使う場合はYM2608命令としてS98が出力されていれば問題無かったのですが、YM2203命令として0x28に対して存在しないch4, 5, 6に対する書き込みを実行しようとしています。

▼YM2608のレジスタ 0x28

▼YM2203のレジスタ 0x28

そうすると、ch4, 5, 6は100、ch5は101、ch6は110というように、D0とD1に0や1を設定しまくるため、D2を持っていないYM2203でも00や01、10が飛んできたらそのchのon/offを実行。結果、音が途切れるという事でした。

データを見て5秒で即答する先輩の頭の中には、YM2203とYM2608のレジスタマップが格納されているという事です。恐ろしい。。

ファーム修正

原因がYM2203に対し、存在しないch4,5,6へのkey on/off命令という事が判明したので、それを除外するようファーム修正します。

下記コードの内、コメントアウトしているのが私のコード。「動けばいい!」派です。

すぐ下のif文が先輩のコード。ちゃんとマスクして処理してます。

性格が如実に現れるコードをファームに書き込み、いざ視聴。

 

そして冒頭の演奏成功動画に至ります。

 

達成した事

MUCOM88 for Windowsにて作成したOPN(YM2203)向けMMLをS98出力し、そのまま問題なく演奏出来るファームが実装出来ました。追ってGitにcommitしようと思います。

偉大な先人2名(bugemonさん: ファーム&回路、lipoyangさん: 回路)のファームと回路を参考にさせていただきました。

また、先輩には楽曲作成~ファーム実装に至るまで全般に渡ってとてもお世話になりました。

 

引き続き、ユニバーサル基板に半田付けするとともに、KiCadで回路書いて中国に基板発注まで行きたいと思います。

 

 

以上、よろしくお願い致します。

 - 電子工作

  関連記事

Arduino nano互換機でオナラ検知デバイス

お疲れ様です。高橋です。 今日のお昼、会社の大先輩から、綺麗にケーシングした自作 …

bluetoothモジュールHC-06とAndroid

お疲れ様です。高橋です。 先日AliExpressで購入したbluetoothモ …

音階LED実装 #4

お疲れ様です。高橋です。 今日は音階LEDのIC-IC間、GNDの敷設、そして1 …

ルンバにスピッツを演奏させてみた

お疲れ様です。高橋です。 家にあるルンバにArduinoを挿して、スピッツの「涙 …

遠隔でRaspberryPi+DCモーターを制御してaitendoの名刺をクルクルさせる。

お疲れ様です。高橋です。 「猫×おもちゃ×動画×アプリ」のための要素技術として必 …

Arduino+EEPROM+YMZ294で曲の抜き差し

お疲れ様です。高橋です。 I2Cの256KBitなEEPROMに曲データを書き込 …

赤外線リモコンをケースに格納

お疲れ様です。高橋です。 先日作ったATtiny13Aの赤外線リモコンを、ケース …

YMZシールドの作成 #1

お疲れ様です。高橋です。 実体配線図を書き起こしておいたYMZシールドの半田付け …

音階LED完成、YMZのノイズの原因判明

お疲れ様です。高橋です。 音階LEDの実装が完了しました。 青色LEDが眩しすぎ …

上司離着席検知システムと空巣検知

お疲れ様です。高橋です。 前回のおさらいと課題 前回の「上司離着席検知システムの …