歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Game Boy Advent Calendar】PythonプログラマーがGBでチップチューンを始めて変わったこと・驚いたこと

これはGame Boy Advent Calendar 2017の15日目の記事です。遅くなってしまいすみません。

クラウド環境(AWS)やスクリプト言語Python)を使うWEBプログラマーが、ゲームボーイというレトロな環境に触れて驚いたこと」をまとめた記事です。

私は仕事で、PythonRubyを主に使って、AWS/GCP上でのシステム開発やちょっとしたデータ分析を行っています。また、『抽象度の高いプログラミング』をするために、クラス設計や(使いこなしているとは言えませんが)Haskell等の関数型言語も勉強しています。

本当は、ファミコン(正確にはNES)でのチップチューンで有名なchibi-tech先生に「矩形波で人間の声を再現して歌わせる方法」について質問することができ、GBでどの程度再現できるのか実験しようと考えていたのですが、正直時間が足りずにできませんでした。機会があったらまとめておきます。

「なぜGBでチップチューンを始めようと思ったのか」については、以前書いた記事を読んでください。一言で説明すると「TORIENAさんの曲にいい感じにノイズ乗っててかっこよかったから」です。

sakana38.hatenablog.com

メルカリやヤフオクに抵抗が無くなった

私は大量生産・大量消費の経済社会に産まれ、Amazonで技術書を買って暮らしています。そのため、メル×リやヤフ×クなどは下賤の者が使うものだと思いこんでました。

ところが実機でチップチューンを始めるとすると、『ゲームボーイというハードを(中古で)買う』ほうが予算が抑えられる場合があります。特に、ハードがジャンク品として売られていることが多く、その場合には複数台のまとめ売りを買ってリスクを抑えるのは有効な戦略です。

メルカリも使ってみると意外に便利なのと、「案外値段が適当に決められていること」「届いてみるまで実際の状態は分からないこと」「『〇〇さん専売』みたいなオレオレルールを導入してくる奴がいること」などバザール的なやりとりが面白く、ちょっとしたギャンブル感もあって燃えます。 私は「裏に名前が書かれているカセット」を引き、「多分カーチャンが独立した息子のゲームボーイを処分したのだろう」と分かってエモい気持ちになりました。

一部のレトロゲーマーは「大量出品されたジャンクハードを買って修理すること自体が趣味になってしまう」「どこも壊れてないと逆に萎える」と聞きましたが、それも納得です。

私も「せっかくだから音楽の評価が高いファミコンゲームもやっておくか」と思ってファミコン7台セットを購入してしまいました。そして友達に「Motherめっちゃ面白いよ!」って話をしたら、「懐かしい!GBAの再録版でやったよ!」って話をされてジェネレーションギャップを感じました。

マザー

マザー

改造やはんだ付けに抵抗が無くなった

AWSというクラウド上開発することが多いので、ハードを見ることはほとんどありません。一度、インフラチームの先輩に連れられてデータセンターでブレードサーバの中身を交換しに行った程度です。

そのため、「既存のハードに手を加える」ことには抵抗があったのですが、実際の初代ゲームボーイにはバックライトが無く、時間帯によってはメルカリで買った時に付いてきたメトロイド2をプレイするLSDjで曲を作るのにも少し苦労しますし、暗いライブ会場で演奏することもできません。

これに対処するため、昨年のGame Boy Advent Calendar 2016のch3cooh393さんの記事などを参考にして改造しました。その過程で海外通販(Hand-Held Legend)を使ったことも新しい経験です。

blog.ch3cooh.jp

ただ、今から始める人には、GBA SPを勧めると思います。それは、デフォルトの状態でも音が太く、画面もカラーでバックライトも付いており、メモリも豊富で処理落ちしづらい(らしい)ので、すぐに音楽に集中できるでしょう。

手続き型プログラミングへの抵抗が無くなった

多くのPython言語のプログラマーは、Haskell等の抽象的な言語を学び、標準ライブラリのitertoolsをいかに美しく使えるかを競っています。さらにもう少しHaskellに慣れると、中二病で「副作用(I/O等)使用罪」「変数の破壊的変更は悪」などのHaskell共和国のお題目を唱え始めるようになります。

ただ、LSDjで表現したいものはI/O(=音を鳴らす)が本質的な世界です。実際LSDjに限らず、トラッカーソフトは「音符を配置したサブルーチンを並べる」し音色の操作にgoto文のようなコマンドを使うこともあります。

