/* 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:i(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:k(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:i(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:k(ifn, kdx1, kdx2, kdx3), ifn) endop