Arduino で YAMAHA YM2151 を VGM ファイルで演奏させる

1990年代の多くのアーケードゲーム機に搭載されていた音源チップ YAMAHA YM2151 を Arduino からこの手でどうしても発声させてみたい。

電子工作を始めて Lチカもそこそこに製作を始めた”未来ガジェット”のひとつです。

結構前につくったものでしたが、どのように製作したか忘れぬよう github に Arduino スケッチと参考させていただいた資料・回路図のリンクを掲載してみました。

Play back the VGM format file with Arduino. (only YM2151)

https://github.com/h1romas4/arduino-vgmplayer

本スケッチでは VGM Format と呼ばれる、音源チップに流すデーターダンプ形式を、そのまま YM2151 に write して発声させる方式を採っています。

このことから Arduino のスケッチは 100行ほどの単純なものになり、まずは発声させてみたい方にはちょうど良い規模感のプログラムになっています。たとえば PSG を同時に鳴らしたい、なんて時も数行足してもらえれば実装できると思います。

演奏データとなる VGM ファイルは mml2vgm を使わせて頂き MML (Music Macro Language)で作成しました。MML の書き方は体が覚えていることでしょう 😀

https://github.com/kuma4649/mml2vgm

[概要]
このツールは、ユーザーが作成したMMLファイルを元にVGM/XGMファイルを作成します。

[機能、特徴]
[VGM]
・メガドライブ2台分の音源構成(YM2612 + SN76489 + RF5C164)*2にそったVGMを生成します。
(他にYM2151,YM2203,YM2608,YM2610B,SegaPCM,HuC6280に対応しています。)

github 上のサンプルは次のようにしてみました。(カエルの歌の3声輪唱です)

assets/vgmsaple.gwi

'@ M 110
   AR  DR  SR  RR  SL  TL  KS  ML  DT1 DT2 AME
'@ 022,005,000,004,005,041,000,001,005,000,000
'@ 016,008,008,008,002,000,001,002,005,000,000
'@ 031,018,000,004,010,044,000,008,009,000,000
'@ 031,009,007,008,002,003,001,001,009,000,000
   ALG FB
'@ 004,007

'X6 T160@110l4 r1r1r1r1 cdefedcrefgagfercrcrcrcrc8c8d8d8e8e8f8f8edc
'X7 T160@110l4 r1r1     cdefedcrefgagfercrcrcrcrc8c8d8d8e8e8f8f8edc
'X8 T160@110l4          cdefedcrefgagfercrcrcrcrc8c8d8d8e8e8f8f8edc

