単純に鍵盤部分のみの取得。
キーボードやピアノを題材にした音ゲーとか作れそう!斬新!(棒)
単純に鍵盤部分のみの取得。
キーボードやピアノを題材にした音ゲーとか作れそう!斬新!(棒)
; KORGのnanoKEY2でしか動作確認していないのでそこんとこよろしく; 別にこれ↓やっておく必要ないんだけど渡された数値表示するよりはわかりやすいかとsdim code,64,128code(0x0) = "c ","c#","d ","d#","e ","f ","f#","g ","g#","a ","a#","b ","c ","c#","d ","d#"code(0x10) = "e ","f ","f#","g ","g#","a ","a#","b ","c ","c#","d ","d#","e ","f ","f#","g "code(0x20) = "g#","a ","a#","b ","c ","c#","d ","d#","e ","f ","f#","g ","g#","a ","a#","b "code(0x30) = "c ","c#","d ","d#","e ","f ","f#","g ","g#","a ","a#","b ","c ","c#","d ","d#"code(0x40) = "e ","f ","f#","g ","g#","a ","a#","b ","c ","c#","d ","d#","e ","f ","f#","g "code(0x50) = "g#","a ","a#","b ","c ","c#","d ","d#","e ","f ","f#","g ","g#","a ","a#","b "code(0x60) = "c ","c#","d ","d#","e ","f ","f#","g ","g#","a ","a#","b ","c ","c#","d ","d#"code(0x70) = "e ","f ","f#","g ","g#","a ","a#","b ","c ","c#","d ","d#","e ","f ","f#","g "repeat length(code)code(cnt)=code(cnt)+" ("+(cnt/12-3)+")"loop#define CALLBACK_NULL 0x00000000#define CALLBACK_FUNCTION 0x00030000#define MMSYSERR_NOERROR 0x0#define MIM_DATA 0x3C3#define MIM_ERROR 0x3C5#define MIM_LONGDATA 0x3C4title "MIDIコントローラの入力取得"#include "hscallbk.as" ;ちょくとさんのコールバックプラグイン#include "winmm.as"#uselib ""#func clbkGetMidi "" int,int,int,int,intmd_getmax = 24 ; 同時認識最大キー数dim md_current,md_getmaxrepeat md_getmaxmd_current(cnt)=-1looponexit *lEndtextMidiInfo = "" ; 画面に表示させる情報md_id = 0 ; とりあえず0番目のデバイスを選択md_hnd = 0 ; ハンドル; 有効なデバイス数を取得midiInGetNumDevsmd_cnt = statif md_cnt == 0 {dialog "接続されていません"goto *lEnd}; デバイスの情報を取得dim md_caps,11midiInGetDevCaps md_id, varptr(md_caps), 44md_caps_mid = md_caps(0) & 0xFFmd_caps_pid = (md_caps(0)>>8) & 0xFFmd_caps_ver = md_caps(1)sdim md_caps_name,32memcpy md_caps_name, md_caps, 32, 0, 8; デバイスの情報を表示font "meiryo",14objmode 2,1objsize 100,30pos ginfo_winx-110,10button gosub "リセット",*lMidiResetpos 10, 10mes "wMid : "+md_caps_midmes "wPid : "+md_caps_pidmes "vDriverVersion : "+strf("%x",md_caps_ver)mes "szPname : "+md_caps_name; コールバック関数登録setcallbk procGetMidi, clbkGetMidi, *lGetMidi; 受付開始gosub *lMidiOpenstop; デバイスの入力受け付け開始*lMidiOpen; デバイスを開くmidiInOpen varptr(md_hnd), md_id, varptr(procGetMidi), 0, CALLBACK_FUNCTIONtextMidiInfo = "\nmidiOpen : "+stat+"\nHndle : "+md_hndif stat != MMSYSERR_NOERROR {dialog "midiInエラー"goto *lEnd}; デバイスの使用開始midiInStart md_hndgosub *lDrawMidiInforeturn; デバイスの入力受け付け停止、情報リセット、閉じる*lMidiCloseif md_hnd!=0 {midiInStop md_hndmidiInReset md_hndmidiInClose md_hnd}return; 意図的なリセット; リセット直後に入力があるような状態は避けてください*lMidiResetgosub *lMidiCloserepeat md_getmaxmd_current(cnt)=-1loopgosub *lMidiOpenreturn; 入力情報の表示; 単純に textMidiInfo に入っている文字を描画するだけ*lDrawMidiInforedraw 0,0,240,640,480color 255,255,255 : boxf 0,240,640,480color 0,0,0pos 10, 240 : mes "Info : "+textMidiInfopos 200, 240 : mes "現在入力中のキー"repeat md_getmaxif md_current(cnt)!=-1{mes ""+code(md_current(cnt))}if (cnt\8)==7 : pos ginfo_cx+80,260loopredraw 1,0,240,640,480return; コールバック; CALLBACK MidiInProc(; HMIDIIN hMidiIn,; UINT wMsg,; DWORD dwInstance,; DWORD dwParam1,; DWORD dwParam2; )*lGetMidiclbk_md_hnd = callbkarg(0)clbk_md_msg = callbkarg(1)clbk_md_ins = callbkarg(2)clbk_md_prm1 = callbkarg(3)clbk_md_prm2 = callbkarg(4)textMidiInfo = ""if clbk_md_hnd == md_hnd {; エラーif clbk_md_msg == MIM_ERROR {textMidiInfo = "\nエラー"textMidiInfo+= "\nParam1 : " + strf("0x%X",clbk_md_prm1)textMidiInfo+= "\nParam2 : " + strf("0x%X",clbk_md_prm2)gosub *lMidiReset; 情報取得} else:if clbk_md_msg == MIM_DATA {textMidiInfo+= "\nMIM_DATA"textMidiInfo+= "\nMsg : " + strf("0x%X",clbk_md_msg)textMidiInfo+= "\nInstance : " + clbk_md_instextMidiInfo+= "\nParam1 : " + strf("0x%X",clbk_md_prm1)textMidiInfo+= "\nParam2 : " + clbk_md_prm2+" ms"textMidiInfo+= "\n"; この辺はもしかするとデバイスによって異なるかもmd_get_code = (clbk_md_prm1>>8) & 0xFF ; 押したキーmd_get_state = (clbk_md_prm1)>>4 & 0xF ; キーの押下状態md_get_gain = (clbk_md_prm1>>16) & 0xFF ; 押下した強さ; 表示用に内容解析textMidiInfo+= "\n音 : "+code(md_get_code)if md_get_state == 9 {textMidiInfo+= "\n押した"_flag = 0_cur = -1repeat md_getmaxif md_current(cnt)==md_get_code {_flag = 1} else:if _cur==-1 && md_current(cnt)==-1 {_cur = cnt}if _flag==1 && _cur!=-1 : breakloopif _flag == 0 && _cur!=-1 {md_current(_cur) = md_get_code}} else:if md_get_state == 8 {textMidiInfo+= "\n離した"repeat md_getmaxif md_current(cnt)==md_get_code {md_current(cnt) = -1}loop}textMidiInfo+= "\n強さ : "+strf("%d%%",md_get_gain*100/127)}}gosub *lDrawMidiInforeturn; 終了*lEndgosub *lMidiCloseend