もっと今更、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をハードウェアモード、シフトレジスタで24ビットに
  2. Asahi KASEI EMD AK4103Aはハードウェアモードで18bitをサポートしている
  3. DIT4192をソフトウェアモード、マイコンで動作モード設定

 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に繋いだが…

 エウレーカ!

  • 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さん、乙。

peu605, 2017/09/01


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

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

筐体に収めるため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


_ peu605 wrote:

※ SPIとLRCKとの同期はリセット後最初に1回合わせるだけです。その後SPIは動きっぱなしで、128clk毎にデータを取り込んでいます。汎用SPIを利用する都合上、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の場合がありそうです。

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