2016-09-03 19:25 | カテゴリ:PIC応用回路
MDコントローラのソフトの製作を進めていました。


随所で、バグ取に苦しめられて、、、(笑)
プログラミングのヒントの「チップ」的な、皆さんのお役に立ちそうな所を少しご紹介させていただきたいと思います。

Open.jpg

続きはこちらで、、、、

具体的なTIPsの前に、ちょっとソフトの全体的な機能(メニュー)の説明を。
全体は以下の様になりました。

1)複数のMIDIコマンドデータの一連のブロックを、入力したり修正したりするモード(PIC内蔵メモリー上のデータ)

2)入力したMIDIデータをMIDI機器へ出力するモード(MIDIインターフェスの規格)

3)作成したMIDIコマンドデータを、外付けのEEPROMに保存したり、呼び出したりするモード

です。(下記写真を参照ください)

MainMenu.jpg

1)の入力編集モードでは、ロータリーエンコーダ(RE)をくるくる回して、押しボタンSWで決定して、入力していきます。
下の写真は、入力したMIDI命令のブロックの中の、1-3番目を示しています。

Edit.jpg

例として、ProgramChange命令で、これはCh16に出力されます。
命令の選択(コントロールチェンジやノートON。OFFなど)は30個ほどの命令はプログラム内部に名前を記憶していて、それをREで表示しながら、名前を選択して選びます。プログラム中で、名前をMIDIコードに変換しています。
パラメータの数値は、0-127の範囲があります。
最初は、REをくるくる回して入力するようにしましたが、結構大変なので、最終的には、
「右回転で1位をひとつづつUP、左回転で10位をひとつずつUP」としました。
行きすぎたら、戻れませんので、UPばかりになりますが、慣れるとこの方が楽です。

Edit2.jpg

左端の*印は、MIDIコマンドを連続出力する際の、区切りです。
メニュー(2)のMIDI信号創出モード時に、この*印がある命令のところで、一旦停止して、次に、フットSWかプッシュSWが押されるまで待ちます。

また、一連の命令途中に新しく行を追加したり、

INS1.jpg

不要な命令データ行を削除したりする事も出来ます。

Deletedata.jpg

2)MIDIデータの外部出力モードでは、内部EEPROMに記録されているデータを送出できます。

Transport.jpg

MIDI命令の送出時には、送出する命令群のブロック番号と中の命令の総数を表示します。
送出開始後は、命令作成の際に指示した、「区切り」のところで、MIDI信号を送出を中断し、SW操作、またはフットSWで再開できるようになっています。
複数のMIDI命令を区切りをつけて、送出できます。

TransPAUSE.jpg

3)一連のコマンドデータの保存、呼び出しのモードです。管理は、「ブロック番号」で行います。

外部EEPROMにデータを保存しますが、各データブロックは、256バイト単位で32ブロック(合計8KB)になります。
各ブロックの先頭4バイトは、管理領域で、ブロック番号、ブロック内の命令データのバイト数が記録されます。
実際のMIDI命令は、一命令で4バイトを使用し、1バイト目にMIDI命令とCH、2バイト目と3バイト目に数値(各0-127)、そして、4バイト目に、この命令の実質のバイト数と一連の命令の区切り(必要に応じて)を記憶します。
MIDIは、命令によって、1バイト命令、数値データを1バイト必要とする2バイト命令、同じく3バイト命令があり、送出途中に関係の無いデータを送るとえらいになりますので、不要な部分は送らないように命令のバイト数を確認する必要があります。
MIDI命令を編集したり管理するには、固定長が便利ですが、命令が可変長なので、この様な方法になりました。

(命令データの構造)

0x00, //ブロックナンバー
0x02, //ブロック内データコマンド数(4バイト単位)
0, //
0, //

//--------------以下データ------------------

0xFF, //Reset命令
0, // 第一パラメータ
0, // 第二パラメータ
0b10111100, // コントロールバイト

  以下、この様なデータが4バイト単位で続きます。


//---------------------------------------
// コントロールバイトのデータの定義
//---------------------------------------
// bit 7 6 5 4 3 2 1 0
// ^ ========= === コマンドに必要なデータバイト数(0-3)
//    l   ^------------ MIDIコマンドのNameCode(0-22)
// l------------------ Midiコマンドの区切り (0-1)
//

さて、このメニューは。SAVEとLOADで、指定のブロックに内部EEPのデータを書き込むか、指定のブロックのデータを読み込むかになります。
既にデータが書き込まれているブロックには、X表示がなされ注意を促しますが、管理は自分でしなければなりません。

SaveX.jpg

SaveOK.jpg

データをLOADする際は、今メモリー上にあるデータをSAVEするかを聞いてきます。

BefLOAD.jpg

以上が、機能の説明です。
ちょっと複雑でわかりにくいかもしれませんが、階層メニューになっています。



【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)

管理者のみに表示する