VRChatでゲームボーイのアーキテクチャについてLTしてきたよ+補足

先日(4/23)、VRChat CS集会にてゲームボーイアーキテクチャについてLTをしてきたので補足とかふりかえりの記事です。

当日聞きに来ていただいた方は本当にありがとうございました。 緊張しましたが、たくさんの人に聞いていただけてうれしかったです。 終わったあとも夜遅くまで話が盛り上がり楽しかったです。

なお、アーカイブは後日CS集会のDiscordにて公開されるとのことなので、気になる方はぜひCS集会Discordサーバに入ってみてください。

なお、スライドのPDFはウェブサイトで公開しています。
ウェブサイト: https://kimkim0106.net

ダウンロードはウェブサイトからどうぞ

補足

5ページ: ゲームボーイのハードウェア

前回のLTに引き続き、基本的に Pan Docs からの引用です。情報がまとまっていて非常にありがたいサイトです。

ゲームボーイアドバンス任天堂公式サイトにスペックが書かれています。 CPUの型番はgbadocからの引用です。

ただ、ゲームボーイがSTN液晶ということはここには書いていなかったので、出典について補足しておきます。
www.itmedia.co.jp

6〜8ページ: 分解してみた・チップの詳細

LT後の雑談中、残っていた人たちと写真を見返していたところ、初代ゲームボーイのほうは、抵抗やコンデンサがチップではないということに気づきました。 どういう理由かはわからないですが、80〜90年代ごろはチップ抵抗があまり使われていなかったのでしょうかね?

ゲームボーイの基板

9〜11ページ: ゲームボーイのCPUは何なのか・CPUの違い

SHARP SM83 という表記は、Pan Docs だったり、Game Boy: Complete Technical Reference あたりにかかれています。

また、8080なのかZ80なのかみたいな議論については、こちらの記事が詳しいです。 8080相当の機能があれば十分 + 複雑な拡張機能を削ることで回路を小さくできるので、削ったのではないだろうかという説は納得できます。

www.wizforest.com

25ページ: ロゴチェック

ロゴチェックによって、法的に非正規のロムを取り締まれるかどうかという話は、Pan DocsのPower-Up Sequence のページで説明がされています。

gbdev.io

27ページ: サウンドの仕様

カートリッジの音声入力端子を使った市販ソフトはないらしいですが、非公式なものだと実装例が存在します。 自分が発見したものをいくつかリンクを貼っておきます。

orangeglo.github.io github.com

28ページ: 波形メモリ

サンプルに貼った波形メモリの音色ですが、これはポケモン金・銀・クリスタルのエンディングの主旋律で使われているものです。

波形のパターンはbgbのDebuggerにあるIO mapを使うと簡単に確認できます。 メモリのFF30~FF3Fを見てもいいのですが、再生中だと正しく読み取れません。 詳しくは Pan Docs の Audio Registers の FF30–FF3F — Wave pattern RAM あたりを読んでみてください。

gbdev.io

32ページ: ゲームボーイで色がつく仕組み

質問タイムでスーパーゲームボーイはどうなっているのかという話をいただきました。 その場で仕組みが違うという話をしましたが、こちらについて少し補足をします。

1枚目はゲームボーイカラー(以下GBC)、2枚目はスーパーゲームボーイ(以下SGB)ですが、SGBのほうがパレットが少ないことがわかります。 GBCは背景のタイルやスプライトのタイルに色をつけられるのですが、SGBだとモノクロのゲームボーイのようになってしまっています。

ゲームボーイカラーの画面とパレット
スーパーゲームボーイの画面とパレット

SGBからスーパーファミコン側に送られるのはモノクロ4階調の画像なので、基本的に画面全体に対して色をつけることしかできないためです。 ところが、戦闘中の画面はカラフルでゲームボーイカラーと変わらない表示になっています。 これはどういうことかといいますと、SGBは画面の一部範囲に別のパレットを指定できるのです。 今回の場合、体力ゲージのあたりはSGB0もしくは1、敵のグラフィックはSGB3、といった感じでパレットを指定しているわけですね。

スーパーゲームボーイの戦闘画面
ゲームボーイカラーの戦闘画面

