編集履歴一覧に戻る
akira.keiのアイコン画像

akira.kei が 2026年02月08日16時30分59秒 に編集

初版

タイトルの変更

+

忘れられたUSB内蔵PIC16F1455をイマドキ使う(その4)

タグの変更

+

PIC

+

PIC16F1455

+

PIC16F1454

記事種類の変更

+

セットアップや使用方法

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

[<前の記事](https://elchika.com/article/e60bb515-4840-4585-b23d-a62f34586e60/) : 次の記事> ## 今回もニッチなPIC16F1454 なんかとち狂ってUSB-MIDI変換器でも作ってみようかなwとかやってみたらすごい大変だった。とりあえず動作させたオレ様素晴らしい。[手持ちで立派な製品](https://jp.yamaha.com/products/musical_instruments/pianos/accessories/interfaces/ux16/index.html)も持っているのに! ![YAMAHA UX16](https://camo.elchika.com/37a0348cf5c2f02c8a5510704cb509573532ec8b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f66396235616534392d646133342d346161612d393638332d373838626139376565363639/) 元にしたのはやっぱり[MLA](https://www.microchip.com/en-us/tools-resources/develop/libraries/microchip-libraries-for-applications)なんだが、これが例としては微妙すぎた。PC/macからMIDI インタフェースとして認識されるのは素晴らしいのだが、USB側からのMIDIパケットは無視、リセットボタンを普通のボタンとして使用し、押すと適当なNoteOnを出すというものだった。シリアル送受信とか自分で考えろってことなのか。いいのかそんなんで。[Arduinoなんてライブラリ一発](https://webmidiaudio.com/npage301.html)だぞ(そこそこ準備が必要だけどw)。 ## Copilotに振り回される PythonスクリプトなどはCopilotに書かせても一発で動いたりするが、学習が足りないのかPICはダメだ。例えば、「PIC16F1454のRX/TXはRB4/RB5だぞ間違えんな修正しろ」って自覚のない嘘を言ってくる。「データシート読んだのかボケぇ、そもそもPORTBすらないだろフザケンナ」とか言えば「よくわかってんなお前」とか上から目線でしれっと訂正しながらほめ殺しだ。おっかなくてそのままコピペなんて出来やしない。 ちょっと複雑な処理を「なんか動かないんで見てくれや」って聞くと「バッファ0にステータスを収納すんな、データだけにしろ、そうしないとバイト列がずれちゃうよん」とか一見まともな意見を出すんだが、やっぱり動かない。そう指摘すると「あなたのコードはここが間違ってる」って言ってくる。 間違ってんのはお前のコードだろ。 ## まずは周辺を整える Windowsからmacに乗り換えたので、ちょっと設定関連がわからないことが多い。昔から音楽とか映像ならmacだろとか言われてきた割には支援が薄い感じがするんだよな…(知らんだけかも) [GarageBand](https://apps.apple.com/jp/app/garageband/id408709785)とか機能がすごいのは認めるが、使い勝手が直感から離れすぎている、と感じる。そしてAudio MIDI設定ではmacに接続したキーボードをうまくルーティングできない。いかにもルーティングしまっせ!という画面なんだがうまくいかない。なんでかなw ![MIDIスタジオ](https://camo.elchika.com/9bf0005e633c3aa9351667d3b050b7323ab9c00d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33363031626666382d633530632d343762382d613765362d3531663731393163323336642f62373035333561382d366236342d346434332d383063622d646365653630663735646635/) PCでMIDI関連のチェックをする時に以前から[Pocket MIDI](https://www.morson.jp/pocketmidi-webpage/)を使ってたんだが、macでも使えて大変助かった。ありがとう。ただし、invalidのモニタができずに表示されないため、これだけではデバッグには向かない。同時に[MIDI Monitor](https://www.snoize.com/MIDIMonitor/)を起動しておくとエラーでもinvalidとして表示されて役に立った。ありがとうございます。 あとシリアル変換結果のモニタとしてターミナルが必要だが、いつも使っててバイナリ表示もしやすい[Serial Monster](https://apps.apple.com/us/app/serialmonster/id1639440980?mt=12)でボーレート31250の設定方法がわからなかった。その代わり[Cool Term](https://coolterm.macupdate.com/)が設定画面で31250を手打ちでき、バイナリでも表示できるので、MIDIモニタとしてはこれが良かった。結局、入力はPocket MIDI、出力はPocket MIDI/MIDI Monitor併用でMIDIキーボードの出番は無かった。 しかしmac OSのフリーウェアへの風当たりって酷すぎないかw ## まずはMLA流用内容を整える MLAはソースが分散されてプロジェクトの流用が面倒なので、まずは一旦使われている全てのヘッダーとソースファイルを、あらかじめ作っておいた空のプロジェクトフォルダにコピーした。 忘れずにsystem.hにあるUSE_INTERNAL_OSCを有効化し(コメント外し)ておく。指示通りパスコンを大容量(1〜8μF)にしておかないと動作しないらしいが、最低の1μFでも大丈夫そうだ。ちなみに[低価格の電解コンデンサセット](https://www.google.com/aclk?sa=L&ai=DChsSEwjd8cSl78iSAxWbx0wCHWKKN5EYACICCAEQEBoCdG0&co=1&ase=2&gclid=Cj0KCQiA4pvMBhDYARIsAGfgwvwraqUuEU0XOIpkyozaOJHNIKNoBoM7WENxQTKwDFOvjH2dEeA__NEaAs3bEALw_wcB&ei=yfeHaajRJNq_0-kPhZKs2QI&cid=CAAS3QHkaBHMn_oNYi90rWGskQaxy3fSfOcN0HV4dAmHtuGgXY6-C_ZJoeDFok6afYfT5m8uiCappycg2DCCbI7NjEVPlYnT_gGUrozXRbaye5bQ02sJH-LEBMZoqKe7IomiV4LC5lm2LNDqWG6oz2VtlAJgmC8VxTIMQtp5ZcBAEBpnX-UYGQuv18QOZlf0wr57eY-kdajydmxchElg30vCO_EIQ9NxqQKrE-d3vRVU2v3vxDpN1eSIMiDd9upvSEtM_3VjH24x-wZ6NHOvzbC92Wr4r89DmYVsaiAV2JdBaQ&cce=2&category=acrcp_v1_33&sig=AOD64_31zZwXKte1zK8UagSouWFTuJR2qA&ctype=5&q=&nis=4&sqi=2&ved=2ahUKEwjo2b-l78iSAxXa3zQHHQUJKysQ9aACKAB6BAgGEB0&adurl=)の実際の容量はかなり怪しい(もしくはハズレを掴まされる可能性がある)。 USB処理のメインルーチンはポーリングになっていて割り込みは使っていないが、割り込み関数が定義はされてしまっているので、シリアル関連で割り込みを使うためには削除する必要がある。 書き込んで動作確認をしてみると、USBから送ったMIDIパケットは完全無視、リセットボタンを押す度に適当なNoteOn/Offが出ることがわかる。 ## シリアル変換を整える前に USBからやってくるMIDIパケットは64バイト固定の受信バッファーに以下の4バイト構造で1ms毎にやってくるらしい。 ``` typedef union { uint32_t Val; uint8_t v[4]; union { struct { uint8_t CIN :4; uint8_t CN :4; uint8_t MIDI_0; uint8_t MIDI_1; uint8_t MIDI_2; }; struct { uint8_t CodeIndexNumber :4; uint8_t CableNumber :4; uint8_t DATA_0; uint8_t DATA_1; uint8_t DATA_2; }; }; } USB_AUDIO_MIDI_EVENT_PACKET, *P_USB_AUDIO_MIDI_EVENT_PACKET; ``` structの最初のバイトは4ビットずつに分割されているが、パケットサイズは4バイト固定で最大64バイト(=16パケット)が1msでやってくると約512kbpsの通信速度になる。一方でシリアル側は31.25kbpsだから16倍以上の速度差がある。つまり送信待ちをリングバッファで構成するなら、このサイズは最大化する必要があると言うことだ。逆に受信データを貯める方はUSBにすぐ引っこ抜いてもらうのでかなり少なくてもなんとかなりそうだ。なくてもいいかもしれない。 USB側もバッファを設けることを考えると、今度は送られてくるデータ(PICから見ると受信)に速度制限はない(=大バッファ必要)が、送るデータはちまちま送られてくるシリアルデータなのでバッファは小さくていい。 この記事はここまでいにして次の記事で実際の実装を考えていく。