Archive for 2010年6月14日|Daily archive page

GUI で midi する。。。または、キーボードを鍵盤に(midi編)

GUI で midi する。。。または、キーボードを鍵盤に” の今回の解説は、midi 関連関数 gs:midi-xxx 部分です。
と言っても、使っているのは、次の三つです。

(gs:midi-init)
(gs:midi-patch str-instrument int-channel)
(gs:play-note int-key int-duration int-velocity int-channel)


gs:midi-init
が、midi関連関数の初期化で、必ず一回は必要です。
gs:midi-patch で楽器を選択します。

(gs:midi-init)
(gs:midi-patch "Piano" 0)

引数は、説明するまでも無い? 使える楽器は、gs:get-instruments で取得できます。
後は、 gs:play-note を使って音を鳴らします。

; for key-event
(gs:play-note (+ (key 1) *plusNote*) 2 95 0)

; for mouse-event
(gs:play-note (+ (lookup (sym (tags 0)) *allNote*) *plusNote*) 2 95 0)


gs:play-note
の引数は、順に音階、音の長さ、音の強さ、(楽器に割り当てた)チャンネルとなります。
音階は、60 がいわゆるドの音で、ドレミファは 60 62 64 65 となります。つまり、1 が半音に相当します。1オクターブは、12 です。
今回のスクリプトでは、大域変数 *allNote* に音階名(Do Re Mi …)と音階の数値(60 62 64…)の連想リスト(…(Do 60) (Re 62) (Mi 64) …)が入っています。
さらに、鍵盤画像の鍵盤に音階名でタグ付けしてあります。
そのため、マウスで鍵盤をクリックすると、マウス・イベントで音階名のタグが得られ、それを使って、連想リストから、音階値を lookup します。
また、大域変数 *allNote* には、さらに、文字コードとの連想リスト(…(83 (Do 60)) (68 (Re 62)) (70 (Mi 64)) …)にしています。
この連想リストから押されたキーで lookup して、音階値を得ています。
変数 *plusNote* は、SHIFT キーが押されたか、CTRL キーが押されたかで、+12 か -12 が入ります。
音の長さは、16が四分音符相当です。つまり1は、64分音符、全音符は、64です。
今回は使っていませんが、テンポは、gs:midi-bpm で設定し、デフォルトは、120です。
音の強さは、0から127までが使え、デフォルトが 64 です。
newLISP の Domo Folder(newLISPインストール・ディレクトリ下の ‘guiserver’)にある‘midi-demo2.lsp’では、

(set 'pp 30 'p 40 'm 64 'f 127) ; set velocity/volume

という風に設定しています。

ということで、今回の解説を読むよりは、前述の‘midi-demo.lsp’や‘midi-demo.lsp’を読んだ方が早いかもしれません(汗)。

以上、如何でしょうか?