aboutsummaryrefslogtreecommitdiff
path: root/site/udo/cs81z.udo
blob: 37fd829cea134b6602878634ea7635ef2017c6f6 (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
197
198
199
200
201
202
203
204
205
206
207
208
#ifndef UDO_CS81Z
#define UDO_CS81Z ##


/*
		license required! GPL
*/

#include "wavetables.udo"
gitx_AR ftgen 0, 0, 32, -2, 0,647829,452377,322874,225473,160445,112801,80602,56434,40244,28328,20297,14152,10306,7237,5231,3687,2601,1765,1417,1000,822,572,440,400,380,310,278,165,135,130,125
gitx_D1R ftgen 0,0,32,-2, -1000,3116605,2179104,1547622,1086731,778176,542607,389089,272208,450000,137953,98004,69000,48235,34239,24524,36000,27000,13859,5774,4387,3254,2040,1573,955,925,575,475,200,125,1,1
gitx_D2R ftgen 0,0,32,-2, -1000,3101310,2168831,1551896,1084546,771475,541448,387275,270054,192173,134025,96252,67545,47431,34174,24459,17359,11987,8775,6000,4302,2885,2136,1415,1000,700,677,355,331,254,1,1
gitx_RR ftgen 0,0,16,-2,0,1559542,779813,386094,192749,97322,48481,24041,11808,6038,2957,1570,858,350,118,1
gitx_D1L ftgen 0,0,16,-2, 0,0.007943,0.01122,0.015849,0.022387,0.031623,0.044668,0.063096,0.089125,0.125893,0.177828,0.251189,0.358922,0.506991,0.716143,1
gitx_alg[][] init 13, 10  ; ALGORITHMIC MATRIX CONNECTIONS
gitx_alg fillarray 1,0,0,1,0,1,0, 0,0,0,
		1,0,0,1,1,0,0, 0,0,0,
		1,0,1,1,0,0,0, 0,0,0,
		1,1,0,0,0,1,0, 0,0,0,
		1,0,0,0,0,1,0, 0,1,0,
		0,0,1,0,1,1,0, 1,1,0,
		0,0,0,0,0,1,0, 1,1,0,
		0,0,0,0,0,0,0, 1,1,1,
		1,0,0,0,0,0,0, 0,0,0, ; only OP2 -> OP1
		0,0,0,0,0,0,0, 0,0,0,  ; only OP1
		1,0,0,0,1,0,0, 0,0,0,  ; OP4 -> OP2 -> OP1
		1,0,0,0,1,0,1, 0,0,0,  ; FD(OP4) -> OP2 -> OP1
		1,0,0,1,1,0,1, 0,0,0  ; LATELY

opcode _tx_envelope, k, iiiii
	iAR,iD1R,iD1L,iD2R,iRR xin
	iAR  table iAR,  gitx_AR
	iD1R table iD1R, gitx_D1R
	iD1L table iD1L, gitx_D1L
	iD2R table iD2R, gitx_D2R
	iRR  table iRR,  gitx_RR
	iAR /= 96000
	iD1R /= 96000
	iD2R /= 96000
	iRR /= 96000
	kRR = iRR
	
	xtratim iRR
	kRel release
	
	kEnv init 0
	kSta init 0
	
	kAdd transeg 0, 0.01, -8 ,1
	
	if kRel > 0 kgoto Release
	if kSta != 0 goto Next

	kEnv += 1/(iAR*kr)
	kEnv limit kEnv, 0, 1
	if kEnv != 1 goto Out
	kSta = 1

Next:
	if kSta != 1 goto Next2
	if iD1R >= 0 goto Next1
	goto Out
Next1:
	kEnv -= (1/(iD1R*kr))
	kEnv limit kEnv, iD1L, 1
	if kEnv !=  iD1L goto Out
	kSta = 2
Next2:
	if iD2R >= 0 goto Next3
	goto Out
Next3:
	kEnv -= 1/(iD2R*kr)
	kEnv limit kEnv, 0, iD1L
	goto Out
Release:
	kEnv -= 1/(kRR*kr)
	kEnv limit kEnv, 0, 1
Out:
	xout kEnv^6.6*kAdd			
endop


opcode _tx_lp, a, a
	;setksmps 1
	aL xin 
	aD0 init 0
	aD1 init 0
	iA1 = -0.5100490981424427
	iB0 = 1
	iB1 = 1
	aD2 = aD1
	aD1 = aD0
	aD0 = aL-aD1*iA1
	aout = aD0*iB0+aD1*iB1
	xout aout*0.24497545092877862
endop

opcode _tx_hp, a, a
	;setksmps 1
	aL xin 
	aD0 init 0
	aD1 init 0
	iA1 = -0.99869495948492626
	iB0 = 1
	iB1 = -1
	aD2 = aD1
	aD1 = aD0
	aD0 = aL-aD1*iA1
	aout=aD0*iB0+aD1*iB1
	xout aout*0.99934747974246307
endop

opcode _tx_filter, a, a
	ain xin
	xout _tx_lp(_tx_hp(ain))
endop


; instr tx_tbconstruct   ; TABLE CONSTRUCTOR from 81z-hold


opcode _tx_op, a, akiiiiiik
	;setksmps 1
	; iKVS - veloc sensivity level 0...7
	aMod, kCarFreq,i1,i2,i3,i4,i5, iWave,kamp xin
	aCarFreq = a(kCarFreq)
	kEnv _tx_envelope i1,i2,i3,i4,i5
	aPhase phasor aCarFreq
	aCar tablei aPhase+aMod, iWave, 1, 0, 1  
	xout aCar * kEnv * kamp
endop





opcode tx_synth, a, k[]k[]ii[]k[]k[]i[]i[]i[]i[]i[]
	kfreqs[], kamps[], ialgorithm, iwaves[], kindexmod[], kfdbk[], iattack[], id1rel[], id1lev[], id2rel[], id2lev[] xin

	aOP4 init 0

	; ===4 OP ====== 
	; OP parameters:
	; mod in, car freq X, att, D1 rel, D1 lev, D2 rel, rel, Wave,KVS
	aOP1 init 0
	ain4 = aOP4*gitx_alg[ialgorithm][6]*kfdbk[3]
								
	aOP4 _tx_op ain4,.5*kfreqs[0], iattack[0], id1rel[0], id1lev[0], id2rel[0], id2lev[0], iwaves[0],kamps[0] 

		
	aOP4 = aOP4*kindexmod[2]

	ain3 = aOP4*gitx_alg[ialgorithm][5]*kfdbk[2]
	aOP3 _tx_op ain3, kfreqs[1], iattack[1], id1rel[1], id1lev[1], id2rel[1], id2lev[1], iwaves[1],kamps[1]  ;0.996
	aOP3 = aOP3*kindexmod[1]
	   
	ain2 = (aOP3*gitx_alg[ialgorithm][3] + aOP4*gitx_alg[ialgorithm][4])*kfdbk[1]
	aOP2 _tx_op ain2,kfreqs[2], iattack[2], id1rel[2], id1lev[2], id2rel[2], id2lev[2], iwaves[2],kamps[2]
	aOP2 = aOP2*kindexmod[0]

	ain1 = (aOP2*gitx_alg[ialgorithm][0] + aOP3*gitx_alg[ialgorithm][1] + aOP4*gitx_alg[ialgorithm][2])*kfdbk[0]
	aOP1 _tx_op ain1,kfreqs[3], iattack[3], id1rel[3], id1lev[3], id2rel[3], id2lev[3], iwaves[3],kamps[3]

	a0 = aOP1 + aOP2*gitx_alg[ialgorithm][7] + aOP3*gitx_alg[ialgorithm][8] + aOP4*gitx_alg[ialgorithm][9]
	xout _tx_filter(a0)
endop

/*
instr 1
	if (gicount > 20) then
		gifreqs[] chordmidicpsbyindex int(random(0, lenarray(gSchords)-1)), int(random:i(55, 70))
		gicount = 0
	else
		gicount += 1
	endif
	imults[] fillarray 0.25, 0.5, 1, 1.5, 2

	ibasefreq = gifreqs[int(random(0, lenarray(gifreqs)-1))]
	iwaves[] fillarray wavetable_random(), wavetable_random(), wavetable_random(), wavetable_random()
	kindexmod[] fillarray random(0, 3), random(0, 3), random(0, 3)
	kfdbk[] fillarray random(0, 3), random(0, 3), random(0, 3), random(0, 3)
	kfreqs[] fillarray ibasefreq*imults[int(random(0, lenarray(imults)-1))], ibasefreq*imults[int(random(0, lenarray(imults)-1))], ibasefreq*imults[int(random(0, lenarray(imults)-1))], ibasefreq*imults[int(random(0, lenarray(imults)-1))]
	kamps[] fillarray random(0.5, 2), random(0.5, 2), random(0.5, 2), random(0.5, 2)
	iattack[] fillarray random(0, 31), random(0, 31), random(0, 31), random(0, 31)
	id1rel[] fillarray random(0, 31), random(0, 31), random(0, 31), random(0, 31)
	id1lev[] fillarray random(0, 31), random(0, 31), random(0, 31), random(0, 31)
	id2rel[] fillarray random(0, 15), random(0, 15), random(0, 15), random(0, 15)
	id2lev[] fillarray random(0, 15), random(0, 15), random(0, 15), random(0, 15)

	a1 tx_synth kfreqs, kamps, 4, iwaves, kindexmod, kfdbk, iattack, id1rel, id1lev, id2rel, id2lev
	
	kamp linseg 1, p3*0.8, 1, p3*0.2, 0
	kpan line random(0, 1), p3, random(0, 1)
	outs a1*kamp*0.1*kpan, a1*kamp*0.1*(1-kpan)
endin


instr sched
	krate random 0.2, 5
	k1 metro krate
	schedkwhen k1, 0, 0, 1, random:k(0, 2), random:k(1, 6)
endin
*.
*/


#end