〜 メディア 〜
MIDI音源の音色を変更 (要WINMM.DLL)

音の出力同様に数値で共通のMIDI出力モジュールの音色を変更するものです。
指定した番号に規定がないために音色を指定しても、必ずその音色になる保証はありませんが、
全くルールがないのでは使い物になりませんので、GeneralMIDI(GM)規格により
バンク切替を行わないときの128音色が規定されています。
下記サンプルでは8種類の楽器だけ使用していますが、
その他の音色及びGM規格の詳細について知りたい方はサーチエンジン等を利用して検索してください。
チャンネルは0〜15の16個を使用できますがチャンネル9だけはパーカッション(リズム)音色となります。
他チャンネルとは同じようには扱えませんので気をつけてください。
尚、midisettone命令以外のMIDI出力モジュールについてはコチラをご覧ください。
	

midiopen
[パラメータなし]MIDIデバイスを使用可能状態にするだけのため、パラメータは必要ない。
尚、下記midisetkey命令内でデバイスチェックしているので命令を実行する必要はない。

midisetkey 鍵盤, 強さ, チャンネル
鍵盤使用する鍵盤(但し、チャンネル9だけはリズム楽器)を指定する。
尚、低い「ド」を0としており、指定可能値は−60〜67である。
強さ鍵盤を押す強さを0〜127で指定する。尚、強さ0は無音を指す。
チャンネル使用チャンネルを0〜15のいずれかで指定する。

midireset
[パラメータなし]MIDIデバイスの出力を停止するだけのため、パラメータは必要ない。

midiclose
[パラメータなし]MIDIデバイスを解放するだけのため、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

midisettone 音色, チャンネル
音色切り替える音色を指定する。
チャンネル音色を変更するチャンネルを0〜15のいずれかで指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
	ll_libload winmm, "winmm.dll"
	ll_getproc midiOutOpen, "midiOutOpen", winmm
	ll_getproc midiOutShortMsg, "midiOutShortMsg", winmm
	ll_getproc midiOutReset, "midiOutReset", winmm
	ll_getproc midiOutClose, "midiOutClose", winmm
	ll_getproc midiOutShortMsg, "midiOutShortMsg", winmm

#module
#deffunc midiopen
	ll_getptr midh : ll_ret ptr
	prm = ptr, -1, 0, 0, 0
	ll_callfunc prm, 4, midiOutOpen@ // MIDIデバイスオープン
	return

#deffunc midisetkey int, int, int
	mref key, 0 : mref velocity, 1 : mref channel, 2
	if midh = 0 : midiopen
	prm = midh, 0x003C90 + (velocity * 0x10000) + (key * 0x100) + channel
	ll_callfunc prm, 2, midiOutShortMsg@ // 音を鳴らす
	return

#deffunc midireset
	if midh : ll_callfunc midh, 1, midiOutReset@ // 全て停止
	return

#deffunc midiclose onexit
	if midh : ll_callfunc midh, 1, midiOutClose@
	return

#deffunc midisettone int, int
	mref tone, 0 : mref channel, 1
	if midh = 0 : midiopen
	prm = midh, tone * 0x100 + 0xC0 + channel
	ll_callfunc prm, 2, midiOutShortMsg@ // 音色を変更
	return
#global

	sdim types, 16, 8
	sdim list, 128
	dim typno, 8
	dim push, 56
	dim sleep, 56
	types = "ピアノ", "オルガン", "アコーディオン", "バイオリン", "トランペット", "サックス", "尺八", "三味線"
	typno = 0, 16, 21, 40, 56, 64, 77, 106
	// 音階
	push.0  =  0,  2, 4, 0,  4,  0,  4 // ドレミドミドミ
	push.7  =  2,  4, 5, 5,  4,  2,  5 // レミファファミレファ
	push.14 =  4,  5, 7, 4,  7,  4,  7 // ミファソミソミソ
	push.21 =  5,  7, 9, 9,  7,  5,  9 // ファソララソファラ
	push.28 =  7,  0, 2, 4,  5,  7,  9 // ソドレミファソラ〜
	push.35 =  9,  2, 4, 6,  7,  9, 11 // ラレミファ♯ソラシ
	push.42 = 11,  2, 6, 8,  9, 11, 12 // シミファ♯ソ♯ラシド
	push.49 = 11, 10, 9, 5, 11,  7, 12 // シシ♭ラファシソド
	// ウェイト
	sleep.0  = 3, 1, 3, 1, 2, 2, 5
	sleep.7  = 3, 1, 1, 1, 1, 1, 5
	sleep.14 = 3, 1, 3, 1, 2, 2, 4
	sleep.21 = 3, 1, 1, 1, 1, 1, 5
	sleep.28 = 3, 1, 1, 1, 1, 1, 5
	sleep.35 = 3, 1, 1, 1, 1, 1, 5
	sleep.42 = 3, 1, 1, 1, 1, 1, 5
	sleep.49 = 1, 1, 2, 2, 2, 2, 5
	repeat 8
		if cnt : list += "\n" + types.cnt : else : list = types
	loop
	objsize 160, 25
	combox no, 100, list
	button "上記の楽器で演奏", *start
	midisetkey // 一度再生しないと音色が変わらない?
	stop