ゲーム画面下の「SGB packet」というウインドウに表示されているのは、SGBのCPUからスーパーファミコン側に送られる制御コマンドです。 実際に解読してみようかと思いましたが、これだけで一本記事が書けそうだったのでここでは止めておきます。 ざっくり解説しますと、ATTR_BLKでどの範囲にどのパレットを割り当てるかを指定して、PAL01とPAL02でパレットの色情報を送信しています。

ただし、画面上の位置でパレットの範囲指定をしているので、フィールド画面などスクロールには使えないので、4色表示になってしまうというわけですね。

33ページ: 同時発色数は本当に56色?

こちらのスライドについて、何FPS出ているのですかという質問をいただきました。 その場の回答は、サンプルプログラムのソースコードをじっくり読んでみないとわからないというのと、画像なのでリフレッシュレートはそんなに関係なさそうみたいなことを言ったように覚えています。

次のスキャンラインの描画までにパレットを書き換えが間に合っていることを考えると、60FPS出そうな気もしますが、あくまで想像なので、そのうちちゃんとソースコードを読んでみます。

github.com

ふりかえり

良かった点

アーキテクチャ」というタイトル通り、広く浅くにはなりましたが一通り詰め込むことができました。

あと、前回の振り返りを活かして、内容を気持ちマイルドにしてみましたが、どうでしたかね? 最初に「ゲームボーイ知ってる人~?」みたいな感じで聞いてみたのは、一方的になりすぎず良かったように思います。 スライド1枚あたりの情報量というか文字を減らすみたいなのも少し気をつけたポイントではあります。 スライドの場合、図をたくさん入れておくと、全部口で喋らなくていいので楽だしわかりやすそう。

前回の発表についてはこちらの記事もご覧ください。 kimkim0106.hatenablog.com

反省点

スライドを作るのがぎりぎりになってしまったので、もうちょっと余裕を持って準備をすればよかったなとはおもいました。 時間があれば、もうちょっとは最適化できたかもしれない。

と、おもいつつ Lightning Talk なのでもうちょい気軽にしたほうがいいんだろうなと思ったので、そんなに頑張らなくていいのかもしれない。 研究発表でもないし。

あとは、もうちょい勉強しないとなと思いました。

その他

次のLTはどこで何を話そうかな…

令和の時代にPHSでモバイルアダプタGBは使えるのか?

結論から言いますと、使えませんでした…

とはいえ、色々と試してみたので時間があれば読んでいってみてください。

あと、自営モードでデータ通信ができるDDIポケットの端末を知っている人がいれば教えてください。

モバイルアダプタGBとは?

ゲームボーイカラーゲームボーイアドバンス用の周辺機器で、携帯電話経由でオンライン接続できるようにするというものです。

当時のニュース記事を見かけたので、こちらもご覧ください。

k-tai.watch.impress.co.jp

携帯電話の規格ごとに別々の物が用意されていて、以下の3種類がリリースされました。

これ以外にもドコモ・アステルPHS用が予定されていましたが、出ませんでした。

当時は、プロバイダ(DION)と契約することで、メールの送受信やホームページの閲覧、コンテンツのダウンロードが出来たのですが、2002年にサービス終了してしまっています。

ちなみに、当時のホームページはまだ残っています。

www.nintendo.co.jp

その一方でサーバを介さないP2P通信は、モバイルアダプタGBと携帯電話さえあればその後も可能でした。

PHSはまだ使える!

PHSはすでにサービス終了して過去のもの…と思っていたのですが、構内用や家庭用など自分で基地局を立てて運用する場合はまだ使えます。 というのを、PHSでデータ通信をしている動画を見かけて知りました。

www.youtube.com

そこで、モバイルアダプタGBもできるのでは?と思ったのでした。

誰もやってそうになかったので、試してみるしかありません。

機材を揃える

ということで、次のものを用意しました。(ゲームボーイカラーとソフトはすでに持っていたので含まれません)

1. モバイルアダプタGB DDIポケット

これがないと始まりません。

