2A03使用FC音源『NESizer2』の偽物を作った
作るきっかけ
2019年のある日,以下の動画を見つけました.
ファミコンのメインCPUであるRP2A03に直接マイコンから命令を送って自由自在に音を出すようにするという工作で,当時chiptuneにはまっていた私は「ぜひ再現したい!」と思いました.このプロジェクト自体は回路図やソースコードがGitHubにアップロードされており,こちらに従えば簡単(?)に作ることができます.せっかくなので何かアレンジをしたいと思っていたので,元ネタがAVRを使っているならとPICで同じものを作ってみようと思いました.
しかし,当時はPICを触り始めたばかりで知識も経験も無く,アセンブラ?割り込み?という状態でした.結局その時はCPUに命令を送ることさえできずお蔵入りとなりました.
それから4年,ふとこの工作を思い出し,酸いも甘いも経験してきた今ならできるのではないかと再チャレンジを思い立ちました.
余談:当時は知らなかったのですが,2A03をMIDI音源にするというのは星の数ほど擦られてきた題材だそうで,CPUに命令を送り込む方法が製作者によって設計思想の違いがあり,先行例を調べていて面白かったです.国内だと「ふぁみみみっでぃ」がキットを販売していることで有名だそうです.そういえばコミケで見たことがあるような.
製作過程
ハードウェア編
まずはCPU本体を入手する必要があります.動作不明のジャンクファミコン本体をヤフオクで落札し,はんだを吸い取ってCPUを抜き取りました.
MCUにはPIC16F887を使用しました.何でも屋という安心感があると個人的に思っているマイコンです.
回路自体は上述のGitHub記載の回路図を参考にし,今回は使わないRAM部分を除いた構成としました.また,音が出ているチャンネルがわかるほうが演奏している感が出て楽しいと思ったので,チャンネルの数だけLEDを用意してそのチャンネルが音を出している間だけ点灯するようにGPIOで制御しました.
ソフトウェア編
システム全体の動き
この装置は一種のMIDI音源として動作します.パソコンやMIDI機器とMIDIケーブルで接続し,MIDI信号をUART機能で監視しつつ,信号を受信したらそれを解析,チャンネルと音階を取得して対応する音を鳴らすように2A03に命令を送ります.
2A03へ命令を送る基本的な動作としては,2A03が何らかの命令を実行し終わって同期信号を送る→これをPICで検知して(音を出すといった)次の命令をデータバスに送り込む→2A03が次の命令をフェッチして音を出す というのを繰り返しています.同期を検知して命令を書くところは余計な処理を挟みたくないため,アセンブラで書かれています(ほかはC言語です).
PICへのリファクタリング
AVRからPICにリファクタリングするにあたり,マイコンと2A03の同期を取って命令を送り込むアセンブラコード(2a03.s)を一から書き直すことになりました.
書き直すことになって初めて意識したのですが,AVRは一つの命令を実行するのに最小で1クロック使うのに対して,PICは一命令に最小でも4クロック使うことがわかりました.この仕様は2A03との同期を取るにあたって障壁となり,その結果「運が良ければ同期がとれるし,PICが4クロック使って次の命令を読むまでに2A03の同期信号が途切れることもある」という仕様となってしまいました(結局治せず).同期を取るような工作には必要クロック数が最小限のAVRが向いているのだなあと学習することができました.
音色とタイマー
2A03が出力できる音は 矩形波×2,三角波,ノイズ,DPCMの5つがあります.DPCM以外の4つは音量や周波数をマイコンからの命令で指示すれば出すことができますが,DPCMはこれらと音の出し方が異なり,音声のデジタルデータをサンプリング周波数で送る必要があります.つまり,マイコン側でサンプリング周波数ごとに割り込みをかけて,大容量のROMから音声データを取得するとともにそのデータを2A03に送り込む必要があります.今回は手持ちのケースに収まるようにしたかったので,大きなパラレルEEPROMは置かないことにしました.DPCMは使わず,1台あたり4チャンネルの音源となります.
音色のエンベロープ(特にAttackとDecay)を再現するのにタイマー機能を使いました.音色をオンする命令が出た時のタイマーの値を記録して,一定時間経過ごとに音量を変化させるように命令を送ります.とはいっても下の実演ではあまり効果が表れていませんが.エンベロープを実装するとシンセサイザーって感じがして楽しいですね.
以上をブレッドボードに実装し,プログラムを書きました.その結果,DPCMの操作はできないものの一通りの音を出すことができました.よって基板に起こしてちゃんとした形にする段階に移りました.
組み立て
回路図をKiCadで基板に起こし,JLCPCBに注文して基板を作成しました.一週間で基板が届き,部品を実装して信号を送ってみます.無事に音が鳴って一安心です.
タカチのYM-150に収まるように,主電源スイッチや出力用のイヤホンジャック,MIDI受信/中継用のDINコネクタ,DCジャックと音量調整用のVRを取り付けて1台目が完成しました.
部品に余裕があったので,同じようにもう一台分実装して合計8チャンネル分の演奏装置にしようと思い立ちました.2号機のほうにはオペアンプを使った簡単な加算回路をユニバーサル基板に追加して,1台目の出力と合わせることにしました.1号機にはMIDI Throughのコネクタをつけました.これを経由して2号機にMIDI信号が渡されます.
音量調整に可変抵抗を入れてみましたが,LEDまわりの配線が大変だったのと思ったより見栄えが悪かったので2号機では無くしました.
実演
8チャンネル使用する音源を探していたところ,Ievan Polkkaに辿り着きました.電子工作のルーツであるニコニコ技術部の血がまだ流れている.
Dominoで曲を打ち込み,midファイルを出力してMidiTrailで読み込みます.USB⇔MIDIの変換が必要となりますが,中華製のケーブルは信用ならないので以下の記事を参考にProMicroで変換プログラムを実装しました. wave.hatenablog.com
おわりに
元ネタと比べて明らかに劣っているものの,当初の目標であったMIDI音源のようなものを勉強しながら4年越しで作成でき達成感はひとしおです.せっかくケースに入れたので時々引っ張り出して演奏させたいものです.
最後に,2A03の挙動に関しては以下のWikiに一挙手一投足記されています(特に,NES reference guide→APU を一番参照しました).音を出す以外にもあらゆる命令が記されているのでご興味がありましたらぜひご覧ください.
再掲ですが,回路図とプログラムの一部は以下で公開されているものを参考にしました.
『1mmから始めるHFリニアアンプ』のページ
オンライン販売について
Boothにて電子版を500円で販売しております。ご興味がありましたら、ぜひご覧ください。
2023年8月12-13日に東京ビッグサイトにて開催されたコミックマーケット102 にてリニアアンプの製作記を頒布しました。持ち込みは30部でしたが断続的に捌け、15:30に完売となりました。暑い中ご来場いただき、誠にありがとうございました。
頒布以前から「参加できないのでオンラインで販売してほしい」との声をいただいていましたので、上記リンクにて電子版(PDF)を販売しております。
訂正表について
本書はプロのRF設計者が執筆したものではありません。当然説明が不十分な箇所や誤った記述があるものと思っております。連絡をいただき、明らかに訂正の必要がある箇所を下記の訂正表にまとめていますので、ご参照ください。
本文ページ番号 | 誤 | 正 | 補足 |
---|---|---|---|
3 コラム | アメリカの半導体企業である | アメリカの半導体企業であった | モトローラの半導体部門はfreescale semiconductor社を経て現在はNXPに吸収 |
11 右側 | C5/C7 | 電源からNFBとトランスを通ってここまでDC的に48Vが来るので,ここで接地すると短絡になってしまう |
電気系の国家資格の紹介
この記事はeeic (東京大学工学部電気電子・電子情報工学科) Advent Calendar 2022の5日目の記事です.
はじめに
せっかく電気系に進んで授業等で電気の知識を知ったのであれば,その知識を定期試験以外に役立ててみるというのはいかがでしょうか?
基本情報技術者試験や応用情報技術者試験といった情報系の資格は少なからず知られていますが,よりハードウェアに近い電気系の資格というのは比較的知名度が低いように思います.本記事では,筆者の独断と偏見による「電気系っぽい」国家資格を紹介します.
続きを読む1mmから始めるRFリニアアンプ(WEB版)
改訂版販売のお知らせ
本記事に補足を加えた完全版を電子書籍にて販売中です。ご興味があればぜひご覧ください。
※ この記事はハムフェア2022で頒布した記事を加筆修正したものです.今後も新たな知識の蓄積のために更新されるかもしれません.
はじめに
アマチュア無線において,リニアアンプは大きな出力を得るのに必要不可欠な装置です.コンテスト等で幅広い局と交信するためには,出力を上げることは重要です.
リニアアンプは市販品がありますが,自作することも可能です.しかし,参考書やインターネット上の記事を読んでみると,専門用語や暗黙のルールが多用されており,初心者にとっての敷居が高いように思えました.この記事は,リニアアンプを作ってみたい!と思い立った方がこういったインターネット上の記事をわかりやすく読み進められるようになることを目指して作ったものとなります.
本記事では,まずリニアアンプで用いられる増幅回路を説明したあと,実際に小型のリニアアンプの試作を通じて回路や各素子の仕組みを紹介していきます.
余談: ハムフェアで頒布していた時,「なぜ1mmなんですか?」という質問がありました.知識が無いことを「1mmも知らない」と言うことがある*1だけで,波長とかそういう深い意味はありません.多少の電気の知識は必要なので「ゼロから」は使っていません...
*1:e.g. ミリしらシリーズ
インクジェットプリンターで動画を再生する with STM32
作るきっかけ
2021年のある日,10年物のインクジェットプリンターが壊れました.何をしても紙を吸い上げてくれません.寿命であるのは明らかなのでこれ自体は仕方ないと思っていましたが,部品が大量にあるこの機械をすぐに捨てるのはなんか勿体ないよなぁという感じでした.
その時,正月ごろにマジョカアイリスハックなる解析が行われていたことを思い出しました. github.com (詳細は割愛しますが,正体不明のLCDの信号を解析して汎用の液晶として使えるようにするという試みでした.)
このプリンターにはLCDが搭載されていたので,同じように解析して使えるようにすると面白いのではと考えました.一方で,大きなプリンターのうち操作パネルの液晶部分だけでなく本体も何か工夫したいと考えており,映像には音声が付き物なので,あの左右に移動するヘッドを音声の周波数で振動させれば音が出るのではという発想に至りました.そういうわけで,ピンアサインも全く分からない状態からの無意味な試みが始まりました.
これ使えそう👀 pic.twitter.com/bZ1HKOyGso
— 刷木 (@JJ1IBY) September 13, 2021
続きを読む
リトヴャク中尉の魔導針を再現したい
この記事は eeic (東京大学工学部電気電子・電子情報工学科) Advent Calendar 2021 の17日目の記事です.参加者減りすぎやろ…*1
RF関係をやっています.情報系の記事ではないです.
ストライクウィッチーズという作品があります.魔力が存在する世界の20世紀初頭を舞台に,異形から人類を守る,ミリタリー系のメディアミックス企画の一つです.
その中でも,根強い人気を持っている*2のがサーニャ・V・リトヴャク中尉です.オラーシャ帝国*3陸軍出身で,主要キャラクターの中では比較的大人しめな性格で描かれています*4.舞台となる世界には魔力が存在し,登場人物は魔法を使って戦うことになるのですが,彼女が持つ固有能力は「魔導針を使った全方位広域探査」です.能力を発動する時には頭部にアンテナ様の魔導針が発現し,電波を送受信することで周囲の状況をレーダー的に把握することができます.さらにこの能力を使い,夜間哨戒中には世界中の同じ能力を持つ者と電波で交信しているという設定です.
頭上の小さなアンテナで広範囲を索敵し,さらに世界中と交信できる…もしこの能力を現実世界に再現するとなると,どのような機材が必要となるのか….無線工学の知識を使って検証を行おうと思います.
注:この記事の目的はあくまで「魔力が存在する別世界の物理現象を現実世界で再現するとなるとどうなるのか考えてみた」に過ぎず,これ以上の意図はありません.
続きを読む