-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgm1.csd
151 lines (138 loc) · 4.01 KB
/
gm1.csd
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<CsoundSynthesizer>
<CsOptions>
-odac -d -M 0
</CsOptions>
<CsInstruments>
nchnls=2
ksmps = 64
ichn = 1
lp1: massign ichn, 0
loop_le ichn, 1, 16, lp1
pgmassign 0, 0
gisf sfload "sf_GMbank.sf2"
sfpassign 0, gisf
/* this instrument parses MIDI input
to trigger the GM soundfont synthesis
instrument (instr 10
*/
instr 1
idkit = 317 /* drum-kit preset was 317*/
tableiw idkit, 9, 1
irel = 0.5 /* release envelope */
ipg = 1
ivol = 2
ipan = 3
nxt:
kst, kch, kd1, kd2 midiin
if (kst != 0) then
kch = kch - 1
if (kst == 144 && kd2 != 0) then ; note on
kpg table kch, ipg
/* instrument identifier is 10.[chn][note] */
kinst = 10 + kd1/100000 + kch/100
if kch == 9 then
/* exclusive identifiers */
if kpg == idkit+7 then
krel = 2 /* add extra release time for orch perc*/
else
krel = 0.5
endif
if (kd1 == 29 || kd1 == 30) then ; EXC7
kinst = 10.97
elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1
kinst = 10.91
elseif (kd1 == 71 || kd1 == 72) then ; EXC2
kinst = 10.92
elseif (kd1 == 73 || kd1 == 74) then ; EXC3
kinst = 10.93
elseif (kd1 == 78 || kd1 == 79) then ; EXC4
kinst = 10.94
elseif (kd1 == 80 || kd1 == 81) then ; EXC5
kinst = 10.95
elseif (kd1 == 86 || kd1 == 87) then ; EXC6
kinst = 10.96
endif
else
krel = 0.5
endif
event "i", kinst, 0, -1, kd1, kd2, kpg, kch,krel
elseif (kst == 128 || (kst == 144 && kd2 == 0)) then ; note off
kpg table kch, ipg
kinst = 10 + kd1/100000 + kch/100
if kch == 9 then
if (kd1 == 29 || kd1 == 30) then ; EXC7
kinst = 10.97
elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1
kinst = 10.91
elseif (kd1 == 71 || kd1 == 72) then ; EXC2
kinst = 10.92
elseif (kd1 == 73 || kd1 == 74) then ; EXC3
kinst = 10.93
elseif (kd1 == 78 || kd1 == 79) then ; EXC4
kinst = 10.94
elseif (kd1 == 80 || kd1 == 81) then ; EXC5
kinst = 10.95
elseif (kd1 == 86 || kd1 == 87) then ; EXC6
kinst = 10.96
endif
else
kpg = 0
endif
event "i", -kinst, 0, 1
elseif (kst == 192) then /* program change msgs */
if kch == 9 then
kpg = idkit
if kd1 == 8 then
kpg = idkit+1
elseif kd1 == 16 then
kpg = idkit+2
elseif kd1 == 24 then
kpg = idkit+3
elseif kd1 == 25 then
kpg = idkit+4
elseif kd1 == 32 then
kpg = idkit+5
elseif kd1 == 40 then
kpg = idkit+6
elseif kd1 == 48 then
kpg = idkit+7
endif
else
kpg = kd1
endif
tablew kpg, kch, ipg
elseif (kst == 176 && kd1 == 11) then /* volume msgs */
tablew kd2, kch, ivol
elseif (kst == 176 && kd1 == 7) then /* pan msgs */
tablew kd2, kch, ipan
endif
kgoto nxt
endif
endin
/* this is the GM soundfont synthesizer instrument */
instr 10
kenv linenr 10,0.001,p8,0.001
iamp table p5, 5
a1, a2 sfplay p5, p4, iamp,1, p6, 0, 0, 2
kv table p7, 2
kvol tablei kv, 5
kpan table p7, 3
kpan = (kpan - 64)/128
outs 0.2*a1*kvol*(0.5-kpan/2)*kenv, 0.2*a2*kvol*(0.5+kpan/2)*kenv
endin
instr 11
endin
</CsInstruments>
<CsScore>
/* program preset (memory) table */
f1 0 16 -2 0 0 0 0 0 0 0 0 226 0 0 0 0 0 0 0
/* velocity (memory) table */
f2 0 16 -2 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127
/* pan (memory) table */
f3 0 16 -2 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64
f5 0 128 5 0.1 128 1 /* velocity mapping: less nuanced */
f6 0 128 5 0.01 128 1 /* velocity mapping: more nuanced */
i 1 0 360000
e
</CsScore>
</CsoundSynthesizer>