2026年06月02日(火)の日常

目覚ましで起床、思ったより眠れてなくて少ししんどい。

頑張って在宅勤務を開始、と思ったらリモートPCが「現在は他の人が使ってます」とか言われて繋げられない、時間をおいて試してもダメなので出社している人に頼んでPCの強制再起動でようやく繋がった。誰も居なかったらどうなるんだろうコレ。

色々あってGitHubを仕事用と私用の2アカウント体制にする、今まで使ってたアカウントが仕事用。新しく取った私用アカウントでも個人でGitHub Copilotの有料プランを契約しようと思ったら、まだ新規加入が止まってる模様。ただ今月から始まった新しい使用量プランは以前に比べて異様に制限が厳しいらしいので様子見でもいいかも。

SNSで「昔の16色CG時代にパソ通ではアマチュアの描いたイラストが流通していた」というPostを見る。動画で当時のCGイラストを十数枚紹介していたのだが、その中に見覚えのあるCGイラストが…オレが描いたやつじゃん!

いや心臓に悪い、当時のデータとかは全部消したので手元にも残ってない、ので見るのも30年ぶりくらい? 今見ると思ったよりは良く描けているって感じではあった。ということをこっそり書いておく。

「マンダロリアン&グローグー」でみんな「グローグーが可愛い可愛い」って言ってるけど、実際にはグローグーって50歳なんだよな。ヨーダが900歳なのであの種族としては全然子供なんだろうけども。映画を見ている間「マンドーより年上なんだよな…」って思ってたし。

午後に予定通り雑排水管の清掃が来たので対応。風呂の排水管にあった謎の白いヌメリとかが綺麗になっていて満足。

自作のMAME改造版がかなり重たい処理になっちゃったけど手持ちのPCはそこそこ強いのしかない。ので非力なPCとして久々にSurface Pro4を引っ張り出したが電源ボタンを押しても起動しない。バッテリーが枯れてる可能性があるので数時間ほど充電してみる。

小一時間ほど充電したら起動するようになった、けど初期化されている。初期化した記憶がないのだが、日記を検索したら5年前にWin10のクリーンインストールを試みていた模様。全然覚えてない。

肝心のMAME改造版を動かしてみたら…あかん、パフォーマンスが30%程度しか出ない。Core i5モデルなので内蔵グラフィックはIntel HD520のはずだがダメか。後で気づいたけどSurface Proシリーズってパネル解像度が結構高いので解像度を落とせば行けたのかも。

15時におやつ、これ安い割に日持ちして美味しいけど最中の皮がボロボロ落ちる。

昨日「AliExpressで注文した8BitDo M30が届かない」って書いたけど、今日になって久々の配送ステータス変更通知が来た。本日ようやく日本に到着した模様。つまり香港から飛行機で6日かけて日本に届いたことになってる。実際には単に香港の通関で待たされただけだと思うけど。でもこの分だと注文から二週間の期限には間に合わずに150円引きクーポン確定っぽい。

一時間ほど残業しておしごとおわり、リハビリに行くときは早上がりするのでその分は残業しておかないと。

自分のMAME改造、Claude Codeに手伝ってもらってMAME DEVにPull Requestを出してみた。通るんかなコレ、通るといいなあ。そしてちょっと細かい話のブログエントリを書いてアップロードしたり。あとはYouTubeに画質がいい奴をアップしておきたい。

自分で動かしてみてもなかなかいい出来には見える。STARWARS以外のベクタースキャンゲームもかなり良いですよ。MAMEってVectrexもサポートしてるのでそちらにも使えます。

ReleasesにはWin64のバイナリしかないけど、今回使用したMAME BGFXはマルチプラットフォーム対応なのでコンパイルすればMacOSネイティブバイナリで動きます、実際うちのM5 MBPでバリバリ動いてる。MBPのがコンパイル速度が劇的に早いし、何よりLiquid Retina XDRディスプレイで見るとめちゃくちゃ綺麗。でも色々な問題があってMac向けバイナリが頒布出来ない。自前でコンパイルするのは簡単なんだけども。