今でも中古でモバイルアダプタGBは時々流通しているのですが、ほとんどがPDC用で他のものを見かけることはあまりありません。 今回、運良くネットオークションで発見し、入手できました。

モバイルアダプタGB

2. PHS端末 (SANYO RZ-J90)

DDIポケットPHS端末です。自営3版に対応していて、現在でも子機として使用できます。

SANYO RZ-J90

3. ワイヤレスTA (NEC Aterm IWX70)

ISDNのTAですが、PHSの親機にもなります。

PIAFSにも対応していて、PHSのデータ通信をISDN経由で行なえます。

NEC Aterm IWX70

試してみたが…

というわけで、必要なものが一通り揃いました。つながった姿が見られただけでも正直満足。

モバイルアダプタGBを繋いだ図

前述の通り、P2P通信しかできないので、ポケモンクリスタルの通信交換機能を使って試すことにします。

モバイルで通信交換

1台しか持っていないので、とりあえず自宅内に設置したIP電話に向けて発信してみます。 電話番号は7桁以上入力する必要があります。 また、「#」や「*」がないので、内線電話やトランシーバーモードで使うのも難しそうです。

電話をかけてみる
電話をかける画面
つうしんエラー

色々と試してみたのですが、うまくいかなそうです…

そもそもTA親機側のPHSランプが点滅しないので、親機・子機間の通信もうまく出来ていないように見えました。

考察

うまくいかなかった原因を色々考えてみましたが、次の3つぐらいがありそうです。

1. そもそも、家庭モードでモバイルアダプタGBが使えない?

DDIポケット電話機の待受モードが公衆モードに設定されていない場合、正常に通信できません。DDIポケット電話機の取扱説明書に従い、DDIポケット電話機を公衆モードに設定してください。

モバイルアダプタGBの説明書にこう書かれており、モバイルアダプタGBは家庭モードやトランシーバーモードをサポートしていないようです。

ただ、この説明書に記述を文字通りに受け取ると「正常に通信」できないだけで、通信自体はしてくれそうにも思えます。

2. 今回使ったPHS端末が家庭モードでデータ通信できない?

データ通信自体はできるのかどうかを試すべく、IO-DATAのUSB-AH64というPCとPHSを接続する通信アダプタを購入してみました。

www.iodata.jp

2002年発売のアダプタなので当然最近のOSはサポートしていませんが、Windows 98が入ったPCがあるのでダイアルアップ接続できるかを試してみます。

ワイヤレスTA自体はPIAFSに対応しているのですが、やはりだめなようです。 PIAFS以外の通信方式も色々と試してみましたが、うまくいきません。 モバイルアダプタGBのときと同じく、TAのPHSランプは点滅しませんでした。

ダイアルアップ接続失敗

PHSの画面を見ていたところ、待受モードを変更する画面が表示されており、公衆モードに切り替えようとしていたのだと思われます。

待受モード切替画面

となると、このPHS端末が家庭モードでデータ通信できないのでは?と思いました。

他の機種がないので試せていませんが…

3. そもそもDDIポケットの端末は家庭モードでデータ通信できない?

2で、うまくデータ通信出来なかったと書きましたが、そもそもAtermのサポート機種にも、DDIポケットのものはデータカード以外には書かれていませんでした。 なので、DDIポケットの端末のものではデータ通信できないのかもしれません。

www.aterm.jp

また、IO-DATAの通信アダプタの説明書にも、「公衆モードでご利用ください」と書かれているので、やはりできないのかもしれません。

www.iodata.jp

もしこれであれば、お手上げです。

αPHS時代の古いものであればいけるかな?とも思いましたが、親機の入手が難しそうです。(PHS-J80は持っているので親機さえあれば試せるのですが)

さいごに

動作させることができず残念でしたが、PHSとかISDNについて色々と知ることができて面白かったです。

モバイルアダプタGBPHSについては、他にも色々実験できないか試したいと思っています。

VRChatでゲームボーイソフト開発についてLTをしてきたよという話

先日(1/27)、エンジニア作業飲み集会にてLTをしてきたのでその感想とか補足について書こうと思います。

そういえば、VRChatどころか公の場でLTをやったの初めてだったかもしれない…