そもそも、ゲームボーイはメモリ資源が少ないハードなので、「サブルーチンを分けすぎるとスタック領域を使ってメモリの効率が悪い」「ガベージコレクションはメモリを使いすぎる」「クロック周波数を意識して命令数を抑える必要がある」など、Linuxサーバー上では意識しないレイヤーの話が出てきます。後から会社の先輩に聞いたのですが、現代でも組み込み領域だと割と意識されてることだそうです。

ファミコンの驚くべき発想力 ?限界を突破する技術に学べ? (PCポケットカルチャー)

ファミコンの驚くべき発想力 ?限界を突破する技術に学べ? (PCポケットカルチャー)

後から知ったのですが、そもそも関数型言語の最右翼であるHaskellでもIO a型を使う必要があり「可能な限り参照等価な関数とI/Oを伴う手続き型的な処理を分けよう(do記法で手続き型っぽく書くこともできます)」と主張しているだけだし、高速化のためにST s型として破壊的操作のできる配列などの変数を使うこともできます。

つまり、私が不勉強だっただけで、実際には「自分が表現したいものに適切な言語を選ぶことが大切」だということに気が付きました。

もっと低レイヤーの知識が身についたら、「処理落ちしやすいLSDjのコマンドを調べて、内部的な挙動を推測する(例えばサブルーチン呼び出しでメモリを食ってるんじゃないかとか)」みたいなことができたら面白そうです。

hyksln.jugem.jp

OSや高級言語への感謝が産まれる

LSDjを使っていると、すぐにセーブデータが壊れることに気づきます。特に「音楽を再生しっぱなしにして電源を落とすとぶっ壊れる」仕様のせいで、LSDjをいじっている間に寝落ちしてセーブデータが壊れ、悲しい気持ちになります。

そんなときに、Linux等のOSへの感謝が産まれるのでおすすめです。また、ハードごとの命令の違いをAPIとして抽象化して吸収してくれるとかヤバすぎます。

オペレーティングシステム (未来へつなぐ デジタルシリーズ 25)

オペレーティングシステム (未来へつなぐ デジタルシリーズ 25)

公式ドキュメント < 実地の経験

私は先輩からは「問題が起こったらまずは公式ドキュメントに立ち返れ」と教わっています。Qiita等の記事を見ても、同じように教わっている人が多く、プログラミングや開発では正しいと思います。

qiita.com

ただし、音楽になると話は別だと思います。もちろんLSDjの公式ドキュメントを見てコマンドの説明を読むことは大事ですが、「どのように使えばカッコイイ音になるのか」などは別に学ぶ必要があります。そして、それは上手くいってないです…。

それは元々「ゲームハードやホビーPCをハッキングして、本来とは違う使い方(音楽)をする」というコミュニティの発祥まで繋がるのかもしれません。

英語への抵抗が無くな…ってないw

Square Sounds Tokyo 2017というチップチューンにイベントを見てきて、お客さんの半分強が海外の方だったのでビックリしました。

誘ってもらったのですが、私は英語が苦手なので全然会話できない…と思ってたら、日本人の偉い(偉いって表現はアレかもしれないけど)人もかなりブロークンな英語(Your performance was cool!みたいな感じ)で喋ってて「あ、これでいいんだ」って思いました。ただ、持って生まれた性格がシャイなのでそもそも初対面での会話は苦手ですw

英語とは関係ありませんが、Chip Tanakaこと田中宏和さんの曲がすごい異世界でやばかったのを覚えています。

Django

Django

Q. ふ〜ん、で、チップチューンは作れるようになったの?

うるせえ!

やっぱり音楽自体が難しいのと、どのように作り始めたらいいか分からない→どうしても自分にとって分かりやすいファミコンとか技術とかに逃げちゃうので作れるようになってはないです。

生活スタイルはだいぶ変わりました。具体的には、過去の技術者やミュージシャンへの感謝と敬意(こんな難しいことやってるなんてすげえ!)が産まれたことと、ゲームボーイファミコン、分解用のドライバーが散乱して部屋が汚くなりましたw

「私はこういう風に作れるようになったよ」って話があったら教えてください。

最後に、Game Boy Advent Calendar 2017も引き続きご注目ください。