もっと今更、SC-88ProにS/PDIFを付けよう

Dependencies:   mbed

You are viewing an older revision! See the latest version

説明

もっと今更、SC-88ProにS/PDIFを付けよう

/media/uploads/peu605/frontview.jpg

 ある日倉庫を掃除していると、古い5インチフロッピィが出てきた。NIFTY serveからダウンロードしたファイルを保存したものだった。その中に10個ほど、FMIDIからダウンロードしたとても懐かしいデータがあった。ところが、MIDIインターフェースもないし、SC-88とSC-55は処分したばかり。もともと聴き専であったが、何とかして再び演奏させてみたいものである。

 ヤフオクで探すとSC-88proは5漱石くらいから落札できるようだ。ぉッチしながら88proのことを調べていると、デジタル出力改造している方がいらっしゃる。それも前世期から、というか、自分が周回遅れなだけか。古くはToshiba TC9231、近年はTI DIT4192を使用するようだが、いずれも88proネイティブの18bitデータの扱いは工夫が必要らしい。おもしろそうだ。データシート集めたり、部品探したり、イメージが膨らむ膨らむ。もはやMIDIデータを懐かしむよりもデジタル出力改造に目的が転換してしまった。

 今からやるなら、

  1. TI DIT4192をハードウェアモード、LRCK遅延で24ビットに
  2. ハードウェアモードで18bitをサポートしているAsahi KASEI AK4103Aで
  3. DIT4192をソフトウェアモード、マイコンで動作モード設定し18ビットで

 1に関しては2個ほどロジックICが必要であるし、先達と同じことをするのは面白くないので後回し。まずは2をチャレンジすることにした。AK4103Aは秋月や共立などでは販売していない。Digikeyにはもちろんあるのだが送料がネック。ところが、MISUMI-VONAで取り扱いがあることが分かった。電子部品を扱っているなんて全く知らなかった。

 さて届いたAK4103をSynchronousモード(ハードウェアコントロール)で秋月の変換基板上に組んでみたのだが、音が出ないことがある。しかも5回に4回ぐらい orz 素人なりに色々試したが、88proとの相性の問題と判断し使用を断念した。

 次はDIT4192である。これはRS componentsから入手した。Amazonにオーダーした中華Arduino Nanoが届くまでに回路とソフトをくみ上げ、これもまた秋月の変換基板を利用して組み上げた。DIT4192は安定して動作した。予備のDIT4192が一つ余った。中華Nanoひとつは、実験中にみなさまと同じくやっぱり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に繋いだが…

 エウレーカ!

  • さすがにArduino(ATMega328P)じゃ無理そうだが、#エェェェェンベッド! ならいける?
  • 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としてコンパイルできるらしい。

 さらにボンビーらしくていいじゃないか。やってみるべ。

 中華Blue PillだしMBEDじゃないけど、開発はBlue Pillの到着を待つ間にNucleo F411RE エェェェェンベッド! で行った。STMさん、MBEDさん、乙。

peu605, 2017/09/01


Nucleoはプロトタイピング、blue pillのプログラマーとして活躍。リセット信号をつなげるとほぼNucleoと同じ感覚で開発できる。 /media/uploads/peu605/withnucleo3.jpg

SPDIF出力 /media/uploads/peu605/spdifout.jpg

筐体に収めるためBlue pillのジャンパは外した。青ワイヤばっかりなのはBlue Pillだから。(ウソ、赤ワイヤが無くなった) /media/uploads/peu605/wiring.jpg

光コネクタへの配線はここから通した /media/uploads/peu605/cableout.jpg

リアパネルにタカチ電機工業 SW型 プラスチックケース 黒, 40 x 30 x 20mm を筐体のビス2本で固定。光コネクタは横向きに /media/uploads/peu605/rearpanel.jpg

STMF32F103 割り込み処理部分の負荷率(割り込みのlatency除く) 18.4% at 72MHz。これくらいなら大丈夫かな。 /media/uploads/peu605/load.jpg

信号引き出しはここから。カスタムICの出力が直接つながっているビアに。一応100 ohmかませている。当初はCN5からとっていた。CN5から取ったほうが安全である。この秋月のガラエポ基板は切りやすくていいわー /media/uploads/peu605/viapoint.jpg

祭りの後… 左上:DIT4192 + 中華Nano 左下:DIT4192 + 328P QFP 右上:AK4103Aハードウェアモード 右下:ソフトSPIDF blue pill /media/uploads/peu605/fourdits.jpg


免責と情報

※ SPIとLRCKとの同期はリセット後最初に1回合わせるだけです。その後SPIは動きっぱなしで、SPIからDMAで更新され続ける受信バッファからデータを拾っています。汎用SPIを利用する都合上、LRCKと取り込みタイミングをシンクロさせることができません。数時間聴いていても大丈夫そうですが、ヘッドホンからばりばりぴーぎゃー聴こえて耳を傷めたりしてもご勘弁。

※改造に伴う関連機器の故障やご自身の負傷に関して一切の責任を負いません。

※SC-88proのソフト・基板バージョン違いによりうまく動作しないかもしれません。

※うちのSC-88pro (DTM-88PW)は、実験して分かったことですが、右詰めで20bit分送信しているようです。LRCK切り替わりから降順に127、126、… LSBを0番目ビットとすると、bit[127:20]→前フレームのLSB 0/1状態を維持、bit[19:0]→20bitの2's complementのデータ(実データは18bitです)のようでした。

nクロックLRCK遅延でビット桁合わせした場合、

  • LSBが0の場合、M===========L000000
  • LSBが1の場合、M===========L111111

のように、追加されるビットがn個の0の場合とn個の1の場合がありそうです。

LRCK H->L、Left Ch取り込みのタイミング。20 bit分出力がある(パーシスタンス表示) /media/uploads/peu605/persistent.jpg

LSBが0の場合、LRCK切り替わり後も次のデータまで0のまま /media/uploads/peu605/lsb_l.jpg

LSBが1の場合、同じく1のまま /media/uploads/peu605/lsb_h2.jpg


All wikipages