電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

ウィズ (魔法使いウィズ)の話

今回は少しマイナーなゲームの話です。

小さい頃に近所に個人経営のゲームセンターがあったのですが、すぐ隣の八百屋の店頭に1台だけゲームが置いてありました。
そこにあったのがウィズでした。

なぜかこのゲームが好きで、友達とゲームセンターに行っても1人だけ外に出てWIZで遊んでました。
当時は小学生でそんなに小遣いがあるわけでもなく、遊べる頻度も少ないので2面くらいしか行った記憶がありません。
もしファミコンで発売されていたら絶対に入手してたと思います。

その後、MSX2を入手しました。
blog-e.uosoft.net

この時に魔法使いWIZという名前で移植されていることを知り探したところ、中古ショップで手に入れることができました。
当時はMSX1時代のソフトはコナミ以外は中古で安く買えた時代でこれとロードランナーをそれぞれ1,000円くらいで買ったと思います。
ロードランナーもファミコンで持ってましたが、MSX版の方がオリジナルって感じで好きでした。

その当時もMSXで遊べただけで満足で、あまりやり込むこともなく相変わらず初めのさわりの部分くらいでゲームオーバーになってました。
いまでこそMSX版も好きですが、当時はアーケードと比較するとやはり劣るのであまり満足してませんでした。

現在でもMSX版は再入手してたまに遊んでます。

PS4でアーケードアーカイブスの発売時にはファミ通のサイトか何かで事前に情報を入手して、発売日に購入しました。
Switchを入手後、こちらでもアーケードアーカイブスにあることを見て購入しました。
最近Switch2版のアーケードアーカイブス2も発売されたので、こちらも購入してしまいました。
巻き戻し機能やタイムアタック等が追加されてます。

現在でも1面しかまともに遊んでませんが、たまに遊んでます。

ウィザードリィの話

最近Switch版エルミナージュを購入しまして、気が付いたらレベル100を超えるまでやってました。
エルミナージュを遊んでいるうちにウィザードリィもやりたくなって、Wizardry1リメイクも始めました。PC版とSwitch版の両方購入してPC版の方では既にクリア済みなのですが、今回は積んでたSwitch版の方で初めから遊んでます。

過去にも書いた内容ですが、ウィザードリィについて思い出も含めて加筆・修正します。

