とらきす の ぐだログ

とらきすのぐだログ

ぐだぐだとなんかするブログ。

近況報告というかなんというか

最近ブログに全く触っていないなと思ったので。

というかTwitterもニコフレもここしばらくやってないですね。別に理由がある訳じゃないんですけど、私飽きっぽいので、そのうちきっと使い始めるようになるんじゃないでしょうか。

えー、今は学校の課題でArduino弄ってます。というか、この愚痴を喋りたかっただけかもしんない。
ともかく、Arduinoゲームボーイ音源を再現してみようかと模索していて、今はLR35902(実質Intel 8080)の命令セットを移植している最中です。

目指すはGBSファイルの再生。
プログラムの中で鳴らしても汎用性皆無で面白くないですし、かと言ってオリジナルのフォーマットを作るのは大変。作ったところで、結局はMIDIとかMMLとかからのコンバータも作らないと意味ないですもの。
GBSならそこそこ知名度ありますし、直接レジスタの値取り出せるならその方が楽ですしね。まぁ、GBSファイルをArduinoの中に置いていちいち読み出す訳にもいきませんので、配列にコンバートするソフトくらいは作りますけども。

でもGBSフォーマットって、あれ要するに「これ音鳴らすコードなんじゃねーか?」って部分をごっそり切り取ってるだけじゃないですか。つまり、万全を期するならば、全命令セットを実装しないといけないんですよね。
音源関係の\$FF00〜3F以外の操作は無視するにしても、どう転ぶかわかりませんし。まだきちんと理解できてないのですけど。

それに、結局はGBS入りのヘッダを置いておかなきゃならないので、Arduino Unoなんかではメモリが足りません。Dueだと動作電圧が3.3Vで鬱陶しいので、まぁ、Megaでしょうな。ポチりますか。

あと1週間でGBSファイルの再生まで漕ぎ着けなきゃなりません。まだ出音テストどころか、音源部も碌に実装できていないのに(!?)
ゲームボーイの音源仕様を理解するだけでやたら時間を食いました。

あ、オブジェクト指向は諦めました(笑)
ファイルサイズは別に良いんですけど、パフォーマンスがどうにも。関数呼び出すだけで数クロック持っていかれるとか言うじゃないですか、冗談じゃない。
グローバル変数置いとくのだけは嫌なので、とりあえず全部クラスで囲って静的メンバにします。
あーでも、それだとconstexpr関数が作れないですね。constexpr入りのクラスの作り方がよくわからんのですよ。

音声出力用の2ch汎用DAC、調整つまみ用の2連可変抵抗、イヤホンジャック、ローパスフィルタ用のコンデンサやらコイルやら。
そして何より、4.194304MHzクロックの水晶発振器! これはゲームボーイのCPUと同じクロック周波数です。
Arduinoに付いている水晶振動子は16MHzなのですが、この数値、個人的にはものすごい中途半端だと思うんですよ。2n、これが一番しっくりくる。ゲームボーイ処理の多くが2nHzに頼っているので、これは外せませんね。
ともかく、幾つかの入力クロックを外部クロックに設定すれば良い…のですよね? 多分。

とりあえず、Arduinoは…なんというか、微妙ですよね。

いや、何というか、わざわざC++で書くものではないでしょう。
浮動小数点数演算が遅いだのアレコレ言われておりますが、C++で書けるようにする為、本来はない機能をソフトウェア的に実装するしかなかったのでしょうね。
今でも生産され続け往年の名機ともいわれるZ80だって、浮動小数点数演算の命令なんて持っていませんよ。そもそもAVRはRISCベースなので、もともと多機能じゃないんですよ。

無理に高級言語を使おうとせずに、どうせならアセンブリだけで良かったんじゃないですかね。
C++にしたって、機能が制限されすぎです。マシンスペック的な問題もあるかとは思うのですけど、C++の真髄はSTLにこそあるじゃないですか。I/O系のとかそういうのじゃなしに、vectorとかタプルとか。動的がダメならせめてarrayくらい入れておいて欲しかった。

C#で書きたい〜(無理

C++でも、プロパティ実装してくれたら個人的にだいぶ評価上がるんですけどねぇ。
あとstrong alias。これは、C++17で実装されるんでしたっけ? きっとavr-gccには実装されないんだろうな…(遠い目)
Atmelが買収されちゃった訳ですし、avr-gccの更新有無も心配ですね。しばらく触る事はないだろうがな!

ともかく、ここ数日でC++は書き飽きたので、作り終わったら関数型言語の勉強でもしようかと思っています。

…んー、どの言語にしよう。
純粋関数言語ってなんか…格好いいですよね(単純)。でも、そうなると選択肢がHaskellに限定される。なんか有名すぎてイヤなんですよね、かじるくらいならいいですけど。
Haskellも結局はI/Oモナドで妥協してるんですから、純粋/非純粋の境界線はあまり気にしなくていいのかも。そもそも、私数学嫌いですし。

んじゃま、OCamlかな。
例のHaxeも、OCamlで書かれてるっていうじゃないですか。オブジェクト指向が書けるともいいますし、初心者の私にはちょうどいいでしょう。何より型推論があるのはありがたいですね。