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
|
/*
Virtual 3D array behaviour
This file is part of the SONICS UDO collection by Richard Knight 2024
License: GPL-2.0-or-later
http://1bpm.net
*/
/*
Initialise 3D array
ifn arr3d_init idim1, idim2, idim3
ifn resulting ftable
idim1 size of dimension 1
idim2 size of dimension 2
idim3 size of dimension 3
*/
opcode arr3d_init, i, iii
idim1, idim2, idim3 xin
xout ftgen(0, 0, -((idim1 * idim2 * idim3) + 3), -2, idim1, idim2, idim3)
endop
/*
Obtain 1D index from 3D reference
index arr3d_index ifn, idx1, idx2, idx3
index resulting index
idx1 dimension 1 index
idx2 dimension 2 index
idx3 dimension 3 index
*/
opcode arr3d_index, i, iiii
ifn, idx1, idx2, idx3 xin
i1len tab_i 0, ifn
i2len tab_i 1, ifn
i3len tab_i 2, ifn
;xout ((i1len * idx2 * idx3) + (i2len * idx3) + i3len) + 3
xout ((idx1 * i2len * i3len) + (idx2 * i3len) + idx3) + 3
endop
/*
Obtain 1D index from 3D reference
kindex arr3d_index ifn, kdx1, kdx2, kdx3
kindex resulting index
kdx1 dimension 1 index
kdx2 dimension 2 index
kdx3 dimension 3 index
*/
opcode arr3d_index, k, ikkk
ifn, kdx1, kdx2, kdx3 xin
k1len tab 0, ifn
k2len tab 1, ifn
k3len tab 2, ifn
;xout ((k1len * kdx2 * kdx3) + (k2len * kdx3) + k3len) + 3
xout ((kdx1 * k2len * k3len) + (kdx2 * k3len) + kdx3) + 3
endop
/*
Set 3D array value
arr3d_set ifn, idx1, idx2, idx3, ivalue
ifn ftable created with arr3d_init
idx1 dimension 1 index
idx2 dimension 2 index
idx3 dimension 3 index
ivalue value to set
*/
opcode arr3d_set, 0, iiiii
ifn, idx1, idx2, idx3, ivalue xin
tabw_i ivalue, arr3d_index(ifn, idx1, idx2, idx3), ifn
endop
/*
Set 3D array value
arr3d_set ifn, kdx1, kdx2, kdx3, kvalue
ifn ftable created with arr3d_init
kdx1 dimension 1 index
kdx2 dimension 2 index
kdx3 dimension 3 index
kvalue value to set
*/
opcode arr3d_set, 0, ikkkk
ifn, kdx1, kdx2, kdx3, kvalue xin
tabw kvalue, arr3d_index(ifn, kdx1, kdx2, kdx3), ifn
endop
/*
Get 3D array value
ivalue arr3d_get ifn, idx1, idx2, idx3
ivalue returned value
ifn ftable created with arr3d_init
idx1 dimension 1 index
idx2 dimension 2 index
idx3 dimension 3 index
*/
opcode arr3d_get, i, iiii
ifn, idx1, idx2, idx3 xin
xout tab_i(arr3d_index(ifn, idx1, idx2, idx3), ifn)
endop
/*
Get 3D array value
kvalue arr3d_get ifn, kdx1, kdx2, kdx3
kvalue returned value
ifn ftable created with arr3d_init
kdx1 dimension 1 index
kdx2 dimension 2 index
kdx3 dimension 3 index
*/
opcode arr3d_get, k, ikkk
ifn, kdx1, kdx2, kdx3 xin
xout tab:k(arr3d_index(ifn, kdx1, kdx2, kdx3), ifn)
endop
|