なお、アーカイブはエンジニア作業飲み集会のYouTubeチャンネルにて公開されています。

youtu.be

スライドのPDFはウェブサイトにおいてあるので、興味のある方はぜひご覧ください。

ダウンロードはウェブサイトからどうぞ

ウェブサイト: https://kimkim0106.net

全体的に振り返って

LTとしてはギリギリなボリュームだったかな。 ちなみに2回リハーサルしたけど、どちらも10分を超えてしまっていた。

本番は急ぎ気味で話した結果、ぎりぎり10分に収まったのでヨシ!と思ったけど、ちょっと内容が単調だったのは改善ポイント。

しゃあないんや…まじめなスライドしかつくったことなかったんや…

こうやって実際にLTしてみると、他の人の発表聞いても構成とかスライドのつくりとかかなり参考になって学びが大きかった。

各スライドについて

4ページ: こんなことやってます

4ページ: こんなことをやっています

この写真の説明を軽くしておきます

    • 当時持っていたゲームボーイカラーたちです。
    • 最近1台増えて6台になりました。こいつらの紹介もしたい。
  • 中の上
    • 「実際にやってみた」のあたりで紹介しているやつなのでそっちを見てね
  • 中の下
    • 自作カートリッジ
    • 自作といいつつ、オリジナルなのは裏面だけだけなので、そのうち1から基板を設計したい
    • 独自カートリッジを作るための研究
    • Raspberry Pi Pico W をそのために買ったけど、うまくいってなくて放置している
    • うまく行ったら発表したい

5~7ページ: ゲームボーイについての説明

5ページ: ゲームボーイとは?
どこまで説明したらいいのかわからんかったのでほどほどにしたつもりだが、もうちょっと端折っても良かったと思った。

ハードウェアスペックについての記述も難しい、というか公式に発表されていないのでサイトによって微妙に違ったりする。 今回は参考文献に貼った Pan Docs の表記を大いに参考にした。

本当は、最新ハードであるNintendo Switchとの比較を載せようかと思ったけど、そっちのほうも公式に発表されていなかったのでやめた。

ちなみに、説明の各所で出てくる実機の写真は全部所有物です。(なぞのこだわり)

8~14ページ: ゲームボーイ開発についての説明

スライドにスクショ貼るためだけに GB Studio をインストールした。 結構開発体験は良さそうと思ったが、コードを書きたい人には物足りなさそう(自分とか)。

RGBDS は今回このスライドを作っているときに、GBDK の他に開発環境ってないんかな…と思って調べてて見つけたやつ。 アセンブリ書いたことないけどチュートリアルとかもあったので、ちょっとやってみたいとおもった。

エミュレータについても、bgb だけの説明にしようかと思ったけど、SameBoyが結構良さそうだったのでそれも載せた。 Linux ネイティブで動くものも一応載せておこうかということで、VBA-Mも載せた。 VBA、まだあるのかと思ってちょっと懐かしい気持ちになった。

15ページ: Flash カートリッジの説明

MBCの説明を入れようかと思ったけど、スライド多すぎるのと難しい内容なので完全に削った。 バンク切り替えの話とかし始めると Long Talk になってしまう。

とはいえ、2MBのやつを買わないと GB Studio のやつは厳しいよな…と思ったので「大容量・RAM付きなど色々ある」というのはギリギリ追記したけど話しそびれた。

16ページ: ハードウェア仕様書

調べたらほんとうになんでも出てくるのですごい。 シリコンを解析しているのを見つけたときは、そこまでやるんか…と思った。

せっかくなのでリンクを貼っておく。

github.com

github.com

17~21ページ: 実際にやってみた

当日に物足りなさを感じて追加したけど、正直いらんかったかも。

もしくは、もうちょいスライドを減らしたほうがよかった。

22~25ページ: まとめ、参考文献、リンク

ゲームボーイソフト開発、意外にハードルは低いのでみんなやろうなという気持ち。 でも、堂々とできるかと言われるとそうではないので、人に勧めるのが難しいものではある。

参考文献を貼ったのは、半分ぐらい研究発表の気分で挑んだからだったので、まぁなくてもよかった。 とはいえ、どんな資料にもソースというか根拠が欲しいよなぁと日頃から思っているのでいれた。

