MIDIキーボードの鍵盤入力を取得

単純に鍵盤部分のみの取得。
キーボードやピアノを題材にした音ゲーとか作れそう!斬新!(棒)

単純に鍵盤部分のみの取得。
キーボードやピアノを題材にした音ゲーとか作れそう!斬新!(棒)

; KORGnanoKEY2
;
sdim code,64,128
code(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 0x3C4
title "MIDI"
#include "hscallbk.as" ;
#include "winmm.as"
#uselib ""
#func clbkGetMidi "" int,int,int,int,int
md_getmax = 24 ;
dim md_current,md_getmax
repeat md_getmax
md_current(cnt)=-1
loop
onexit *lEnd
textMidiInfo = "" ;
md_id = 0 ; 0
md_hnd = 0 ;
;
midiInGetNumDevs
md_cnt = stat
if md_cnt == 0 {
dialog ""
goto *lEnd
}
;
dim md_caps,11
midiInGetDevCaps md_id, varptr(md_caps), 44
md_caps_mid = md_caps(0) & 0xFF
md_caps_pid = (md_caps(0)>>8) & 0xFF
md_caps_ver = md_caps(1)
sdim md_caps_name,32
memcpy md_caps_name, md_caps, 32, 0, 8
;
font "meiryo",14
objmode 2,1
objsize 100,30
pos ginfo_winx-110,10
button gosub "",*lMidiReset
pos 10, 10
mes "wMid : "+md_caps_mid
mes "wPid : "+md_caps_pid
mes "vDriverVersion : "+strf("%x",md_caps_ver)
mes "szPname : "+md_caps_name
;
setcallbk procGetMidi, clbkGetMidi, *lGetMidi
;
gosub *lMidiOpen
stop
;
*lMidiOpen
;
midiInOpen varptr(md_hnd), md_id, varptr(procGetMidi), 0, CALLBACK_FUNCTION
textMidiInfo = "\nmidiOpen : "+stat+"\nHndle : "+md_hnd
if stat != MMSYSERR_NOERROR {
dialog "midiIn"
goto *lEnd
}
; 使
midiInStart md_hnd
gosub *lDrawMidiInfo
return
;
*lMidiClose
if md_hnd!=0 {
midiInStop md_hnd
midiInReset md_hnd
midiInClose md_hnd
}
return
;
;
*lMidiReset
gosub *lMidiClose
repeat md_getmax
md_current(cnt)=-1
loop
gosub *lMidiOpen
return
;
; textMidiInfo
*lDrawMidiInfo
redraw 0,0,240,640,480
color 255,255,255 : boxf 0,240,640,480
color 0,0,0
pos 10, 240 : mes "Info : "+textMidiInfo
pos 200, 240 : mes ""
repeat md_getmax
if md_current(cnt)!=-1{
mes ""+code(md_current(cnt))
}
if (cnt\8)==7 : pos ginfo_cx+80,260
loop
redraw 1,0,240,640,480
return
;
; CALLBACK MidiInProc(
; HMIDIIN hMidiIn,
; UINT wMsg,
; DWORD dwInstance,
; DWORD dwParam1,
; DWORD dwParam2
; )
*lGetMidi
clbk_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_ins
textMidiInfo+= "\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 = -1
repeat md_getmax
if md_current(cnt)==md_get_code {
_flag = 1
} else:if _cur==-1 && md_current(cnt)==-1 {
_cur = cnt
}
if _flag==1 && _cur!=-1 : break
loop
if _flag == 0 && _cur!=-1 {
md_current(_cur) = md_get_code
}
} else:if md_get_state == 8 {
textMidiInfo+= "\n"
repeat md_getmax
if md_current(cnt)==md_get_code {
md_current(cnt) = -1
}
loop
}
textMidiInfo+= "\n : "+strf("%d%%",md_get_gain*100/127)
}
}
gosub *lDrawMidiInfo
return
;
*lEnd
gosub *lMidiClose
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX