« FRマイコン基板でMIDI実装&SX-150を演奏(その3) | トップページ | ColdFireマイコン基板始めました »

2008年10月19日 (日曜日)

FRマイコン基板でMIDI実装&SX-150を演奏(最終回)

さて、MIDIの実装ですが今回実装するのはノートオンとノートオフとピッチベンドの3種類。たったの3種類ではありますが、SX-150のCV/GATEをコントロールするのが目的ですからそれで十分です。アフタータッチとかも面白そうだったんですが、

手持ちのMIDIキーボード(PCR-30)は鍵盤自体がアフタータッチに非対応(スライダーで送信は可能)だったのでやめました。つーか私のSX-150、LFOの波形選択スイッチをスライドではなく押し込む事で劇的に音色が変わったりします。

話は元に戻って、たったの3種類のイベントの実装なんですがこれがハマりまくり。
基本的には

  1. アクティブセンシング(0xFE)はスルー
  2. ステータスバイトが来たら続くデータバイトを読みこみ
  3. 必要なバイト数読んだらSX-150に対して制御

と言うロジックでいいんですが、いきなりノートオンが取れません。色々悩んだ結果、UARTの設定をミスっている事が判明(パリティありにしていた)。つーか、それでもアクティブセンシングは取得できていて、それですっかり勘違い。

これでノートオン、ノートオフ、ピッチベンドを含め、各種のイベントが取れていることが確認できましたが、今度はバッファリングが上手く行きません。バッファリング位置を示す変数のやりとりが上手く行っていないようです。しばらく悩んだ後、先駆者の知恵をお借りする事にしました。

ソースコードをDLして解析してみると、なんとバッファリングしてないじゃないっすか!ていうか、UARTの割り込み使っていないじゃないですか!実際にはデータ受信ビットを監視するマクロが定義されていて、そのマクロをメインループ内で実行して受信監視&通知する形式になっていました。はぁ、それでもいいんですね~勉強になります。

早速試してみるとキチンとイベントが取れます。なんだーバッファリングいらんのか~という事でようやくMIDIイベントの処理ロジックに取り掛かります。

とは言うものの、これがまた1バイトずつ処理するのが以外と大変。普段仕事で高度に抽象化されたフレームワークやらライブラリに慣れ親しんでいると、通知メソッドにEventオブジェクトが引数で渡されるイメージを想像してしまって、それを見ればイベントはノートオンでノートナンバーはいくつで、ベロシティはいくつで、てのがすぐわかるみたいなモノを想像してしまいますが、今回はそれすらも自身で実装しないといけないわけです。でもまぁ、こーいうのがまた面白いんですがね。

という事で、ノートオンを実装して試してみます(ちなみにPCR-30はノートオフはベロシティ0でノートオンの仕様です)。一応、発音はするのですが、スタッカート気味に弾くと発音しない&ノートオフされない場合があります。プレーンなデータを見るとステータスバイト無しにいきなりデータバイトが来ている感じ。これってMIDIのランニングステータスのせいなんですが、当初は「イベントの取りこぼし?」と誤解してしばらく悩みました。実は私MIDI検定の2級筆記持ってるんですがここ数年まともに触っていないせいですっかり忘れていました。情けない。

ランニングステータスに対応してこれでばっちりと思いきや、まだ発音が完璧ではありません。そうでした、SX-150はモノフォニックなので全部のノートオフを処理してしまうとタイミングによってはまだ発音中の音まで止まってしまいます。という事で、発音中の音でなければノートオフはスルーする様に変更。これでようやく普通に弾けるレベルになりました。

さて、続いてはピッチベンドを実装ですが、ここでもハマりました。まずはWikipediaの内容を参考に実装していたところ、MSBとLSBの順番が逆。結局MIDI検定の公式ガイドブックを引っ張り出してきてそちらを参照。あれ、よく見るとWebで必死に探してたMIDIのハードウェア周りについても一通り書かれているじゃないですか!もっと早く気が付くんだった。

気を取り直して実装すると、ベンドはかかるんですがノートオフされないケースが発生。あれ、さっきまでは動いてたのにーとこれまた試行錯誤すること数時間。ゴール目前でこのハマりよう。結局、原因はソフトウェア側でのMIDIイベントの取りこぼしの様です。MIDIイベントの処理に時間がかかりすぎて、その間に発生したイベントが取得できない状態になっている模様。バッファリングしない場合はイベントの処理時間の高速化が必須ですね。

結局、高速化のアプローチは今回取らずに気を取り直してバッファリング処理を実装しなおしたところ、ようやく改善。ここまで長かった。

そんなこんなでようやく出来たのがこれ。ちなみに今回、全部を@niftyビデオ共有の編集ツールで編集したんですが、演奏部分で音ズレが発生していますのでご了承ください(でもニコニコムービーメーカーより全然使えます)。

本当はベースボード上に回路を作って完成なんですが、他のマイコン基板もいじってみたいのでとりあえずこれでOKとします。

|

« FRマイコン基板でMIDI実装&SX-150を演奏(その3) | トップページ | ColdFireマイコン基板始めました »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2790/42840176

この記事へのトラックバック一覧です: FRマイコン基板でMIDI実装&SX-150を演奏(最終回):

« FRマイコン基板でMIDI実装&SX-150を演奏(その3) | トップページ | ColdFireマイコン基板始めました »