第 2 回 PSoC まつり 2015 05 23(Sat) 於 本サイプレス本社 ( 中野 ) PSoC5LP で USBMIDI ectoyfan ectoyfan アラフィフ ( 電 回路玩具ファン ) Electronic Circuit Toy s Fan お仕事は博物館の中のひと 幼少期 学研の教材 電 作 アマチュア無線 マイコン 1984 年 某調布にあるヲタ養成 学でソフトウェアを学ぶ 1994 年 奇跡的に今の職場に雇ってもらう 2002 年 Webサイト 電 回路玩具で遊ぼう! 開設 http://ectoyfan.xrea.jp 2003 年 趣味の ( へたれ ) 電 作を再開 2004 年 PSoCと出会う 2005 年 ブログ 王様の はロバの! 開設 http://blog.goo.ne.jp/ectoyfan 現在 なるべくゆるくゆるく きていきたいと願う 々 ectoyfan 1
PSoC で過去にこんなことをして遊びました PSoC Invention Kit Clone (CY8C27443) &CY8C26443ファームウェアライターの製作 (2004 07) 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 に接続し, 認識されることを確かめる. ( 実演して紹介 ) ectoyfan 2
#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 メッセージがあればコールバック関数を呼ぶ プログラム 1:USBMIDI を利 するプログラムのひな型 ectoyfan 3
// USBMIDI_1_MIDI_OUT_EP_Service() のコールバック関数 int skip_flag = 0; // システムエクスクルーシブメッセージを読み ばし中 void USBMIDI_1_callbackLocalMidiEvent(uint8 cable, uint8 *midimsg) { if (skip_flag) { if (midimsg[0] == 0xf7 midimsg[1] == 0xf7 midimsg[2] == 0xf7) { skip_flag = 0; 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; // 短いシステムエクスクルーシブメッセージの処理 プログラム 2: コールバック関数の実現 図 1: 源の実現 (first try) ectoyfan 4
図 2: 源の実現 ( 改良版 ) 図 3: ピン配置ならびに配線のようす ectoyfan 5
図 3: ピン配置ならびに配線のようす 図 4: クロック設定 ectoyfan 6
図 5: 演奏のようす デモンストレーション NSX 39と組み合わせて演奏させてみます NSX 39: ボーカル, パーカッション PSoC5LP 基板 : それ以外 ectoyfan 7
おわり ご清聴ありがとうございました ectoyfan 8