PSoC5LP
でUSBMIDI
ectoyfan
第2回PSoCまつり 2015‐05‐23(Sat) 於⽇本サイプレス本社(中野)ectoyfan
(電⼦回路玩具ファン)
Electronic Circuit Toy’s Fan
幼少期 学研の教材→電⼦⼯作→アマチュア無線→マイコン 1984年 某調布にあるヲタ養成⼤学でソフトウェアを学ぶ 1994年 奇跡的に今の職場に雇ってもらう 2002年 Webサイト「電⼦回路玩具で遊ぼう!」開設 http://ectoyfan.xrea.jp 2003年 趣味の(へたれ)電⼦⼯作を再開 2004年 PSoCと出会う 2005年 ブログ「王様の⽿はロバの⽿!」開設 http://blog.goo.ne.jp/ectoyfan 現在 なるべくゆるくゆるく⽣きていきたいと願う⽇々アラフィフ
お仕事は博物館の中のひと
•
PSoC1(CY8C27443)
による簡易アノマロスコープの製作(2005‐05)
•
USB
つきPSoC1(CY8C24794)を使った「傾きマウス」の製作(2006‐08)
•
博物館の展⽰にPSoC1を使った話:リレーボード(27443,2007‐10),
中断ボタンボックス(24794,2008‐12)
•
PSoC3(CY8C3866)
によるAM変調デモ(2010‐7)
•
CQ
のPSoC5LP基板にカラーグラフィック液晶をつないでemWinを動
かしてみた(2014‐04)
•
CQ
のPSoC5LP基板でUSBMIDIを⽤いた簡易シーケンサを作ってみた
(2014‐05)
•
CQ
のPSoC5LP基板でMARY‐VB基板による15fpsの動画取り込み&
MARY‐OB
基板による表⽰に挑戦した(2014‐07〜09)
•
いろいろなデバイスをつないで遊ぶ ADJDカラーセンサ 加速度
センサ AY‐3‐8910(PSG) SN76489AN(DCSG)
あっという間に
PSoC5LP
がUSBMIDIデバイスになります!
1. PSoC Creator
で新規プロジェクトを作成する.
2. USBMIDI
モジュールを配置する.
3.
(今回UARTは使わないのでコンパイルエラーが出ない程度
に始末する:PIN接続を消す,⼊⼒にLogic’1’を⼊れる.)
4.
クロックを設定する:ILOを100kHzに,IMOを24MHzに,USB
をEnableにしてIMO×2=48MHzにする.
5. main.c
に数⾏コードを書く(USBMIDIの使⽤開始のみ).
6. Build
する.
7. Program
する.
8. USB
をPCに接続し,認識されることを確かめる.
(実演して紹介)
#include <project.h> int main() { CyGlobalIntEnable; // グローバル割込み許可 USBMIDI_1_Start(0, USBMIDI_1_3V_OPERATION); // USBMIDI 初期化 while (!USBMIDI_1_GetConfiguration()); // USBが準備できるまで待つ USBMIDI_1_MIDI_EP_Init(); // MIDI メッセージ送受信の準備 for (;;) { } }
プログラム0:USBMIDIデバイスとして
有効にするための最⼩プログラム例
void USBMIDI_1_callbackLocalMidiEvent(uint8 cable, uint8 *midiMsg) { // USBMIDI_1_MIDI_OUT_EP_Service() のコールバック関数 // midiMsgに3バイトデータがやってくる // システムエクスクルーシブについては // 先頭バイトが0xf0である3バイトデータから // 0xf7を含む3バイトデータまでがひとまとまり // (0xf7以降は無視) } int main() { … CyGlobalIntEnable; // グローバル割込み許可 … USBMIDI_1_Start(0, USBMIDI_1_3V_OPERATION); // USBMIDI 初期化 while (!USBMIDI_1_GetConfiguration()); // USBが準備できるまで待つ USBMIDI_1_MIDI_EP_Init(); // MIDI メッセージ送受信の準備 … for (;;) { … USBMIDI_1_MIDI_IN_Service(); // ホスト(PC)にMIDIメッセージを送信 USBMIDI_1_MIDI_OUT_EP_Service(); // ホストからのMIDIメッセージがあればコールバック関 数を呼ぶ … } …} else { If (((midiMsg[0] & 0xf0) == 0x80 || (midiMsg[0] & 0xf0) == 0x90) && (midiMsg[0] & 0x0f) != 0x09) { // Note on & off でかつドラムチャンネル(10ch)でない if (!Q_isFull()) { Q_EnQ(v_NODE_NOTEONOFF(midiMsg[0] & 0x0f, midiMsg[1], midiMsg[2])); } } if ((midiMsg[0] & 0xf0) == 0xb0) { // コントロールチェンジ If (!Q_isFull()) { Q_EnQ(v_NODE_CONTROLCHANGE(midiMsg[0] & 0x0f, midiMsg[1], midiMsg[2])); } } if ((midiMsg[0] & 0xf0) == 0xe0) { // ピッチベンド if (!Q_isFull()) { Q_EnQ(v_NODE_PITCHBEND(midiMsg[0] & 0x0f, midiMsg[1], midiMsg[2])); } } if (midiMsg[0] == 0xf0) { skip_flag = 1; } // システムエクスクーシブメッセージ If (skip_flag && (midiMsg[1] == 0xf7 || midiMsg[2] == 0xf7)) { skip_flag = 0; } // 短いシステ ムエクスクルーシブメッセージの処理 } }