目次
開発経緯
4カ月ほど前にヤフオクでRoland TR-505を手に入れました。
入手した個体はプラスチックの焼けが無い美品だったものの、電池ボックス端子の錆びやボリュームのガリがありました。サービスマニュアルを探して修理しようとネットで検索していたところ、音源ROMの交換や基板の改造ができる事を知りました。
特に、音源ROMに関しては生のPCMがそのまま書かれているため改造が比較的容易で、大容量のROMに交換してトグルスイッチでアドレスを切り替えることでバンクを切り替えるタイプのものが主流のようです。
電子工作ができる自分としては、オリジナルの回路を設計して作ってみたいというノリでプロジェクトをスタートさせました。
電子工作ができる自分としては、オリジナルの回路を設計して作ってみたいというノリでプロジェクトをスタートさせました。
機能の検討
他のプロダクトと差別化するために考えた3つの機能を構想順に紹介します。
ROMバンクは拡張側4バンクとオリジナルROMの計5バンク仕様
既存のプロダクトではオリジナルROMを取り去って4倍のサイズのフラッシュROMなどに置き換えるものが主流です。
TR-505の本来の音を残す場合は追加できるバンクは3つになってしまいますが、可能であればオリジナルROMを残して4バンクを追加したいところが率直な意見です。
ちなみに8倍以上のフラッシュROMはDIPパッケージの製品が極めて少ない事と、電源電圧が3.3Vのタイプしか流通していないので実現が困難でした。
バンク切り替えは押しボタンスイッチ1個だけで操作する
4バンクであればトグルスイッチ2個でアドレスを切り替えられますが、5バンクになるとスイッチが3個必要になります。
そもそも私は格好の悪いトグルスイッチは嫌いです。
本体から不恰好に突き出ていて収納する場合にも邪魔になりますので、スマートな押しボタンスイッチでなんとか実現できないかと考えた結果、スイッチの状態を管理するためのCPUとして8ピンのPICを搭載することになりました。
MIDIで音源を切り替えしたい
MIDIを使ってバンク切り替えができると便利です。
TR-505の回路図を見ると、MIDI入力のフォトカプラから信号を取り出せば、既存のMIDI INコネクタを共有できることが分かりました。
せっかくCPUを追加するのであれば、これを使わない手は無いでしょう。
回路構成
既存のROMと並列に拡張ROMを設置し、PICを使ってそれぞれの/CEおよびアドレスラインを切り替えています。
拡張ROM側の/CE_EXTはFETを使ったNOT回路を通して簡易的に生成しています。
初期はトランジスタを使ったNOT回路を使っていたのですが信号の切り替えが遅く、/CEの切り替えエッジで両方のROMが同時にONまたはOFFになるタイミングが生じたためFETに変更しました。
スイッチ入力はシュミットトリガになった割り込みピンにつないでいる以外、ハードウエア的なチャタリング対策をしていません。 PIC内部のタイマーで長めのタイマーを使ってチャタリングを回避させています。
PIC12F683はハードウエアUSARTを持っていませんので、ソフト的に処理する必要があります。スタートビットのエッジ検出にINTピン割り込みを使いたいところですが、スイッチ入力に使ったため、TTLタイプのポート変化割り込みで対応します。 ノイズが多そうなスイッチ入力はSTタイプ、フォトカプラ経由でノイズが少なそうなMIDI INはTTLタイプという棲み分けです。
スイッチ入力はシュミットトリガになった割り込みピンにつないでいる以外、ハードウエア的なチャタリング対策をしていません。 PIC内部のタイマーで長めのタイマーを使ってチャタリングを回避させています。
PIC12F683はハードウエアUSARTを持っていませんので、ソフト的に処理する必要があります。スタートビットのエッジ検出にINTピン割り込みを使いたいところですが、スイッチ入力に使ったため、TTLタイプのポート変化割り込みで対応します。 ノイズが多そうなスイッチ入力はSTタイプ、フォトカプラ経由でノイズが少なそうなMIDI INはTTLタイプという棲み分けです。
基板を作る
基板の設計はEagleを使いました。基板サイズは90×64mmで最小パターン幅は16milです。
プロトタイプで作成した両面基板はスルーホールのビアが作れないため、貫通接続させたいピンの横にビア専用のランドを設けてあります。
TR-505に使用されているマスクROM TC531000P-7453はJEDEC仕様のピン配置ではありません。 海外のデータシート系のサイトでダウンロードできるPDFはJEDEC仕様に近いピン配置となっていますが、実機のROMはこれらとは全く異なるため注意が必要です。
TR-505に使用されているマスクROM TC531000P-7453はJEDEC仕様のピン配置ではありません。 海外のデータシート系のサイトでダウンロードできるPDFはJEDEC仕様に近いピン配置となっていますが、実機のROMはこれらとは全く異なるため注意が必要です。
基板の中央には10mmの穴が開いています。 これはTR-505の内部にあるヘコミ防止用のプラスチックの支柱を回避するもので、これが無いとTR-505のプラスチックカバーをカットしなければなりません。
ファームウエアを作る
ファームウエアはいつもと同じようにアセンブラで書いてます。
PICのファームウエアは大まかなブロックとして、ソフトウエアUSART、スイッチ入力監視、MIDIイベント認識とそれぞれのモードでのバンク切り替えに分かれています。 完全に独立したプログラムではないですが、各ブロックごとに解説します。
PICのファームウエアは大まかなブロックとして、ソフトウエアUSART、スイッチ入力監視、MIDIイベント認識とそれぞれのモードでのバンク切り替えに分かれています。 完全に独立したプログラムではないですが、各ブロックごとに解説します。
ソフトウエアUSARTの実装
PIC12F683は前述のとおりハードウエアUSARTを持っていませんので、ソフトウエアで実装しなければいけません。
以下は割り込みを使ったソフトウエアUSARTの模式図です。
スタートビットの検出はGPIO割り込みを使って行います。 割り込み発生後、立ち上がりで割り込みがかかった場合は無視し、立ち下げだった場合はサンプリングオフセットを加えて64クロック周期のTimer2を起動、GPIO割り込みを禁止します。 64クロック周期でTimer2割り込みがかかるので、各ビットごとの値を読み込みます。最後の7ビット目でMIDI FIFOへバイト転送を行いTimer2を停止、GPIO割り込みを起動してスタートビットの監視に戻ります。
ストップビットの取り込み(フレーミングエラーの検出)は行っていません。 理由は、FIFOへの転送、割り込みの停止・開始を次のスタートビットまでの時間内(=46クロック)に完了できないからです。 それに、フレーミングエラーの対処をしたところでバイトの欠落はすでに起こってしまっているので、どうあがいても正常な演奏を回復できないからです。 過去にMidiTalkやDrumstarを製作しましたが、フレーミングエラーの対処はしていませんでした。
スタートビットの検出はGPIO割り込みを使って行います。 割り込み発生後、立ち上がりで割り込みがかかった場合は無視し、立ち下げだった場合はサンプリングオフセットを加えて64クロック周期のTimer2を起動、GPIO割り込みを禁止します。 64クロック周期でTimer2割り込みがかかるので、各ビットごとの値を読み込みます。最後の7ビット目でMIDI FIFOへバイト転送を行いTimer2を停止、GPIO割り込みを起動してスタートビットの監視に戻ります。
ストップビットの取り込み(フレーミングエラーの検出)は行っていません。 理由は、FIFOへの転送、割り込みの停止・開始を次のスタートビットまでの時間内(=46クロック)に完了できないからです。 それに、フレーミングエラーの対処をしたところでバイトの欠落はすでに起こってしまっているので、どうあがいても正常な演奏を回復できないからです。 過去にMidiTalkやDrumstarを製作しましたが、フレーミングエラーの対処はしていませんでした。
スイッチ入力監視
スイッチ入力はINTピンによる立ち下げ割り込みを使います。
割り込みルーチン内ではスイッチが押されたことを示すフラグを立ち上げ、INTピンの割り込みを禁止する処理しか行っていません。
通常のループ処理に戻ったところでバンク切り替えを実行します。
理由は、スイッチ入力の割り込み中にMIDIのスタートビットを受信した場合、GPIO割り込みがかかるタイミングがずれてビットの同期が取れなくなるからです。
INT割り込みの処理を短くすることで、GPIO割り込みの遅延を最大21クロックとして安全マージンを確保しています。
通常のループに戻ってスイッチが押されたフラグを検出すると、バンク切り替えを行うとともに0.131秒周期のTimer1を起動します。 Timer1は割り込みを発生し、バンク番号によって決められたLEDのパターン点滅を行うとともに、2度目の割り込み(0.262秒)が発生したタイミングでINTピンの割り込みを再開します。 これによって一定時間スイッチが無効になり、チャタリングを防止できる仕組みになっています。
最終的にLEDの点滅パターンが終了すると、Timer1割り込みルーチン内でTimer1が停止されます。
通常のループに戻ってスイッチが押されたフラグを検出すると、バンク切り替えを行うとともに0.131秒周期のTimer1を起動します。 Timer1は割り込みを発生し、バンク番号によって決められたLEDのパターン点滅を行うとともに、2度目の割り込み(0.262秒)が発生したタイミングでINTピンの割り込みを再開します。 これによって一定時間スイッチが無効になり、チャタリングを防止できる仕組みになっています。
最終的にLEDの点滅パターンが終了すると、Timer1割り込みルーチン内でTimer1が停止されます。
MIDIイベント認識
MIDIイベントの処理はMidiTalkで使用したコアプログラムがあるので、丸々流用することになります。
プログラムチェンジを利用したバンク切り替えのほか、システムエクスクルーシブで細かい動作を変更することが可能です。
TR-505への取り付け
TR-505の基板からMIDI信号を取り出します。
フォトカプラIC2の4番ピンにつながっている系統のパターンから取るのですが、HD6301の真上にある3本並んだジャンパの中央がMIDI信号です。
ここから信号を取り出し、近くにある穴から表面へハーネスをのばします。
TR-505の背面にはLED内蔵の押しボタンスイッチを取り付けます。
PHONESとDP-2の端子間に空きスペースがあるので中間に取り付けることにしました。
専用ROMライタの製作
さて、拡張ボードができたわけですが、フラッシュROMにデータを書き込まなければいけません。
最近はシリアルEEPROMが主流なようですが、パラレルの物は品数も少なく高価なうえに入手性が悪かったため、専用のROMライタを作る事にしました。
基本的にはJEDEC仕様のコマンドを送るのでどんなフラッシュROMにも対応できると思うのですが、今回使うSST39SF040にTR-505のデータを書き込む専用のROMライタとしての機能に絞ってみました。
画面の操作やデータのやり取りはTeraTermで行います。操作を簡単にするため、ROMアドレスは数値指定ではなくバンク番号や音色名で指定します。
ROMデータの生成には Roland TR-505 Sound ROM Creator を元に、音色単位の分割されたデータを作成できるようプログラムに手を加えた物を使用しました。
ROMデータの生成には Roland TR-505 Sound ROM Creator を元に、音色単位の分割されたデータを作成できるようプログラムに手を加えた物を使用しました。
使ってみて分かったこと
- プッシュスイッチにしてよかった。スマートで格好が良い。
- MIDIでバンクを切り替えられるのが思いのほか便利だ。 既存のMIDIデータを鳴らす時でも、シーケンサでプログラムチェンジを送れば一発で切り替えができて手軽である。
- 音色単位で書き換えられるROMライターも便利。1バンクあたりの転送速度は12秒と速く、気になる音があればすぐに書き換えられる。 アドレス計算も内部でやってくれて、至れり尽くせりって感じ。もう少し大きなサイズのROMが欲しいなぁ。
製作過程で苦労した点
- サウンドROMのピン配置がJEDEC仕様と違ったところ。 フラッシュROMライタの基板を作る直前にデータが読めない事が判明し、いろいろ調べているうちに標準配列ではない事が分かった。
- Roland TR-505 Sound ROM Creatorで生成されるROMイメージに問題があり、一部のサンプルにノイズが入っていたこと。 Webサイト経由で問い合わせをしたところ、問題を修正していただき助かった。LinnDrum, TR-808, TR-909, CR-78のROMイメージはそのとき提供したもの。
参考資料
- TR-505 SERVICE NOTES
- Microchip SST39SF040 データシート
- MBM29LV160 データシート 日本語で書かれたJEDECコマンド・データポーリングの資料として利用
- TC531000P データシート (JEDECピン配置版で実機では役に立たない)
- Roland TR-505 ROM Expansion - HKA Design
- Roland TR-505 Sound ROM Creator - R-MASSIVE
- TR-505 ROM - ZEN Instruments
ドキュメント類置き場
TREX / SSTWRITER関連の販売に使っているドキュメント、ソフト類のリンクはこちらです。
TREX ファイル置き場 - Google Drive
TREX ファイル置き場 - Google Drive