デモ動画
概要
個人でも参加できるASIC開発プロジェクトである”TinyTapeout”の紹介記事「TinyTapeoutでオレオレICを作ろう」の中でも触れている、TinyTapeoutの第5回の試作に私が応募した音源ICです。黄色いボードの真ん中に載っているチップが実際に私の設計した回路が載っているASICになります。
実装
音源IC部
この音源ICの実装については「TinyTapeoutでオレオレICを作ろう」にも詳細を書いたのでそちらも併せてご覧ください。仕様は以下の通りです。
- 同時4和音発音可能
- 発音波形は各チャンネルごとに以下から選択可能
- 矩形波
- Duty比12.5%
- Duty比25%
- Duty比50%
- 波形メモリ
- 4-bit x 32wordの波形
- 4-bit x 16wordの波形(32wordの前半/後半2種から選択)
- 4-bit x 32wordをシャッフルした波形
- ホワイトノイズ
- 矩形波
- 音量は矩形波/ホワイトノイズは256段階、波形メモリは8段階設定
- SPIで外部から制御
- 出力はI2S 16bitモノラル(上記デモ動画では市販のTI社製PCM5100A評価ボードを接続しています)
実際のソースコードなどはTinyTapeoutに応募する際に使用したリポジトリを参照してください。
コントローラー部
TinyTapeoutの試作チップはプロジェクトの運営チームが設計したベースボードと、その上に載せる試作チップ搭載済のキャリアボードのセットとして送られてきます。
ベースボード側にはRP2040マイコンが搭載されていています。RP2040のGPIOはキャリアボード上の試作チップに接続されていて、RP2040から試作チップを制御することができるようになっています。
出荷状態のRP2040にはMicroPythonが書き込まれていて、シリアルコンソール経由で試作チップの簡単なテストができるようになっています。ただ、今回は試作チップ内の音源ICをRP2040側から細かく制御したかったので、簡単なテストが終わった後はRP2040のC/C++ SDKを使って専用のファームウェアを書きました。以下のような機能をこのファームウェアに実装しました。
- 試作チップ用のクロック信号の生成(PWMを使用)
- 試作チップ内の回路選択信号の生成
- SPI経由での音源ICの制御
- プログラム内の配列で指定したシーケンスに従った音の再生
- 波形の設定
シーケンスに従った音の再生は、最初からプログラム内の配列をべた書きしてもいいのですが、なかなか面倒なのでかなりやっつけですがMIDIファイルからの変換プログラムを書きました。この変換プログラムではMIDIファイルの特定のトラックを決め打ちで音源ICの各チャンネルに割り当て(つまり各トラックはそれぞれ同時に1音のみ再生可)、MIDIファイル内の音程情報を音源ICのレジスタ設定値に変換するとともに、音符・休符の長さに相当する待ち時間情報もRP2040でハンドルしやすい形に変換(といいつつこちらはほぼそのままなんですが)しています。
RP2040側ではトラックごとに生成された配列をタイマー割込みを基準にして定期的に読み出し、所定の待ち時間の生成と音程情報を音源ICのレジスタに設定する処理を行っています。なお、こちらのRP2040用のファームウェアもGitHubにて公開しています。実際のチップを持っている人が世界で200人くらいしかいないはずなので、どこまで役に立つかは謎ですが…