lua_opcall
Précédent | Opcodes et opérateurs de l'orchestre | Suivant

## 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 481. 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.

Précédent | Niveau supérieur | Suivant
lua_opdef | Sommaire | mac