lua_opcall — Appelle un opcode Lua. N'importe quel nombre d'argument d'entrée et/ou de sortie peuvent être passés. Tous les arguments doivent être écrits du côté droit. Les sorties sont retournées dans les arguments.
lua_iopcall Sname, ...
lua_ikopcall Sname, ...
lua_iaopcall Sname, ...
lua_iopcall_off Sname, ...
lua_ikopcall_off Sname, ...
lua_iaopcall_off Sname, ...
Sname -- Le nom de l'opcode.
... -- Une liste arbitraire de n'importe quel nombre
d'arguments de sortie et d'entrée, de n'importe quel type. Le nombre,
l'ordre et les types de ces arguments doivent se conformer au cdef de la
structure des arguments qui est déclarée dans l'opcode
lua_opdef
correspondant.
lua_iopcall
appelle un opcode Lua au taux-i. Il faut
que opname_init
soit défini en Lua.
lua_ikopcall
appelle un opcode Lua au taux-i et au taux-k.
Il faut que opname_init
et
opname_kontrol
soient définis en Lua.
lua_iaopcall
appelle un opcode Lua au taux-i et au taux-a.
Il faut que opname_init
et
opname_audio
soient définis en Lua.
lua_iopcall_off
appelle un opcode Lua de fin de note au
taux-i. Il faut que opname_init
et
opname_noteoff
soient définis en Lua.
lua_ikopcall_off
appelle un opcode Lua de fin de note au
taux-i et au taux-k. Il faut que opname_init
,
opname_kontrol
et opname_noteoff
soient définis en Lua.
lua_iaopcall_off
appelle un opcode Lua de fin de note au
taux-i et au taux-a. Il faut que opname_init
,
opname_audio
et opname_noteoff
soient définis en Lua.
Le code Lua accède aux éléments des arguments comme suit (les pointeurs vers les scalaires et vers les tableaux sont déréférencés par l'opérateur Lua d'accès aux tableaux) :
ffi.cdef(' struct arguments_t { double *a_out, double *i_in, double *i_txt, double *f_sig };'); local arguments = ffi.cast("struct arguments_t *", carguments_lightuserdata) for i = 0, ksmps -1 do begin carguments.a_out[i] = carguments.i_in[0] * 3 end end
La variante "off" des opcodes programme toujours un évènement de fin de note qui est appelé lorsque l'instance de l'instrument est retirée de la liste active, et qui peut être utilisé pour libérer des ressources dont on a plus besoin, reprogrammer l'instrument pour restituer une queue de réverbération, etc.
Voici un exemple d'opcode Lua, montrant comment transmettre dans les deux sens des chaînes de caractères entre le code des opcodes Lua et celui de l'orchestre de Csound. L'exemple utilise le fichier luaopcode.csd.
Exemple 448. Exemple d'opcode Lua.
<CsoundSynthesizer> <CsInstruments> lua_opdef "luatest", {{ local ffi = require("ffi") local string = require("string") local csoundLibrary = ffi.load('csound64.dll.5.2') ffi.cdef[[ int csoundGetKsmps(void *); double csoundGetSr(void *); struct luatest_arguments {double *out; double *stringout; char *stringin; double *in1; double *in2; double sr; int ksmps; }; ]] function luatest_init(csound, opcode, carguments) local arguments = ffi.cast("struct luatest_arguments *", carguments) arguments.sr = csoundLibrary.csoundGetSr(csound) print(string.format('stringin: %s', ffi.string(arguments.stringin))) print(string.format('sr: %f', arguments.sr)) arguments.ksmps = csoundLibrary.csoundGetKsmps(csound) print(string.format('ksmps: %d', arguments.ksmps)) arguments.out[0] = arguments.in1[0] * arguments.in2[0] ffi.copy(arguments.stringout, 'Hello, world!') return 0 end function luatest_kontrol(csound, opcode, carguments) local arguments = ffi.cast("struct luatest_arguments *", carguments) arguments.out[0] = arguments.in1[0] * arguments.in2[0] return 0 end function luatest_noteoff(csound, opcode, carguments) local arguments = ffi.cast("struct luatest_arguments *", carguments) arguments.out[0] = arguments.in1[0] * arguments.in2[0] print('off') return 0 end }} instr 1 iresult = 0 Stringin = "stringin" Stringout = "stringout" lua_iopcall "luatest", iresult, Stringout, Stringin, p2, p3 prints Stringout endin instr 2 iresult = 0 Stringin = "stringin" Stringout = "initial value" lua_iopcall_off "luatest", iresult, Stringout, Stringin, p2, p3 print iresult prints Stringout endin </CsInstruments> <CsScore> i 1 1 2 i 2 2 2 i 1 3 2 e </CsScore> </CsoundSynthesizer>