リンク集については、最後にまとまってたほうが便利と思ってそうした。 本当はスライド各所に入れるつもりだったけど、スペース的にも厳しかった。

その他

別な集会の主催者から「LTしない?」と声をかけてもらったので、そのうちまたやるかもしれないです。

そのときは、もうちょいアーキテクチャとか開発よりの話をしたいなぁとおもっています。

VRChatのアバターに連打で何度も音が鳴るギミックを入れたい!

VRChatのアバターに連打しても音を鳴らせるギミックを入れたくて、アニメーションをいい感じに組んだよという話です。

色々な人に教えてもらってうまくいったので、その知見を共有します。

どんなギミック?

アクセサリーに触ると音が出るギミックで、触るたびに音を鳴らすことが出来ます

…と説明するよりも見てもらったほうが早いかもですね、動画を貼りました。

youtu.be

作り方

流れとしてはこんな感じです。そんなにやることは多くないですね。

  1. アクセサリーに VRCContactSender を入れる
  2. AudioSource を追加する
  3. AudioSource のアクティブ状態を切り替えるアニメーションを用意する
  4. Animator を組む

ここではContactsやアニメーションについては詳しく書かないので、他のドキュメントを読んでみてください。

1. アクセサリーに VRCContactSender を入れる

触ったときにパラメータを変更したいのでVRCContactSenderを入れます。

詳しい説明は割愛しますが、当たり判定の範囲調整と、手もしくは指が触れたときに GBC Contact というパラメータが変化するようにしています。

Receiver Type は On Enter にしておくことで、触られたときに1フレームだけパラメータが変化するようにします。

VRCContactReceiverの設定

2. AudioSourceを追加する

VRChatのアバターではスクリプトを使えないので、AudioSourceの「Play On Awake」をオンにしておきましょう。

これで、AudioSourceがActiveになったときに音が鳴るようになります。

Audio Souceの設定

3. AudioSource のアクティブ状態を切り替えるアニメーションを用意する

タイトルのとおりですが、Activeを切り替える対象はAudioSourceコンポーネントでもAudioSourceがついているGameObjectでもどちらでも問題ないです。

ここでのポイントですが、

  • 0フレーム目に AudioSource の Is Active をオフにする
  • 1フレーム目に AudioSource の Is Active をオンにする

というふうにすることで、アニメーションの再生開始時に必ず音が鳴るようになります。

アニメーションの0フレーム目

アニメーションの1フレーム目

ただ、これだけだとAudioSourceがオンのままになるので、あとからワールドにJoinするなどしてアバターが読み込まれたタイミングで音が流れてしまいます。

なので、音を鳴らし終わる秒数あたりでオフにしておきます。

今回は鳴らす音の長さが 0.824秒だったので、余裕を取って1秒でオフにするようにしました。

最終的にこのようになりました。

音を鳴らす用のアニメーション

4. Animatorを組む

Animatorを組む際に最低限必要なのは、次の3つです。

  • Sound On に先ほどつくったアニメーションを指定、Idle には何もアニメーションを指定しない
  • Any State から Sound On に遷移させる
  • Any State -> Sound On の Can Transition To Self をオンにする

Animatorの設定

AnyState -> Sound On の設定

おわり

GestureManager などで動作確認してみて問題なければアップロードして完成です!

Animator はやり方がたくさんあってなかなか難しいですね…

このやり方は、おそらくパフォーマンス的にも問題がないと思いますが、他にいい方法があるよという人はぜひ教えてください。

ブログ始めます

あけましておめでとうございます。

去年はVRChatばかりやっていた気がしますが、技術系の集会に参加するようになったり、色々変化のあった1年でした。 今年もいいVR生活を送れたらと思っています。 そして、去年お世話になった方々は本当にありがとうございました。

さて、新年は新しいことをするいい機会だと思うので、ブログを始めます。 最近文章を書くことが少なかったし、いろいろアウトプットしたいなということで始めようと思いました。 とりあえずは続けることが目標なので、頑張ります。

それでは、今年もよろしくお願いいたします。