aboutsummaryrefslogtreecommitdiff
path: root/site/udo/scss/seqtable.udo
blob: 99f586b0723acc003e8df09875489323d74b7b9a (plain)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#ifndef UDO_SCSS_SEQTABLES
#define UDO_SCSS_SEQTABLES ##




/*
; temp scratch replacement tables
iscratchnum = 8
gistfn_scratch[] init iscratchnum
index = 0
while (index < iscratchnum) do
	gistfn_scratch[index] = ftgen(0, 0, -16, -2, 0)
	index += 1
od
*/





; statics
/*
gistfn_all   ftgen 0, 0, -giscss_seqtable_size, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
gistfn_offbeat ftgen 0, 0, -giscss_seqtable_size, -2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0
gistfn_onbeat ftgen 0, 0, -giscss_seqtable_size, -2, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0
gisfn_2ndbeat ftgen 0, 0, -giscss_seqtable_size, -2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 
*/


/*
gSseq_names[] fillarray "Kick", "Snare", "Clap", "Hat", "Hat2", "Bass", "Sine", "OPL"
giscss_stfn_src[][] init lenarray(gSseq_names), 4
index = 0
while (index < lenarray(giscss_stfn_src, 1)) do
	index2 = 0
	while (index2 < lenarray(giscss_stfn_src, 2)) do
		giscss_stfn_src[index][index2] = ftgen(0, 0, -giscss_seqtable_size, -2, 0)
		index2 += 1
	od
	index += 1
od
*/

; automation tables for arbitrary assignment
giscss_fn_automation[] init 8

giscss_stfn_trig[][] init 1, 1
giscss_stfn_dur[][] init 1, 1
giscss_stfn_params[][] init 1, 1

giscss_st_size = -1
giscss_st_slots = -1
giscss_stfn_temp = -1
giscss_stfn_param_temp = -1
giscss_st_paramnumber = -1
opcode scss_st_boot, 0, ijj
	icategorynum, iseqtable_size, islots xin
	iseqtable_size = (iseqtable_size == -1) ? 16 : iseqtable_size
	islots = (islots == -1) ? 4 : islots
	iparamnumber = 4

	giscss_st_size = iseqtable_size
	giscss_st_slots = islots
	giscss_st_paramnumber = iparamnumber
	giscss_stfn_temp = ftgen(0, 0, -iseqtable_size, -2, 0)
	giscss_stfn_param_temp = ftgen(0, 0, -(iseqtable_size*iparamnumber), -2, 0)

	giscss_stfn_trig[][] init icategorynum, islots
	giscss_stfn_dur[][] init icategorynum, islots
	giscss_stfn_params[][] init icategorynum, islots
	
	index1 = 0
	while (index1 < icategorynum) do
		index2 = 0
		while (index2 < islots) do
			giscss_stfn_trig[index1][index2] = ftgen(0, 0, -iseqtable_size, -2, 0)
			giscss_stfn_dur[index1][index2] = ftgen(0, 0, -iseqtable_size, -2, 0)
			giscss_stfn_params[index1][index2] = ftgen(0, 0, -(iseqtable_size*iparamnumber), -2, 0)
			index2 += 1
		od
		index1 += 1
	od

	; automation tables
	iautomationtablesize = 1024
	index = 0
	while (index < lenarray(giscss_fn_automation)) do
		giscss_fn_automation[index] = ftgen(0, 0, -iautomationtablesize, -7, 0)
		index += 1
	od
endop




; called from category instrument to get parameter
opcode scss_seqparam, i, i
	iparam xin
	icategoryid = p4
	itimeindex = p5
	xout table:i((iparam * giscss_st_paramnumber) + itimeindex, giscss_stfn_params[icategoryid][0])
endop




opcode seqtable_copyin, 0, iijjj
	icategoryid, islot, ifntrig, ifndur, ifnparam xin

	if (ifntrig != -1) then
		tableicopy giscss_stfn_trig[icategoryid][islot], ifntrig
	endif

	if (ifndur != -1) then
		tableicopy giscss_stfn_dur[icategoryid][islot], ifndur
	endif

	if (ifnparam != -1) then
		tableicopy giscss_stfn_params[icategoryid][islot], ifnparam
	endif
endop




opcode scss_st_swap, 0, ii
	icategoryid, islot xin
	
	; triggers
	tableicopy giscss_stfn_temp, giscss_stfn_trig[icategoryid][0]
	tableicopy giscss_stfn_trig[icategoryid][0], giscss_stfn_trig[icategoryid][islot]
	tableicopy giscss_stfn_trig[icategoryid][islot], giscss_stfn_temp

	; durations
	tableicopy giscss_stfn_temp, giscss_stfn_dur[icategoryid][0]
	tableicopy giscss_stfn_dur[icategoryid][0], giscss_stfn_dur[icategoryid][islot]
	tableicopy giscss_stfn_dur[icategoryid][islot], giscss_stfn_temp

	; parameters
	tableicopy giscss_stfn_param_temp, giscss_stfn_params[icategoryid][0]
	tableicopy giscss_stfn_params[icategoryid][0], giscss_stfn_params[icategoryid][islot]
	tableicopy giscss_stfn_params[icategoryid][islot], giscss_stfn_param_temp

endop



opcode scss_st_swapall, 0, p
	isrcslot xin
	index = 0
	while (index < lenarray(giscss_stfn_trig, 1)) do
		scss_st_swap(index, isrcslot)
		index += 1
	od
endop


; host call instrument
instr seqtable_swap
	imode = p4 ; 0 = all, 1 = specified category id
	isrcslot = p5 ; source index in giscss_stfn_src (eg 1 to 3)
	icategoryid = p6 ; category ID to replace by, if mode is 1

	if (imode == 0) then
		scss_st_swapall isrcslot
	else
		scss_st_swap icategoryid, isrcslot
	endif
	turnoff
endin






/*
	Add table numbers with names to a specified key in a target JSON object 

opcode seqtable_appendjson, 0, i
	iJsontarget xin

	iJson = jsoninit()
	index = 0
	while (index < lenarray(gSseq_names)) do
		jsoninsertval(iJson, gSseq_names[index], getrow(giscss_stfn_src, index))
		index += 1
	od
	
	jsoninsert(iJsontarget, "trigtables", iJson)
	jsondestroy(iJson)
endop
*/
#end