ただシェーダはWinでしかコンパイルできない、ひょっとしたらParallels Desktop上のWindowsだとシェーダがコンパイル出来るんだろうか? 後でやってみよう。書いてなかったけどMAME最新バージョンはソースがC++20対応になったのでMSYS2での開発環境構築がかなり楽になった。もうgcc14のアーカイブを探す必要もない。

そいやMAME、デフォルトのベクター描画ルーチンになかなか凄いバグが入ったままになってる、なので他にも色々とありそうな予感はする。見つけたバグは自分の改造では回避しておいた。バグを直すと従来のiniファイル設定が使えなくなるので直してはいない、アレはどうしたものか。

「ぼっち・ざ・ろっく!外伝 廣井きくりの深酒日記」7巻、もう7巻も出てるのかコレ。このままだと本編の巻数を追い越してしまうな。今回きくりの意外な面も見られて面白かった。

Amazon.co.jp: ぼっち・ざ・ろっく!外伝 廣井きくりの深酒日記 7巻 (FUZコミックス) eBook : はまじあき, くみちょう: Kindleストア

MAMEの改造が終わったので久々にFH6を遊ぶ、以前悩まされていた「見た目の彩度が劇的に落ちる」現象が改善。やっぱり「RTXダイナミックバイブランス」のグローバル設定がオンになってたのが原因っぽい。デフォルトがオフなのになぜオンになってたのか、というかコレで見た目が改善されることってあるんか?

明日は出社なので寝る前に準備。日曜の夜に充電した会社借用携帯のiPhone16e、ほぼTeamsの通知を見るだけとは言え現時点でまだバッテリーが85%残っていて凄い。この使い方だとマジで充電無しで一週間持ちそう。

本日のネタ。これは助かる、RetroTINK 4Kのリモコンって超絶に反応悪いんだよね。受光窓がダメなんかな。

RetroTINK 4K Remote

[VectorScan] ATARI STARWARS on MAME Vector Draw Mod.

ずっと前からMAMEでのATARI STARWARSの描画に納得がいってなかった。敵弾はもっとギラギラ光ってたし、被ダメージ時には画面がチカチカするし、デス・スター爆発は眩しかったし。そう思ってたけど、修正するのは大変そう。

ちょっと前に、あることがきっかけで「MAMEでSTARWARSを動かして描画されたベクターデータをファイルにダンプ」「そのダンプファイルをSVGに変換して1フレームずつ表示するWebアプリ」をClaude Codeに作ってもらったことを書いた。その時にいろいろ調べた結果、「敵弾がキラキラする理由」「被ダメージ時に画面が点滅する理由」「デス・スター爆発が眩しく見える理由」がおおよそ判明した。

ATARIのカラーベクターゲームに使用されているAVG(Analog Vector Generator)では、下記のコマンドで描画を行う。実際にはジャンプやコール・リターンなどもあるけど省略。

  • CNTR 描画位置を画面中心にリセット
  • SCAL 描画時のスケールを設定
  • STAT 描画時の輝度・カラーを設定
  • VCTR 指定されたX/Y方向に指定した輝度でベクターを描画、輝度が0だと描画位置の移動のみ

STARWARSだとSTATで指定するIntensity(輝度)が8bit、VCTRで指定するIntensityが3bitである。で、眩しく光ってる敵弾とデス・スター爆発の時のベクターは「STAT Intensity:0xff」「VCTR Intensity:0x7」と最大レベル。つまり最高輝度で何かが起こってる。

古くから存在しているドキュメント「The Secret Life of Vector Generators」を改めて読んでみると、今まで気づかなかった部分を発見した。

The Secret Life of Vector Generators

該当部分を翻訳して引用したのが下記の一節。

デス・スターを思い通りに爆発させるには、同心円をたくさん描くだけでは不十分でした。ビームをぼかして、画面を埋め尽くしたかったのです。フォーカス電圧を制御するために、モニターに真空管を追加することも検討しました。幸いなことに、その部品の納期が長すぎました。そこで、ベクトルジェネレーターにモニターのカラー入力をオーバードライブする機能を持たせることにしました。入力をオーバードライブすると、CRTは通常よりも多くの電流を消費し、高電圧が低下します。これにより、フォーカスグリッド電圧とアノード電圧の通常の比率が変化し、ビームがぼやけます。

