PIC16F1455でUSB-MIDIインタフェース

USBデバイスを手軽に作れるPICマイコンであるPIC16F145xが秋月から供給されるようになったので、以前は適当に作っていたMIDIインタフェースをまじめに作り直してみた。

IMG_7937

以前、CDCを使ったシリアルコンバータをつくっていたのだが、ここはやはりMIDIを作らねば始まらないだろうと言うことで、まずは回路図から。

usbmidi

とりあえず、教科書通りの回路図になる。PIC内蔵のシリアルを使ってMIDI IN/OUTを実現する。マイクロチップのライブラリでも動作確認用のLEDがあったので、これをRC2に設定し、エラー時に点灯するLEDを追加した。ライブラリではスイッチを使うルーチンがあったが、現時点では割り当てる機能がないので不要である。

注意点としては、ライブラリのソース中で指摘のあるバイパスコンデンサを指定以上の容量のものを使用することと、前回も指摘したICSPがRC0,1に変更になっている点くらいである。

マイクロチップのライブラリでは、SWを押すと音階を出力するだけのものなので、app_device_audio_midi.cの全面的な変更でシリアル入出力とMIDIメッセージの解析を組み込む。ソースファイルをどう直したかについては後日報告するとして、midi10.pdfというUSB-MIDIの仕様書を参考にしてUSB関連の処理を行って完成させたファームウエアがこれ。

usbmidi1455_100.hex(追記2016/7/17:PIC16F1454にもそのまま書き込んで使用できるらしい)

例によって拡張子がdocになっているのでhexにして書き込むと、お手製のUSB-MIDI I/Fが完成する。これをそのまま使って商売するようなことが無ければ自由にどうぞ!

ちなみに、MIDIの仕様にあるメッセージはすべてサポートしてあるはず。エクスクルーシブやSYS系の0xF0以上のメッセージもいろいろ試してあるので大丈夫だと思うが、お試しあれ。

以下はテクニカルな話なので、興味ある方はどうぞ!

これを作っていてdominoからMSGS用の各トラックの初期化が多すぎて詰まる事象が発生したが、よく考えてみるとMIDIは32.15kbpsなので1msあたり約3バイト、つまりMIDIメッセージ1個分になる。dominoの初期設定部分は1トラックあたり20イベントであるが、♩=60の分解能480で20ticks=約40ms分なので2トラック分はこの時間内に送信できるが、16トラック分となると320イベント分必要なので、40msで送信することは原理的に無理となる。ファームウエアではランニングステータスを利用して節約をしてはいるが、8倍ものイベントを処理できるほどは節約できないのでdominoの動きが詰まることになる。初期化部分のテンポを8分の1である♩=8にすると送信バッファのおかげで楽勝で送信できる。もしも、初期化部分で詰まったらお試しあれ。F1455のRAMでは送信バッファを大きく取れないので、これ以上は無理で、どちらにせよ、バッファを大きく取ったところでリズムの遅延が発生するため意味がない。これは他のMIDI I/Fでも同じで、バッファの大きな市販品ではdominoなどのシーケンサが詰まることはないが、原理的にそれだけのイベントを送信できないのでリズムがヨタることに変わりはないはず。

今回、PIC自体は48MHzで動作しており、MIDI IN/OUTの送受信割り込みもほぼ問題なく処理できているようだ。処理できなかった場合、ERROR用のLEDが点灯するようになっているが、かなり大きなデータを流しても点灯することはなかった。それよりも先述の送信速度の問題の方が大きいことになる。昔PC-8801の4MHzのZ80でMIDIデータを扱ったときにはかなり苦労した。それがPC-98の10MHzのV30ではC言語で記述できることでかなりうれしかった覚えがあるが、今のPICはMIDIメッセージ解析程度の処理ならそれの何倍もの処理能力があるので、開発はかなり楽になったもんだ。というのが実感。

シリアルの遅さをカバーするにはマルチMIDI OUTしかないが、F145xにはシリアルは1対しかないので、F1822あたりをI2CでスレーブにしてMIDI OUTを増やすこともできるのではないかと妄想しているところ。

いずれにせよ、いろいろできそうなチップなので、いろいろやる時間が欲しい。。。

 

    • Itoshin
    • 2016年 7月 7日

    似たものを18f14k50で作ってます。
    MLAやforumを見ても、PCへの送信がなかなかわからず苦労しました。
    1455だと内臓クロックで出来るし小さくていいですね。

    • そうなんですよね。私も14k50でやっていたのですが、145xは内蔵クロックなのがいいですね。外付け部品もコンデンサ2個くらいしか要らないので、ちょっとしたUSB機器を作るのにはもってこいです。

  1. 2016年 7月 14日

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。