ニシの生活

ギター、DIY、読書日記

PICでUSB-MIDI(サンプル編集編)

概要

Microchip Libraries for Applicationsのaudio_midiのサンプルプロジェクトを編集して、マイコンのGPIOに対応して異なるピッチのNoteをONするプログラムに書き換えました。
これでMIDIキーボードらしくなってきたと思います。

ソースファイルの一覧は下記。

  • main.c

    • メインのファイルですね。ここに書いてあることが順に実行されていきます。
  • system.c

    • ここに記述されている"SYSTEM_Initialize()"がmain.cに呼び出されます。マイコンのポートの設定などが行われます。

    • buttons.cの関数"BUTTON_Enable()"を呼び出してマイコンのポートをボタン用の設定にしたりします。

    • "CONFIGURATION Bits"を設定しています。おそらくレジスタの中でもコンフィギュレーションレジスタと定義されているものの設定をここでしているということだと思います。

  • app_device_audio_midi.c

    • ここにはMIDI信号を送信するための処理を行う関数が記述されています。これがメインの処理です。
  • app_led_usb_status.c

  • io_mapping.h

    • マイコンのポートに名前を付けて定義しています。
  • buttons.c

    • 上記の通り"BUTTON_Enable()"などの関数が記述されていたり、ボタンが押されているかどうか判定する関数が記述されています。
  • leds.c

  • usb_descriptors.c

  • usb_events.c

  • usb_device.c

バイスのヘッダーファイルはここにありました。
"C:\Program Files\Microchip\xc8\v2.46\pic\include\proc\pic18f14k50.h"

MIDIキーボードのアルゴリズム

"app_device_audio_midi.c"の"APP_DeviceAudioMIDITasks()"の内容を書き換えました。
アルゴリズムは下図の通りです。

key scanで現在のポートのHi/Loを取得します。
直近の状態と比較して変わっていなければ何もせず、またkey scanに戻ります。
Lo → Hi(rise)ならNote Onを送信します。
Hi → Lo(fall)ならNote Offを送信します。

こうして書いてみると結構単純なアルゴリズムだと思います。

ポート設定

今回のプログラムではマイコンのポートをデジタル入力ポートとして使用したいです。
デフォルトでデジタル入力ポートになっていればいいですが、そうでないなら設定し直さないといけません。
18F14K50のRC3のピンを使うことにしたのですが、このピンはアナログ入力ポートの機能も備えていて、デフォルトではアナログ入力に設定されています。
これをデジタル入力に設定するには、ANSELというレジスタ設定を書き換える必要があります。ANSELというレジスタのRC3に対応するビットを0に設定することで、デジタル入力となります。

エラー対応

サンプルプロジェクトをコピーしてみたら、buildでエラー発生。
"usb.h"などのヘッダーファイルが"file not found"とのこと。
MPLAB上で見る限りだとヘッダーファイルはAddされているし、パスも認識されているように見えるのだけどなぜ?と思いましたが、、
"Project Properties"にて、XC8 Compilerの設定で、"Include directries"の値が間違っていました。
プロジェクトの場所が変わっているのにInclude Directriesのパスが相対パスで指定されており、間違った場所を探していたようです。
パスを改めて指定してあげたらbuildが通るようになりました。

調査内容

ポートの状態がHiかLoかなど、論理値を扱う場合はbool型の変数や関数を使うことがあるようです。
参考ページ: C言語でのbool型の使い方

また、C言語の初歩的な知識と思いますが、staticの使い方がわからなかったので調べました。
参考ページ: C言語 staticを変数と関数に付ける価値【保護の仕組みを解説】