*start
	midireset
	midisettone typno.no // 音色変更する
	repeat 65
		midisetkey push.cnt, 0x7F
		wait 20 * sleep.cnt
		midisetkey push.cnt
	loop
	stop

midiopen
[パラメータなし]MIDIデバイスを使用可能状態にするだけのため、パラメータは必要ない。
尚、下記midisetkey命令内でデバイスチェックしているので命令を実行する必要はない。

midisetkey 鍵盤, 強さ, チャンネル
鍵盤使用する鍵盤(但し、チャンネル9だけはリズム楽器)を指定する。
尚、低い「ド」を0としており、指定可能値は−60〜67である。
強さ鍵盤を押す強さを0〜127で指定する。尚、強さ0は無音を指す。
チャンネル使用チャンネルを0〜15のいずれかで指定する。

midireset
[パラメータなし]MIDIデバイスの出力を停止するだけのため、パラメータは必要ない。

midiclose
[パラメータなし]MIDIデバイスを解放するだけのため、パラメータは必要ない。
尚、終了時に自動的に呼び出されるので命令を実行する必要はない。

midisettone 音色, チャンネル
音色切り替える音色を指定する。
チャンネル音色を変更するチャンネルを0〜15のいずれかで指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#uselib "winmm.dll"
#func  global midiOutOpen "midiOutOpen" var, int, int, int, int
#func  global midiOutShortMsg "midiOutShortMsg" int, int
#func  global midiOutReset "midiOutReset" int
#func  global midiOutClose "midiOutClose" int

#module
#deffunc midiopen
	midiOutOpen midh, -1, 0, 0, 0
	return

#deffunc midisetkey int key, int velocity, int channel
	if midh = 0 : midiopen
	midiOutShortMsg midh, 0x3C90 + velocity * 0x10000 + key * 0x100 + channel
	return

#deffunc midireset
	if midh : midiOutReset midh
	return

#deffunc midiclose onexit
	if midh : midiOutClose midh
	return

#deffunc midisettone int tone, int channel
	if midh = 0 : midiopen
	midiOutShortMsg midh, tone * 0x100 + 0xC0 + channel // 音色を変更
	return
#global

	types = "ピアノ", "オルガン", "アコーディオン", "バイオリン", "トランペット", "サックス", "尺八", "三味線"
	typno = 0, 16, 21, 40, 56, 64, 77, 106
	// 音階
	push.0  =  0,  2, 4, 0,  4,  0,  4 // ドレミドミドミ
	push.7  =  2,  4, 5, 5,  4,  2,  5 // レミファファミレファ
	push.14 =  4,  5, 7, 4,  7,  4,  7 // ミファソミソミソ
	push.21 =  5,  7, 9, 9,  7,  5,  9 // ファソララソファラ
	push.28 =  7,  0, 2, 4,  5,  7,  9 // ソドレミファソラ〜
	push.35 =  9,  2, 4, 6,  7,  9, 11 // ラレミファ♯ソラシ
	push.42 = 11,  2, 6, 8,  9, 11, 12 // シミファ♯ソ♯ラシド
	push.49 = 11, 10, 9, 5, 11,  7, 12 // シシ♭ラファシソド
	// ウェイト
	sleep.0  = 3, 1, 3, 1, 2, 2, 5
	sleep.7  = 3, 1, 1, 1, 1, 1, 5
	sleep.14 = 3, 1, 3, 1, 2, 2, 4
	sleep.21 = 3, 1, 1, 1, 1, 1, 5
	sleep.28 = 3, 1, 1, 1, 1, 1, 5
	sleep.35 = 3, 1, 1, 1, 1, 1, 5
	sleep.42 = 3, 1, 1, 1, 1, 1, 5
	sleep.49 = 1, 1, 2, 2, 2, 2, 5
	foreach types
		if cnt : list += "\n" + types.cnt : else : list = types
	loop
	objsize 100, 20
	combox no, 100, list
	button gosub "上記の楽器で演奏", *start
	midisetkey // 一度再生しないと音色が変わらない?
	stop

*start
	midireset
	midisettone typno.no // 音色変更する
	foreach push
		midisetkey push.cnt, 0x7F
		wait 20 * sleep.cnt
		midisetkey push.cnt
	loop
	return