pycall Opcodes

pycall — Invoque l'objet Python appelable spécifié au taux-k ou au taux-i (suffixe i), en lui passant les arguments donnés. L'appel est exécuté dans l'environnement global et le résultat (la valeur retournée) est copié dans les variables de Csound spécifiées en sortie.

Syntaxe

                                        pycall   "callable", karg1, ...
kresult                                 pycall1  "callable", karg1, ...
kresult1, kresult2                      pycall2  "callable", karg1, ...
kr1, kr2, kr3                           pycall3  "callable", karg1, ...
kr1, kr2, kr3, kr4                      pycall4  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5                 pycall5  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6            pycall6  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7       pycall7  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7, kr8  pycall8  "callable", karg1, ...
                                        pycallt   ktrigger, "callable", karg1, ...
kresult                                 pycall1t  ktrigger, "callable", karg1, ...
kresult1, kresult2                      pycall2t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3                           pycall3t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4                      pycall4t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5                 pycall5t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6            pycall6t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7       pycall7t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7, kr8  pycall8t  ktrigger, "callable", karg1, ...
                                        pycalli   "callable", karg1, ...
iresult                                 pycall1i  "callable", iarg1, ...
iresult1, iresult2                      pycall2i  "callable", iarg1, ...
ir1, ir2, ir3                           pycall3i  "callable", iarg1, ...
ir1, ir2, ir3, ir4                      pycall4i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5                 pycall5i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5, ir6            pycall6i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5, ir6, ir7       pycall7i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5, ir6, ir7, ir8  pycall8i  "callable", iarg1, ...
pycalln   "callable", nresults, kresult1, ..., kresultn, karg1, ...
pycallni  "callable", nresults, iresult1, ..., iresultn, iarg1,  ...
                                        pylcall   "callable", karg1, ...
kresult                                 pylcall1  "callable", karg1, ...
kresult1, kresult2                      pylcall2  "callable", karg1, ...
kr1, kr2, kr3                           pylcall3  "callable", karg1, ...
kr1, kr2, kr3, kr4                      pylcall4  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5                 pylcall5  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6            pylcall6  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7       pylcall7  "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7, kr8  pylcall8   "callable", karg1, ...
                                        pylcallt   ktrigger, "callable", karg1, ...
kresult                                 pylcall1t  ktrigger, "callable", karg1, ...
kresult1, kresult2                      pylcall2t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3                           pylcall3t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4                      pylcall4t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5                 pylcall5t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6            pylcall6t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7       pylcall7t  ktrigger, "callable", karg1, ...
kr1, kr2, kr3, kr4, kr5, kr6, kr7, kr8  pylcall8t  ktrigger, "callable", karg1, ...
                                        pylcalli   "callable", karg1, ...
iresult                                 pylcall1i  "callable", iarg1, ...
iresult1, iresult2                      pylcall2i  "callable", iarg1, ...
ir1, ir2, ir3                           pylcall3i  "callable", iarg1, ...
ir1, ir2, ir3, ir4                      pylcall4i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5                 pylcall5i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5, ir6            pylcall6i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5, ir6, ir7       pylcall7i  "callable", iarg1, ...
ir1, ir2, ir3, ir4, ir5, ir6, ir7, ir8  pylcall8i  "callable", iarg1, ...
pylcalln   "callable", nresults, kresult1, ..., kresultn, karg1, ...
pylcallni  "callable", nresults, iresult1, ..., iresultn, iarg1, ...

Description

Cette famille d'opcodes appelle l'objet Python appelable spécifié au taux-k ou au taux-i (suffixe i), en lui passant les arguments donnés. L'appel est exécuté dans l'environnement global et le résultat (la valeur retournée) est copié dans les variables de Csound spécifiées en sortie.

Ils passent n'importe quel nombre de paramètres qui sont transformés en nombres en virgule flottante dans l'interpréteur Python.

Les opcodes pycall/pycalli, pycall1/pycall1i ... pycall8/pycall8i permettent d'avoir de 0 à 8 résultats en fonction de leur préfixe numérique (0 est omis).

Les opcodes pycalln/pycallni peuvent avoir n'importe quel nombre de résultats : le nom de l'objet appelable est suivi du nombre d'arguments en sortie, puis viennent la liste des variables de sortie de Csound et la liste des paramètres à transmettre.

La valeur retournée par l'objet appelable doit être None pour pycall ou pycalli, un nombre en virgule flottante pour pycall1i ou pycall1i et un tuple (de taille appropriée) de nombres en virgule flottante pour les opcodes pycall2/pycall2i ... pycall8/pycall8i et pycalln/pycallni.

Exemples

Exemple 698. Appel d'une fonction C ou Python

En supposant qu'au préalable nous avons défini ou importé une fonction nommée get_number_from_pool comme ceci :

from random import random, choice

# un ensemble de 100 nombres
pool = [i ** 1.3 for i in range(100)]

def get_number_from_pool(n, p):
    # substituer un nouveau nombre à un ancien nombre ?
    if random() < p:
        i = choice(range(len(pool)))
        pool[i] = n

    # retourner un nombre pris aléatoirement dans l'ensemble
    return choice(pool)

le code d'orchestre suivant

k2   pycall1 "get_number_from_pool", k1, p6

donnera à k2 une valeur extraite aléatoirement d'un ensemble de nombres évoluant dans le temps. On peut passer de nouveaux éléments à l'ensemble et contrôler le taux de changement depuis l'orchestre.


Exemple 699. Appel d'un objet fonctionnel

Une implémentation plus générique de l'exemple précédent utilise un objet fonctionnel simple :

from random import random, choice

class GetNumberFromPool:
    def __init__(self, e, begin=0, end=100, step=1):
        self.pool = [i ** e for i in range(begin, end, step)]

    def __call__(self, n, p):
        # substituer un nouveau nombre à un ancien nombre ?
        if random() < p:
            i = choice(range(len(pool)))
            pool[i] = n

        # retourner un nombre pris aléatoirement dans l'ensemble
        return choice(pool)

get_number_from_pool1 = GetNumberFromPool(1.3)
get_number_from_pool2 = GetNumberFromPool(1.5, 50, 250, 2)

Alors, le code d'orchestre suivant :

k2   pycall1 "get_number_from_pool1", k1, p6
k4   pycall1 "get_number_from_pool2", k3, p7

donnera à k2 et à k4 des valeurs prises aléatoirement dans l'ensemble de nombres évoluant dans le temps. On peut passer de nouveaux éléments à l'ensemble (ici k1 et k3 et contrôler le taux de changement (ici p6 et p7) depuis l'orchestre.

Comme on peut le voir, il est possible de particulariser l'initialisation de l'ensemble ou de créer plusieurs ensembles.


Crédits

Copyright (c) 2002 Maurizio Umberto Puxeddu. Tous droits réservés. Certaines parties, copyright (c) 2004 et 2005 Michael Gogins. Ce document a été mis à jour le 25 juillet 2004 et le 1er février 2005 par Michael Gogins.