Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
You are viewing an older revision! See the latest version
説明
もっと今更、SC-88ProにS/PDIFを付けよう¶
ある日倉庫を掃除していると、古い5インチフロッピィが出てきた。NIFTY serveからダウンロードしたファイルを保存したものだった。その中に10個ほど、FMIDIからダウンロードしたとても懐かしいデータがあった。ところが、MIDIインターフェースもないし、SC-88とSC-55は処分したばかり。もともと聴き専であったが、何とかして再び演奏させてみたいものである。
ヤフオクで探すとSC-88proは5漱石くらいから落札できるようだ。ぉッチしながら88proのことを調べていると、デジタル出力改造している方がいらっしゃる。それも前世期から。古くはToshiba TC9231、近年はTI DIT4192を使用するようだが、いずれも88proネイティブの18bitデータの扱いは工夫が必要らしい。大変興味深い。データシート集めたり、部品探したり、イメージが膨らむ膨らむ。もはやMIDIデータを懐かしむよりもデジタル出力改造に目的が転換してしまったのだ。
今からやるなら、
- TI DIT4192をハードウェアモード、シフトレジスタで24ビットに
- Asahi KASEI EMD AK4103Aはハードウェアモードで18bitをサポートしている
- DIT4192をソフトウェアモード、マイコンで動作モード設定
1に関しては2個ほどロジックICが必要であるし、先達と同じことをするのは面白くないので後回し。まずは2をチャレンジすることにした。AK4103Aは秋月や共立などでは販売していない。Digikeyにはもちろんあるのだが送料がネック。ところが、MISUMI-VONAで取り扱いがあることが分かった。電子部品を扱っているなんて全く知らなかった。
さて届いたAK4103をSynchronousモード(ハードウェアコントロール)で秋月の変換基板上に組んでみたのだが、音が出ないことがある。しかも5回に4回ぐらい orz 素人なりに色々試したが、88proとの相性の問題と判断し使用を断念した。
次はDIT4192である。これはRS componentsから入手した。Amazonにオーダーした中華Arduino Nanoが届くまでに回路とソフトをくみ上げ、これもまた秋月の変換基板を利用して組み上げた。DIT4192は安定して動作した。予備のDIT4192が一つ余ったので、みなさまと同じく、やっぱり+VとGNDをショートさせて壊してしまったのでそれからはがしたATmega328P 32-pin TQFPを再利用、ChaNさんのUEWを使った表面実装を初めてやってみた。老眼には厳しい作業だったが、これもうまく動いた。
今回のSC-88proのデジタル出力改造については「今更SC-88ProにS/PDIFを付けよう」 http://www7a.biglobe.ne.jp/~naopy/av.html を拝見したことがきっかけである。タイトルもここからパクら流用させていただいた。文体もとっても好みw 復習のつもりであらためてよーく読んでいたら、「出来る人は全てワンチップのマイコンでSPDIFに変換したり」と書いてある。できるかな?
やらないといけないことは、256fsのクロックで32kHz周期でシリアル送信されてくるデータを受信して、SPDIFのデータに変換して、出力する、を途切れなく繰り返すこと。シリアルデータはマイコンのSPIで送受信できそうな気がするが、正確さを必要とするSPDIFのクロックはどうしたらよいのか… DIT4192の場合、88proから引き出したBCLKをSCLKとMCLKに繋いだが…
エウレーカ!
- 88proに光出力を付ける場合も、88proから引き出したBCLKをSPDIFのクロックに利用すればいい。
- SPIはslave full-duplexモードにする。CPUクロックと関係なく、BLCKに同期して、MOSIから取り込みMISOから垂れ流す
- SPIの入力側は、1/2フレーム間に128 clkで送信されてくる。(18bit, right justified, MSB first)
- SPIの出力側は、1/2フレーム間に32bit送信すればいい。Biphase Mark Codeで必要ビットは2倍になり64bit。128clkで64bitを送信するためには、ソフトでデータを2倍に引き延ばせばいい
- SPIは受信・送信ともにDMAを利用する
- 受信側DMA転送(半)完了割り込みで、受信DMAバッファーを読む→SPDIFデータを構築→送信DMAバッファーにセットする
- SPIは 5Vトレラントピンを使えそう
- HALはなんかややこしくて敬遠していたが、最近、かつてのStandard Peripheral Libraryのような、Low Layer dirverというマイコンらしいAPIが出てた!
マイコン工作、mbedから長らく遠ざかっていたのだが(知らないうちにMBEDに変わってるし)、LPCが買えなかった貧乏人のmbed、Nucleoを引っ張り出してきた。白いから目立たないがほこりをかぶってるw ところがだ、Nucleoはデカい、88proに入らん。小さいNucleoを買おうかと思ったけれども、AmazonでSTM32F103の0.35漱石位のボードが売っていて、中国から送料無料で届くと。そしてFlash ROMは半量だがNucleo F103RBとしてコンパイルできるらしい。
さらにボンビーらしくていいじゃないか。やってみるべ。
中華bule pillだし全然MBEDじゃないけど、開発はNucleo F411REで行った。STMさん、MBEDさん、ありがとう。
2017/09/01
Quote:
※ SPIとLRCKとの同期はリセット後最初に1回合わせるだけです。仕組み上LRCKと読み込みタイミングを常時シンクロさせることができません。数時間聴いていても大丈夫そうですが、ヘッドホンからばりばりぴーぎゃー聴こえてきてもご勘弁。
※うちのSC-88pro (DTM-88PW)は、実験して分かったことですが、実データは18bitですが右詰めで20bit分送信しているようです。LRCK切り替わりから降順に127、126、… LSBを0番目ビットとすると、bit[127:20]→前フレームのLSB 0/1状態のまま変化せず、bit[19:0]→20bitの2's complementのデータのようでした。 nクロックLRCK遅延で出力ビット合わせした場合、
- LSBが0の場合、M===========L000000
- LSBが1の場合、M===========L111111
のように、追加されるビットがn個の0の場合とn個の1の場合がありそうです。
Nucleoはプロトタイピング、blue pillのプログラマーとして活躍。リセット信号もつなげるとほぼNucleoと同じ感覚で開発できる。
SPDIF出力
筐体に収めるためBlue pillのジャンパは外した。青ワイヤばっかりなのは赤ワイヤが無くなったから。
光コネクタへの配線はここから通した
リアパネルにタカチ電機工業 SW型 プラスチックケース 黒, 40 x 30 x 20mm を筐体のビス2本で固定。光コネクタは横向きに
STMF32F103 割り込み処理部分の負荷率(割り込みのlatency除く) 18.4% at 72MHz。これくらいなら大丈夫かな。
信号引き出しはここから。カスタムICの出力が直接つながっているビアに。一応100 ohmかませている。当初はCN5からとっていた。CN5から取ったほうが安全である。この秋月のガラエポ基板は切りやすくていいわー
祭りの後… 左上:DIT4192 + 中華Nano 左下:DIT4192 + 328P QFP 右上:AK4103Aハードウェアモード 右下:ソフトSPIDF blue pill