lua_opcall

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.

Syntaxe

lua_iopcall Sname, ...
lua_ikopcall Sname, ...
lua_iaopcall Sname, ...
lua_iopcall_off Sname, ...
lua_ikopcall_off Sname, ...
lua_iaopcall_off Sname, ...

Initialisation et Exécution

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.

Exemple

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 509.  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>


Voir aussi

lua_exec, lua_opdef.

Crédits

Par : Michael Gogins, 2011

Nouveau dans la version 5.13.2 de Csound.