このテキストファイルを mml2vgm により .vgm 化して、Arduino のスケッチから PROGMEM で Flash メモリーに書き込んでいます。(music/vgmsample.h

曲の大きさによっては Arduino の 32KByte Flash に載りきらないため、作例では EEPROM を接続し書き込んだデーターを演奏させることもしています。(ちなみに EEPROM を単純に 1Byte 読みすると速度が追いつかなかったため、先読みのリングバッファのような実装を入れました)

ハードの方は Arduino UNO のシールドで実装しています。(まずはブレッドボードで動作を確認した方が良いと思います)

足の数に対して基板が結構小さく、おまけに全部ビニール線で繋いだため結構大変でした。。とはいえ、初心者の自分が、2日くらいハンダ付けをがんばれば完成しましたので、おそらくみなさまいけるかと思います。(部品は AliExpress で入手しています)

さて完成した機械から奏でられた音色は…

リーディングシュタイナー発動…!!!

苦労した甲斐もありまして、無事タイムリープに成功。 😀

子供の頃からゲームの音楽と言えば FM 音源で、なんとかいい音で聴こうと PC からラインを引っ張り出してステレオコンポに接続して、何度も何度も聴いていたことを思い出します。

この機械は、電源を入れればすぐ楽曲が奏でられますので「古の電子オルゴール」として現在も活躍中です。

Arduino Pro Micro を使ってセガサターンのコントローラーを USB に変換する

Arduino Pro Micro の勉強も兼ねまして、セガサターンのバーチャスティックを USB HID 化して PC に接続できるようにしてみました。

使いました Arduino Pro Micro 互換機はこちらです。

KEYESTUDIO Pro Micro Atmega32U4 5V、ピンヘッダーを交換Pro Micro for Arduino

この機械は SparkFun  社が設計した本家の Arduino には存在しないラインナップで、KeyeStudio のはさらにその互換機になります。 1000円くらいなり。

ということで、まずは Arduino のボードマネージャーに以下の URL を指定して、SpackFun Pro Micro をボードに追加します。

https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json

ボードを追加したら書き込み対象の Arduino に、 SpackFun Pro Micro の 5V/16MHz を指定します。 vscode-arduino を使っている場合は、arduino board configuration が次のようになります。

デフォルトが 3.3V/8Mhz になるようですので要注意です。 この指定でもすんなり書き込めてしまうようですが、どんなプログラムを実行しても不明な USB デバイスになってしまう悲しい機械になってしまいます。(ちょっとはまりました…

また、Pro Micro に USB HID になるプログラムを書き込み、実行が始まると USB HID と COM ポートが OS に認識されますが、この際に COM ポートが書き込み時のものと異なるポートに配置され、次回のプログラム書き込みができなくなるケースがあるようです。 Windows であればデバイスマネージャから、どのように認識されたかを確認して、書き込みできない場合は COM ポートの設定を合わせてみてください。

特殊な操作として、起動中の Pro Micro の RST 端子を GND にちょいちょいと 2回落とすとリセットがかかり初期状態の COM ポートが 8秒間だけ現れる機能があります。

8MHz で設定してしまったなど、どうしても書き込みができなくなった場合は、コンパイルから書き込みに入ったあたりでリセットをかけ、出現した COM ポートめがけて Lチカなどを転送すると元に戻ってほっとします。 😀

てなわけで若干癖があるボードですが、無事セガサターンのバーチャスティックを USB 化することができました。

結線やソースコードは github に公開してみました。

Convert Sega Saturn controller to USB HID joypad using Arduino Leonardo / Pro Micro.

https://github.com/h1romas4/arduino-saturn-joystick

ジョイスティックデバイスとして認識したら、Windows では次の画面で動作確認をすることができます。

ボタンキーアサインは手持ちしていました HORI のファイティングスティックmini を真似てつくってみました。

ソースコードの次の部分でボタン番号を指定できますので、好みに変えてみてください。 0,1,2… が画面上 1,2,3… ボタン相当です。(9は存在しないボタン)

uint8_t buttonMap[3][4] = {
    { 4, 9, 9, 9 },     // L  -  -  - 
    { 6, 0, 3, 5 },     // R  X  Y  Z
    { 8, 1, 7, 2 }      // S  A  C  B
};

なるべく入力断面を合わせたり、遅延しないようにつくったつもりですが果たして…

違和感なく動作しているようなので、ザック島に急ぎます。3D プリンターでケースをつくろう。 🙂

PocketStation(ポケステ) 開発 2018年版

初代プレイステーションと連携して動く 1999年発売の携帯ゲーム機 PocketStation(ポケステ) をお友達が発掘してお借りすることができたので、当時流行っていた、ポケステをゲーム機として使わずに ARM マイコンとして遊ぶプレイを蘇らせてみました。 😛

さすがにこれだけ年数が経過すると解説しているサイトさんも消え始めていていますので、2018 年版ポケステ・Hello World の手順を書いてみたいと思います。

ポケステメモリの読み書き

ポケステはプレイステーションのメモリーカードとしても動作し、ポケステ用として目印がついているメモリー領域が、ポケステ上でプログラムとして動作する構造になっています。

ということで、まずはプレステ用のメモリーカードリーダーを Arduino マイコンで製作しました。

ポケステが刺さるカードエッジコネクターの入手が難関ですが、昔使っていたパラレル接続のプレステメモリーカードリーダーが宝箱入れから発掘されたので、基板からコネクターだけ拝借しました。(コネクターがない方で Arduino を使いたい方は、8本ですのでなんとか足を引っ張りだしてください)

発掘されたもの(オリジナルの商品名は失念…)

分解してはんだ吸いですっぽんしたら割と簡単に抜けました。この機械は、セントロニクスパラレルポートで SPI を制御、PS/2 の端子から 5V を取っていたようです。

外からは見えませんでしたが、密かにコントローラーの端子もついていました。

カードエッジコネクターが入手できたら、これを Arduino に接続していきます。

資料と Arduino のファームは MemCARDuino を使わせていただきました。

https://github.com/ShendoXT/memcarduino

Arduino PlayStation 1 Memory Card reader

Looking at the Memory Card:
_________________
|_ _|_ _ _|_ _ _|
 1 2 3 4 5 6 7 8

1. DATA - Pin 12 on Arduino
2. CMND - Pin 11 on Arduino
3. 7.6V - External 7.6V power (only required for 3rd party cards and knockoffs)
4. GND - GND Pin on Arduino
5. 3.6V - 5V pin with a voltage divider to 3.6V
6. ATT - Pin 10 on Arduino
7. CLK - Pin 13 on Arduino
8. ACK - Pin 2 on Arduino

ポケステに関しては、3pin は結線不要。 5pin は 5V を入れても動作するようです。(3.3V だと動きませんでした)

クロック制御に Arduino の SPI を使っているため、Arduino “UNO” 以外の方は接続するピンが違いますので注意してください。 Arduino “MEGA” だと SPI は 50pin あたりからです。Arduino “Nano” は Arduino language が SPI 非対応のため使えません。

シールドに乗る大きさだったので、Arduino UNO の上に載せました。 🙂

配線できたら、PC に接続し MemCARDuino.ino をコンパイルして Arduino に転送します。

次に MemCARDuino のファームに対応した memcardrex クライアントを使わせていただき、メモリー吸い出しをして動作確認してみます。(一番下のリンクにコンパイル済みのバイナリがあります)

https://github.com/ShendoXT/memcardrex

Advanced PlayStation 1 Memory Card editor

Shendo’s software

MemcardRex 1.8 released

MemcardRex は Windows 用 C#.NET のデスクトップクライアントですので、他の OS をお使いの方は MemCARDuino に付属の Python2 スクリプトを使うと良いと思います。( Linux で動作することを確認しました。機械の動作がおかしい場合のデバッグにも使えます)

MemcardRex を起動し Option から接続した Arduino の COM ポートを選択、Hardware から read -> MemCARDuino あたりで吸い出しが開始されます。もし進捗メーターが進まなければ、配線がおかしいので確認してみてください。

読み出したら内容をバックアップしておきましょう。

MemcardRex は .mcs のメモリーカード形式をインポートして書き込むことができます。というわけで次からは、ポケステ用のソースをコンパイルしてバイナリを作成し、 .mcs に変換して書き込んであげるという手順になります。

ポケステ用開発環境とひな形のダウンロード

ポケステの CPU は ARM7 だということで、本家 ARM さんのページから GNU Arm Toolchain をダウンロードします。 今回は Windows を使っていたので、 gcc-arm-none-eabi-7-2017-q4-major-win32.zip をダウンロードして展開します。

https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads

The GNU Embedded Toolchain for Arm is a ready-to-use, open source suite of tools for C, C++ and Assembly programming targeting Arm Cortex-M and Cortex-R family of processors.

次に、ポケステ開発のひな形とライブラリ、ビットマップや bin2mcs などの周辺ツールを公開されている方がいらっしゃいますので、ありがたくダウンロードさせていただきます。(左フレーム PocketStation です)

http://onorisoft.free.fr/retro.htm

PocketStation DevKit, Lib & Tools v3.4

This is my complete devkit for the PocketStation, I used it to make PKBIOSTool and the NyanCat.
Full source and tools included !
Please give credits if you use it ! and drop me a mail if you make PocketStation stuff 🙂

psdevkit.zip を展開すると tools と Example がありますので、この手順では Example の中のプログラムをコンパイルして動作させてみたいと思います。

psdevkit Example のコンパイル

Example のコンパイルでは make コマンドを使っていますので、OS に導入されていない場合はインストールします。今回は Windows を使いましたので Windows 10 の bash on Windows(WLS)上の Ubuntu の make を使いました。(Cygwin でも良いと思います)

bash を起動し、試しに make と入力し “コマンドが見つかりません” なら表示された apt の手順で導入します。

次に、Makefile から呼び出される GNU Arm Toolchain の arm-none-eabi-gcc.exe などが入っている bin ディレクトリと、psdevkit 同梱の tools の mcpad.exe への PATH を bash に次のような感じで設定します。(相対パスで指定した例)

export PATH=../../gcc-arm-none-eabi/bin:../tools/mcpad/:$PATH

bash on Windows は bash 内から .exe ファイルを実行することができますが、.exe 拡張子がついていないと Linux のコマンドと混乱するため Makefile を次のように変更してコマンド名に .exe をつけてあげます。

CC	= arm-none-eabi-gcc.exe
LD	= arm-none-eabi-ld.exe
AS	= arm-none-eabi-as.exe
OBJCOPY	= arm-none-eabi-objcopy.exe
OBJDUMP	= arm-none-eabi-objdump.exe
...(略)
${PROG}.bin: ${PROG}
	${OBJCOPY} -O binary ${PROG} ${PROG}.bin
	mcpad.exe ${PROG}.bin

これにて make を実行してあげると ARM バイナリの test.bin ができるハズです。

なお、tools に入っている mcpad.exe や次で使う bin2mcs.exe などはソースファイルが同梱されていますので、Windows 以外の方は事前にコンパイルして実行可能な状態にしておいてください。

バイナリをポケステに転送する

最後に出来上がった .bin バイナリを tools に入っている bin2msc.exe で memcardrex で import できる .mcs に変換します。

../tools/bin2mcs.exe BESNESP00000GAMETEST test.bin test.mcs

第一引数の文字列指定の詳細は bin2msc.exe のヘルプから参照できます。

test.mcs が出来上がったら MemcardRex を起動し、メモリーを読み込み後、未使用スロットの上で右クリックし test.mcs を import して Hardware -> Write してあげれば…

めでたい 😀

Example で使われている pocketlib.h (& header.S) はポケステ用のライブラリです。初期化・終了処理、スプライト、vsync 割り込み、オーディオ用の割込み処理などなど大変便利なものです。

また pocketlib.h と合わせて次の資料も大変参考になりました。(ありがとうございます!)

DEEPER THAN POCKETS

本ページはPocketStationの情報を後世に残すことを目的としています。

POCKETSTATION GENERATION

ポケットステーション対応ソフトの開発資料や関連資料を掲載したサイトを紹介します。

ポケステは 32×32 液晶と LED と IrDA と 10bit DAC がメモリマップドI/O でコントロールでき、プログラミングはアセンブラが必要な部分があったりちょっとプロフェッショナルですが、それも含めて楽しめるのではないかと思います。

お店で見かけましたら、1台ぜひ。 😀