Real time graphics display trigger by MIDI
(2002.01.01)
MIDIの「ノートオン」メッセージを受けて、
画像を表示するプログラムを作ってみました。
平沢さん(P-MODEL)がやっていますが、
昔のソフトを駆使されていて、DCTVでの出力が限界となっています。
そこで、一番安定しているAmigaDOS3.1での限界に挑戦すべく
- CyberGraphX V4でフルカラー表示
- DataTypeで画像ファイル読込
- ARexxでの設定、および、制御
をサポートしました。
本当は、AmigaDOSや他のライブラリに任せて、手を抜いています。
用意するもの(カッコ内は開発環境)
プログラム
ebitai
CyberGraphX V4
ひょっとするとV3で動作するかもしれません。
ビデオボード
CyberGraphXがサポートしているもの
(PicassoIV)
MIDIインターフェース
(HiSOFT ProMIDI Interface)
MIDIシーケンサー
(KAWAI Q-80)
実機のシーケンサーは、Windowsより便利(笑)。
ライブラリ
Bars & Pipes、CyberGraphX、ProMIDIをインストールすると
おそらく一緒にインストールされます。
動作しなかったときだけ、Aminetから捜してインストールしてください。
- arp.library
- midi.library
- camd.library
- realtime.library
- cgxsystem.library
動作内容
CLIからプログラム「ebitai」を起動すると、
ARexxポート「EBITAI1」を開き、
設定スクリプト「ebitai.rexx」を起動し、
ARexxポートからのコマンドを待ちます。
ebitai.rexxが起動される
「MIDIチャンネル、ノートナンバー、画像ファイル名」の組みを
コマンド「LOAD」で登録し、
最後にコマンド「PLAY」で待機させて、
スクリプトは終了します。
MIDIシーケンサーから「ド、レ、ミ」を入力すると、
ノートナンバーに対応した画像が表示されます。
CLIから「ctrl + c」で終了します。
表示性能
ビデオボードでの表示は、当初、「CPUにオンブにダッコ」だったのですが、
複数画面を保持する方法が判明し、
解像度や環境によっては、極めて高速に表示できることを確認しました。
確認は、開発環境(=PicassoIVとCyberGraphX V4)で行ないました。
開発環境は、PPC604e/233MHz、68060/50MHzですが、ほぼ060/50MHzと考えてください。
フルカラーの640×480を10面保持できるので、ebitaiの全画面を一瞬で表示できます。
フルカラーの1024×768は1面だけだったので、CPUにオンブします。
ただし、ビデオボードの出力をebitai専用にすると2面以上持てるかも知れません。
画面を1面しか保持できなかった場合、画面に画像を転送するのが主な処理ですから、
表示速度《フレーム/秒》=転送速度《バイト/秒》÷(高さ×幅×深度÷8)
と考えています。
| 項番 | 解像度 | 深度(色数) | 表示速度《フレーム/秒》 |
| 1 | 640×480 | 24(フルカラー) | 超高速(計測不可) |
| 2 | 640×480 | 8(256) | 超高速(計測不可) |
深度8で画像ごとにパレットが異なる場合、
パレットの切換と、画像データの切換のタイミングが合わなくて、
かなり汚ない表示になります。
コマンド一覧
ebitai.rexxからでも、他のARexxスクリプトからでも発行できます。
コマンド「VERBOSE」
VERBOSE <スイッチ>
<スイッチ>:0(表示終了)、1(表示開始)
処理経過を表示しますが、表示速度が落ちるので、
調子が悪い際のチェック用に使ってください。
コマンド「LOAD」
drum.MIDICHANNEL = <MIDIチャンネル>
drum.NOTENUMBER = <ノートナンバー>
drum.GRAPHICSFILE = <画像ファイル>
LOAD drum
<MIDIチャンネル>:1〜16
<ノートナンバー>:ド=60、レ=62、ミ=64でおなじみの数字
<画像ファイル>:ファイル名
画像ファイルをメモリ上に読込んで、
MIDIチャンネルやノートナンバーと対応させます。
DataTypeで読める画像なら何でも良いハズですが、
フルカラーのBMPファイルが確実です。
最初の画像を利用して、画面の大きさと深度を決めています。
2個目以降の画像が最初と異なると、どうなるかわかりません。
10個まで読込めます。
コマンド「PLAY」
PLAY
MIDIのノートオンを待ちます。
最初からPLAY状態なのですが、
将来のMIDI設定の追加に備えました。
コマンド「STOP」
STOP
将来のMIDI設定の追加に備えました。
コマンド「QUIT」
QUIT
プログラムを終了します。
ebitai.rexxのサンプルと説明
| 行番号 | ソース | 説明 |
| 1 | /* | 1行目は必らずコメント |
| 2 | ebitai.rexx for startup ebitai | |
| 3 | */ | |
| 4 | | |
| 5 | OPTIONS RESULTS | よくわからないけど、とりあえず |
| 6 | | |
| 7 | verbose 0 | 1にすると表示開始 |
| 8 | | |
| 9 | drum.midichannel = 1 | MIDIチャンネルを1に設定 |
| 10 | | |
| 11 | drum.notenumber = 60 | ノートナンバーを60(ド)に設定 |
| 12 | drum.graphicsfile = demo60.bmp | 画像ファイルはdemo60.bmpに設定 |
| 13 | load drum | 上の3行で設定した内容をLOADで登録 |
| 14 | | |
| 15 | drum.notenumber = 62 | |
| 16 | drum.graphicsfile = demo62.bmp | |
| 17 | load drum | このときMIDIチャンネルは1個目と同じ |
| 18 | | |
| 19 | drum.notenumber = 64 | |
| 20 | drum.graphicsfile = demo64.bmp | |
| 21 | load drum | 3個目を登録 |
| 22 | | |
| 23 | play | 待機 |