HSP | MIDI出力デバイス一覧を取得する・デフォルトのデバイス変更

HSP | MIDI出力デバイス一覧を取得する・デフォルトのデバイス変更

C言語?C++?で書かれたプログラムを地道にHSPに打ち直して作りました。
書き換える際に↓のサイトも参考にしました。
この二つのサイトの人に感謝です。
で、そのままHSPように書き換えたら下のようになりました。

#runtime "hsp3cl"
// 初期化
#include "winmm.as"
dim outCaps,13
res=0
num=0
// 表示
midiOutGetNumDevs
num=stat
mes "Number of output devices: "+num
repeat num
midiOutGetDevCaps cnt,varptr(outCaps),52
res=stat
if res!0 : continue
wMid=outCaps.0&0xFFFF
wPid=(outCaps.0>>16)&0xFFFF
vDriverVersion=outCaps.1
sdim szPname,32,1
memcpy szPname,outCaps,32,0,8
wTechnology=outCaps.10&0xFFFF
wVoices=(outCaps.10>>16)&0xFFFF
wNotes=outCaps.11&0xFFFF
wChannelMask=(outCaps.11>>16)&0xFFFF
dwSupport=outCaps.12
mes "ID="+cnt+": "+szPname
loop

%dや%sは、strf関数使えば変換できますが、する必要がないのでそのまま文字列として連結して表示。
&を使ってメモリの場所を調べるところはvarptr関数。
本来関数だったものが命令になっちゃってるので、命令として使ってからstatで値を取得。
forのループをrepeat~loopとcntで。
構造体からは別の変数にコピーして調べる。
こんな感じですかね。工夫したところは。
このプログラムをさらに、GUI化して、レジストリいじくってデフォルトのデバイスを変更できるようにしてみます。

// 初期化
#include "hspext.as"
#include "winmm.as"
sdim list
id=0
sdim regmid
sdim namemid
dim outCaps,13
res=0
num=0
// 取得
title "デフォルトのMIDI出力デバイスの変更"
midiOutGetNumDevs
num=stat
notesel list
repeat num
midiOutGetDevCaps cnt,varptr(outCaps),52
res=stat
if res!0 : continue
wMid=outCaps.0&0xFFFF
wPid=(outCaps.0>>16)&0xFFFF
vDriverVersion=outCaps.1
sdim szPname,32,1
memcpy szPname,outCaps,32,0,8
wTechnology=outCaps.10&0xFFFF
wVoices=(outCaps.10>>16)&0xFFFF
wNotes=outCaps.11&0xFFFF
wChannelMask=(outCaps.11>>16)&0xFFFF
dwSupport=outCaps.12
noteadd szPname
loop
regkey 0,"Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap"
if stat!0 {
exec "new.reg",16
dialog "指示に従って書き込むところを新規作成してください\n作成したら下のボタンを押してください",,"情報"
} else {
getreg regmid,"szPname",1
if stat!0 {
exec "new.reg",16
dialog "指示に従って書き込むところを新規作成してください\n成したら下のボタンを押してください",,"情報"
dialog "一回終了します",,"情報"
end
} else {
id=-1
repeat num
noteget namemid,cnt
if namemid=regmid : id=cnt : break
loop
if id=-1 : dialog "現在の設定が異常です",1,"情報" : id=0
}
}
// 表示
objsize 320,24
combox id,,list
button gosub "変更",*change
stop
*change
noteget namemid,id
regkey 0,"Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap"
setreg namemid,"szPname",1
dialog "設定を書き込みました",,"情報"
return

カレントディレクトリに、下の内容のファイルを「new.reg」という名前で保存しておいてください。(拡張子reg)

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Multimedia\MIDIMap]
"szPname"=""

なぜか一回getregしたときにエラーが出ていた場合、setregすると強制的にバイナリ値が書き込まれてしまうというバグ (?) が起きたので、その時は一回終了するようにしました。
Windows XPだと確かもともとこの値がすでに書き込まれているのですが、Windows 7 とかだと最初は無いので新規作成の機能も付けました。
でも、書き込めばちゃんと動作します。
これを使えば、東方のMIDIを別のデバイスで再生したい!とかいうときに役に立つのではないでしょうか。
西方だとソフトの側でデバイス指定できるのに東方はできないので。
では。
↓クリックお願いします!