つまり設計上、Intensityはオーバードライブ領域まで突っ込めるようになっていて、その時にビームがぼやけて太くなると。コレですわ。

先の「ベクターダンプデータを元に表示するWebアプリ」に、そのオーバードライブ時の処理を入れてみたらいい感じに表示された。ビンゴだ。被ダメージ時に画面が点滅するのは、画面外にこのオーバードライブ状態のベクターが描かれたら光らせればいい。これも良い感じ。

じゃあこれをリアルタイムでやればいいのか? MAMEの改造とかしんどすぎるよ、と思いつつClaude Codeに頼んでみると行けそうな感じ。マジか?

しかし上手く行かない。bgfxとか知らなかったので、Claudeに指示する方もふんわりした言葉でしか出せないのが原因。作って壊して勉強しての繰り返し。なんとか三回目で納得いくものが出来た。

ある時、Windows限定でMAMEを「-video d3d -hlsl_enable」で起動すると、Direct3D9を利用したレンダラがベクタースキャンゲームで有効になることに気づく。こっちの方が見た目がいい。じゃあこれを急遽マルチプラットフォーム対応のbgfxに移植して、先のオーバードライブと画面点滅を実装すればいいんじゃねと。

しかしそのまま移植するとかなり重たくなってしまった。たまたま40fpsのSTARWARSだとギリギリで動いてしまうので気づかなかったけど、60fpsのTEMPESTだと処理落ちする始末。慌てて軽量版を作って回避したり、RTXの自動輝度補正が悪さをして原因究明に時間がかかったり。

そしてなんとかなった。ソースコード・ドキュメントはほぼすべてClaude Codeによるもの。動画はNVIDIAツールで録画しただけの代物。敵弾と被ダメージ表現は我ながらいい感じだと思う。デス・スター爆発はもうちょいなんとかしたかったけど、改善するにはMAMEの表示周りを大改造しないとダメだと思う。

被ダメージ時のモニタ点滅のメカニズムを動画で再現、蛍光面の外に強いビームを出すとブラウン管内部で拡散されてモニタが光る。エミュレータでもちゃんと実物と同じ動きをするのは作った本人でも感動する。

TEMPESTデモアトラクトも出しておく。実機には負けるけどタイトルの眩しい感がポン出しで出せたのは嬉しい、実機だとモニタが焼けるほどの輝度だし。

Windows 64bitバイナリは下記からダウンロード出来るので、試せる人は試してください。当たり前だがROMイメージは付いてないので自分で用意する事。アーカイブ中のvector-mod.txtを読んでbgfxにしないと見た目が変わらないので注意。非力なマシンだとちょい厳しい。CPUよりグラボ依存。

Release MAME Vector CRT Mod (0.288, Windows x64) · okaz-code/mame

そしてMAME devにpull requestも出してしまった。ちゃんと規則を守って出してる。大丈夫なんかなコレ。

MAMEに元からあるD3D hlslから移植・改造した項目は下記の通り

  • 蛍光体残像
  • 色変換/コンバージェンス
  • デフォーカス
  • シャドウマスク
  • 球面(樽)歪み
  • 長いベクター線の輝度減少
  • 多段BLOOM(8 段・RGBA16F 累積)、オリジナルの15段を軽量化

自分で設計して追加した項目は下記の通り

  • ベクター線両端の円描画処理
  • HALO平滑化(BLOOMの段数が少なくなった代わりの措置)
  • 糸巻き歪み
  • 縮小によるオーバースキャン領域の表示
  • フレーム単位でのフリッカー処理
  • RGBカラーの調整
  • オーバードライブ(STARWARSのみ)
  • モニター発光(STARWARSのみ)

その他いろいろあったかも。ありすぎて分からん。

非力なマシンではダメだと思ってはいたけど、手持ちのSurface Pro4でフレームレートガタ落ちになったのには笑えなかった。さすがに仕方がないか?

まだやりたいネタは色々あるけど、これ以上は流石に手間暇が大変そうなのでちょっと休もう。