初めてウィザードリィ(#1)を遊んだのはMSXでした。当時の遅いPCの中でも特に遅いディスクアクセスで良くやったものです。
#2と#3はキャラを転送して遊びました。
後にファミコンで#1を遊んで随分快適になったと思いました。よく覚えていないのですが、ファミコンでも#2と#3を遊んだような気もします。

PC98で#5を遊んだ後に#4を遊びました。PC98では#4も#5はクリアしてませんが、のちに#5はSFCで、#4はPS1のニューエイジオブリルガミンでクリアしました。特にSFCの#5はやり込んでレベルも200以上になってたと思います。その時、なぜか忍者がLV2~L7の魔法使いの呪文とLV1~L6の僧侶の呪文を徐々に覚えていく変なバグにも遭遇しました。

#6,#7,#8も一応やりましたが、最後までやらずに飽きてしまってます。やはりオールドタイプの方が好きです。
他のシリーズもGBの外伝シリーズやエンパイアシリーズ他GBAの時代までのは機種に関わらず全て手を出しているような気がします。

PS1のリルガミンサーガ(123が1本になったもの)とニューエイジオブリルガミン(45が1本になったもの)は永久保存版だと思い、PS1当時からずっと置いてるものですが、20年ほど前にSFCの5、WSの1、FCの123、GBの123と外伝123もコレクションとして再度買って保存してます。当時は結構安かったと思いますが、PSとWSとGBは今は気軽に買うとは言えない相場になってます。GBは箱説無しで買ったことが悔やまれます。

その後のDSのものやエクスシリーズ以降は何か違う気がしてどうしてもやる気が起きませんでしたが、エルミナージュや五つの試練や戦闘の監獄は久しぶりにまともに遊びました。戦闘の監獄は今でもやりたいと思いiOS版やSteam版、Switch版を買ってあります。


音源作りに持っておきたい本2 Pythonではじめる音のプログラミング

以前、音源作りに持っておきたい本を紹介しましたが、
blog-e.uosoft.net

もう1冊面白い本を見つけたので紹介します。

『Pythonではじめる音のプログラミング』

この本はサンプルコードがPythonで書かれているだけで、そこがメインではありません。
音を出す仕組みが詳細に書かれています。
内容の範囲が広いせいか、基本から書かれているわけではないので、まず『サウンドプログラミング入門』を読むことをお勧めします。

章の構成を参照してもらえればわかる通り、色々な楽器の波形を解析してそれを再現する方法が書かれています。
この部分は他の本ではあまり見たことは無く、非常に重宝します。

章の構成

第1章 音響学
1.1 純音
1.2 複合音
1.3 音の三要素
1.4 音の大きさ
1.5 音の高さ
1.6 音色
第2章 サウンドプログラミング
2.1 サンプリング
2.2 標本化
2.3 量子化
2.4  WAVEファイル
2.5 サウンドプログラミング
第3章 コンピュータミュージック
3.1 五線譜
3.2 音階
3.3 音符
3.4 強弱
3.5 拍子
3.6 テンポ
3.7 音楽の三要素
3.8 コンピュータミュージック
3.9 自動演奏
第4章 MIDI
4.1 MIDI
4.2 ノートオンとノートオフ
4.3 ノートナンバー
4.4 ベロシティ
4.5 プログラムチェンジ
4.6 プログラムナンバー
4.7 パーカッションマップ
4.8 MIDIファイル
4.9 DTM
4.10 自動演奏
第5章 ディジタル信号処理
5.1 周波数分析
5.2 スペクトログラム
5.3 楽器音の周波数分析
5.4 フィルタ
第6章 シンセサイザ
6.1 音響合成のアプローチ
6.2 アナログシンセサイザ
6.3 オシレータ
6.4 時間エンベロープ
6.5 加算合成
6.6 減算合成
6.7 FM合成
6.8 カープラス・ストロング合成
6.9 音のリアリティ
第7章 エフェクタ
7.1 リバーブ
7.2 ディストーション
7.3 コンプレッサ
7.4 イコライザ
7.5 モジュレーション
7.6 デチューン
第8章 ミキシング
8.1 モノラル再生とステレオ再生
8.2 音像定位
8.3 ミキシング
8.4 音楽制作
8.5 ボーカルキャンセラ
第9章 打楽器の音をつくる
9.1 グロッケンシュピール
9.2 トライアングル
9.3 チューブラーベル
9.4 マリンバ
9.5 シロフォン
9.6 ティンパニ
9.7 シンバル
9.8 銅鑼
9.9 ハイハットシンバル
9.10 バスドラム
9.11 タムドラム
9.12 スネアドラム
第10章 管楽器の音をつくる
10.1 フルート
10.2 ピッコロ
10.3 クラリネット
10.4 オーボエ
10.5 バスーン
10.6 サキソフォン
10.7 トランペット
10.8 トロンボーン
10.9 ホルン
10.10 チューバ
第11章 弦楽器の音をつくる
11.1 バイオリン
11.2 ビオラ
11.3 チェロ
11.4 コントラバス
11.5 ハープ
11.6 アコースティックギター
11.7 エレクトリックギター
11.8 エレクトリックベース
11.9 スラップベース
第12章 鍵盤楽器の音をつくる
12.1 パイプオルガン
12.2 リードオルガン
12.3 ハープシコード
12.4 アコースティックピアノ
12.5 エレクトリックピアノ

内容が少々難しいので、『サウンドプログラミング入門』とセットで持っておくことをお勧めします。

JavaScriptでYM2413(OPLL) FM音源を再現する JS2413

JavaScriptでYM2413(OPLL) FM音源を再現する JS2413を公開しました。


作った経緯

今までArduinoやmbedでファミコン音源やPSG音源を作って遊んでましたが、FM音源は理解が難しくなかなか作れませんでした。
そこでコアな部分はClaude Fable 5のお試し分で作ってもらいました。
Fable 5は試し分ではあまり多くは使用できなかったので、単独で使えるようにクラス化やサンプルページの元は手で作りリファクタリングやデバッグ、画面デザイン、ドキュメント出力は節約のためにHaiku4.5で行いました。
前にSonnetでも挑戦したことがあったのですが、なかなか目的の音が鳴らず断念しましたが、Fable 5は素直に作ってくれました。
プリセットの音色データは所々違いましたが、音色データがまとめてあるサイトを見つけたので、ここにある値で書き換えたら目的の音を鳴らすことができたので、FM音源の処理自体は初めから完成度の高いものが出力されたと思います。
参考:音色データの書いてあったページ
https://www.nesdev.org/wiki/User:Ben_Boldt/YM2413_Patches

JS2413 — YM2413エミュレータライブラリ + MMLプレイヤー

Github
https://github.com/uosoft/js2413

サンプルページ
https://www.uosoft.net/js2413/

js2413 は以下の特徴を持つJavaScriptライブラリです:

主な特徴
  • 9チャンネルFM音声合成:実チップと同じ9チャンネル構成をエミュレート
  • 15種類の内蔵ROM音色:ヴァイオリン、ギター、ピアノ、フルート、クラリネット、オーボエ、トランペット、オルガン、ホルン、シンセサイザー、ハープシコード、ビブラフォン、シンセベース、アコースティックベース、エレキギター
  • ユーザー定義音色:@0で自由に音色パラメータをカスタマイズ可能
  • リズムモード:5種類のドラム音(BD/SD/HH/TOM/CYM)をリズムトラックで利用
  • MMLプレイヤー:MSX BASIC の PLAY文互換のMML(Music Macro Language)をサポート
  • 依存なし:純粋なJavaScript、ビルド不要
  • ブラウザ直実行:index.html をブラウザで開くだけで動作(file:// プロトコル対応)

使い方

基本的なMML構文

MMLは1行が1トラック(最大9トラック)で、複数行を同時に演奏します:

t120 l4 o4 cdefg
t120 l4 o3 c2d2
|
  • t120 - テンポ(1分あたりの4分音符数)
  • l4 - デフォルト音長(4分音符)
  • o4 - オクターブ4(o4の A = 440Hz)
  • cdefg - 音名
  • < / > - オクターブ下げ/上げ
  • & - タイ(音を連結)
  • r - 休符
  • @ - 音色選択(例:@1 ヴァイオリン)
リズムトラック

行の先頭に % をつけると、その行はリズムモード専用トラックになります:

%t120 l8 bh bh sh bh
|
  • b - BD(バスドラム)
  • s - SD(スネア)
  • h - HH(ハイハット)
  • c - CYM(シンバル)
  • m - TOM(タム)
Web Audio 再生

エミュレータが生成した波形はWeb Audio APIの ScriptProcessorNode を通じてリアルタイムで再生されます。ユーザー操作後に音が出るため、クリックや操作後に再生が始まります。

技術詳細

エミュレーション方式

YM2413は複雑なアナログ回路を持つチップですが、js2413は以下のアプローチで実装しています:

  • 波形生成:1024サンプルの正弦波テーブル + オプションの半波整流
  • エンベロープ:dBドメインの指数関数型EG(Attack/Decay/Sustain/Release)
  • FM合成:2オペレータペアでの周波数変調 + フィードバック
  • トレモロ/ビブラート:3.7Hz(AM)/ 6.4Hz(PM)の LFO
  • リズムモード:ノイズジェネレータと位相制御ビットで5種類のドラム音を実現

実チップの整数演算による周期性完全再現ではなく、浮動小数点の数学モデルですが、知覚的には十分に実チップの音を再現できます。

レジスタマップ

実チップのレジスタマップを完全に再現しており、レジスタ書き込みコードも動作します:

  • 0x00-0x07 - ユーザー音色パラメータ
  • 0x0E - リズムモード制御
  • 0x10-0x38 - チャンネル制御(周波数、音量、キーオン/オフ)

github.com

JS2151 — YM2151エミュレータライブラリ + MMLプレイヤー

このソースを読み込ませてYM2151(OPM)版を作ってみました。
YM2151はプリセット音源が無いので、MMLプレイヤー側にGM128音の音色データを持たせて指定できるようにしました。
音色は全部は確認していないですが、それっぽい音は鳴るようです。

Github
https://github.com/uosoft/js2151

サンプルページ
https://www.uosoft.net/js2151/

github.com


ゲームボーイ自作ゲーム NU PICK UP GOLD INGOTS (NU君の金塊拾い) 公開します

過去の記事『今でもできるゲームボーイの開発メモ 2026年版』で紹介したGBDK-2020(Gameboy Developers Kit)で作成したパズルゲームを公開します。

タイトルは『NU PICK UP GOLD INGOTS』です。
PC98版はベクター等で「NU君の金塊拾い」と検索すれば出てくると思います。
NU PICK UP GOLD INGOTSは全角を扱えない(扱いにくい)機種用や海外の人にも見てほしいなと思った時の英語名です。

ダウンロードはこちらです。
https://www.uosoft.net/nu/download/gb/nu_gb.zip (直リンク)

zipファイル中にある"nu2026.gb"がROMイメージファイルです。

タイトル画面でSTARTボタンでゲームが始まります。
方向ボタンで移動します。
移動できる範囲に金塊が亡くなった場合や諦めるときはSELECTボタンを押すとゲームオーバーになります。

緑のキャラクタを操作し、すべての金塊を取るとゲームクリアです。
金塊を取ると壁に代わるので通ることができなくなります。一筆書きのイメージで上手く全部取ってください。
ステージは自動生成で毎回変わります。

操作方法はタイトル画面でSTARTボタンでゲームが始まります。
方向ボタンで移動します。
移動できる範囲に金塊が亡くなった場合や諦めるときはSELECTボタンを押すとゲームオーバーになります。

ゲームボーイ/ゲームボーイカラー両対応です。

自作カートリッジも作りました。

今回使用したGBカートリッジリーダーやフラッシュカートリッジは数年前に購入したもので、現在同型のものが見つからないのでここでは特に紹介しませんが、同様の物はAmazonやAliexpressで販売されてます。
gb カートリッジ リーダー』や『gb フラッシュカートリッジ』で検索すると見つかると思います。

ザナドゥの話

久しぶりにザナドゥをやりたいと思って、SwitchのEGGコンソールのリバイバル ザナドゥ イージーバージョン PC-9801を購入しました。
今回はザナドゥの話をします。
過去にも書いた内容ですが、思い出も含めて加筆します。

現在実機のザナドゥはMSX版を所有してます。

MSX版ザナドゥです。

中身もしっかり残ってます。

このMSX版は、オリジナルの発売から2年後の1987年11月に、2メガビットROMカートリッジで発売された、シリーズの中でも最後発の移植版です。それまでMSXへの移植は容量とハードの制約から難しいと考えられていましたが、大容量ROMカートリッジの普及によって実現したのだそうです。後発だけにいろいろと手が加えられていて、セーブがカートリッジ内のSRAMに記録される方式になっていたり、他機種では一覧表示だけだったインベントリー画面がアイテム種類別に名前・所持数・熟練度が見られるよう改良されていたり、BGMも複数曲がPSGで演奏されるようになっていたりと、最後発ならではの改良がいくつも加えられています。一方で、王城でのネームエントリー時に特定の名前を入力すると効果が出る「隠しネーム」のような小ネタは、容量の都合か省略されてしまったようで、何でも追加されたわけではなさそうです。

現在所有しているMSX関連の物は数年前から集めたものであり、MSXが現役の頃から残ってるものはもうないと思ってましたが、なぜかこれだけ実家に残ってました。
最近思い出したのですが、当時から家にあったものではなく、1chipMSXを購入したときになにかROMで遊びたいと思ったときに購入したものでした。

今まで周りにはザナドゥをしっかりやってるように話してましたが、実はLevel2までしかやってませんでした。
当時PCでゲームをしてたほとんど人は持ってただろうザナドゥは私も例外なく買ってしまいましたが、別のゲームにはまっていました。
なぜMSX2版ではなくてMSX版を買ったかはよく覚えてませんが、当時からMSX版の方が評価が良かった気がします。
実際、後発のせいかグラフィックやBGMの完成度は先発のMSX2版よりも高く評価されることが多いようで、実質的な改良版とも言われているようです。先発のMSX2版はオリジナルに忠実な移植ではあったものの、ハードウェアの性能差で解像度が落ちてしまい、画面に表示できる情報量が減った分、武器や防具、アイテムの名称が簡略化されてしまっていたそうなので、後から出たMSX版の方が完成度が高くなったのも納得という感じです。

試しに起動したところバックアップ用電池が切れてました。
カートリッジは裏でネジで止まっているので、簡単に開けられます。
お決まりの端子付きCR2032が使用されています。

SwitchのEGGコンソールPC-9801版「リバイバルザナドゥ」は、オリジナルから10年後の1995年4月に発売されたリメイク版です。基本的なゲームシステムはオリジナルから大きく変わっておらず、モンスターと接触すると戦闘画面に切り替わるシンボルエンカウント方式や、武器・魔法をそれぞれ使い込むほど熟練度が上がっていく育成システムはそのままですが、グラフィックスが400ライン16色になって鮮やかになったほか、BGMもレベルごとに専用の曲が用意され、塔の内部にも独自の楽曲が流れるようになっています。さらにマップ機能が追加され、地形やモンスターの位置をいつでも確認できるようになったのも大きな改良点です。とはいえ難易度自体はオリジナルの硬派さをそのまま受け継いでいるとのことなので、油断はできなさそうです。なお同年12月にはマップやモンスターを差し替えた『リバイバルザナドゥII』という続編的な作品も発売されているそうですが、こちらはまた別の機会に触れられたらと思います。
SwitchのEGGコンソールのリバイバル ザナドゥII PC-9801も購入しました。

ザナドゥは1985年に日本ファルコムから発売されたアクションRPGで、『ドラゴンスレイヤーシリーズ』の第2作にあたります。国内のパソコンゲームとして約40万本という売り上げを記録し、発売から30年が経過した2015年時点でもこの記録は破られていなかったというほどの、当時のPCゲーマーなら知らない人はいないと言われる大ヒット作でした。プレイヤーの目的はシンプルで、地下迷宮の奥に潜むキングドラゴン・ガルシスを倒すこと。そのためには「統治者の証」となる4つの王冠を見つけ出さなければなりません。フィールド上を移動しながら剣や魔法でモンスターを倒し、経験値やお金、食料、アイテムを稼いでいく作りですが、敵やアイテムの数が有限だったり、攻撃すべきでないモンスターを倒すとカルマが上昇したり、食料が尽きると餓死してしまったりと、当時としては非常にシビアな難易度のゲームとしても知られています。発売当時はまだRPGというジャンル自体が珍しく、雑誌のゲームランキングを見ても、ザナドゥ発売後に急にRPGの本数が増えているそうで、いかに当時の市場への影響が大きかったかがうかがえます。

まだインストールだけした状態ですが、今度こそ最後までやりたいと思います。

プログラマブル波形発生器 AD9833をRaspberry Pi Picoで遊ぶ

プログラマブル波形発生器 AD9833を入手したのでRaspberry Pi Picoで遊んでみました。
AD9833は、低消費電力のプログラマブル波形発生器で、サイン波、三角波、および矩形波の出力を生成できるプロセッサです。
SPI接続で制御できるようになってます。
今回はAD9833単体ではなく、25MHzクロックやローパスフィルタ等周辺回路を実装した基板を使用しました。
Aliexpressで購入したのですが、Amazonで販売しているものと同じものと思われます。

Raspberry Pi Pico からMicroPytonで制御しました。
ライブラリはいくつか見つけたのですが、一番簡単そうなAD9833-MicroPython-Moduleを使用しました。
github.com
Raspberry Pi Picoとの接続はこのライブラリの通りにしてみました。

Pico 3.3V to AD9833 Vin
Pico Gnd to AD9833 DGND
Pico IO2 SCLK to AD9833 SCLK
Pico IO3 to AD9833 SDATA
Pico IO1 to AD9833 FSynch

IO1,IO2,IO3はそのままGP1,GP2,GP3に対応してます。

ここで問題があったのですが、購入した基板の問題かわかりませんが、このままでは動作せず、SCLKとSDATAを入れ替えたら動作しました。
説明通りに接続して動作しない場合は試してみてください。

サンプルプログラムをさらに単純化して色々試してみました。

from AD9833 import AD9833
import utime as time

ad9833 = AD9833(sdo = 3, clk = 2, cs = 1,  fmclk = 25)

# setup frequency and phase registers
ad9833.set_frequency(1000,0)  #ここでクロックを設定(Hz)
ad9833.set_phase(0, 0, rads = False)

delay = 1.5  # number of seconds to display each feature
time.sleep(delay)

# freq 0 Sin wave output
ad9833.select_freq_phase(0,0)
ad9833.set_mode('SIN')  #ここで波形を設定 (SIN, SQUARE, TRIANGLE)

7行目で周波数を設定してます

ad9833.set_frequency(1000,0)

1000の部分が周波数(Hz単位)
0の部分はチャンネル。この基板は出力が1個なので0固定

15行目で波形の種類を設定してます。

ad9833.set_mode('SIN')

SINの部分が波形
サイン波:SIN 矩形波:SQUARE 三角波:TRIANGLE

出力をオシロスコープ(RIGOL DHO802)で見てみます。
blog-e.uosoft.net

サイン波は基本となる波形のせいか1MHzでも綺麗に出力されます。

4MHzでブレてきました。

この辺が限度でこれ以上の周波数では形が崩れてしまいました。
5MHzの波形

1KHzの波形

矩形波は割と高周波は難しいようです。
1MHzの波形

500KHzの波形

100KHzの波形

1KHzの波形

三角波は1MHzでは角が丸くなってしまいました。

2MHzではほとんどサイン波です。

500KHzの波形

100KHzの波形

1KHzの波形

プロセッサ自体は12.5MHZまでの出力に対応してるので、周辺回路次第でもっと精度の良い波形が出せると思います。
数100KHzまでの単位で使用するなら簡単に使えるのでお手軽な基板だと思いました。