ptablew

ptablew — Change le contenu de tables de fonction existantes de n'importe quelle taille.

Description

Cet opcode opère sur des tables de fonction existantes, en changeant leur contenu. ptablew permet d'écrire aux taux-k et -a, avec le numéro de table spécifié à l'initialisation. On peut utiliser ptablew avec un signal et des valeurs d'index de taux-i, mais les données spécifiées seront toujours écrites dans la table de fonction au taux-k, pas pendant la passe d'initialisation. Les combinaisons valides de types de variables sont données par la première lettre des noms de variable.

Syntaxe

ptablew asig, andx, ifn [, ixmode] [, ixoff] [, iwgmode]
ptablew isig, indx, ifn [, ixmode] [, ixoff] [, iwgmode]
ptablew ksig, kndx, ifn [, ixmode] [, ixoff] [, iwgmode]

Initialisation

asig, isig, ksig -- La valeur à écrire dans la table.

andx, indx, kndx -- Index dans la table, soit un nombre positif inférieur à la longueur de la table (ixmode = 0) ou dans l'intervalle allant de 0 à 1 (ixmode != 0)

ifn -- Numéro de la table. Doit être >= 1. Les nombres flottants sont arrondis à une valeur entière. Si le numéro de table n'est pas celui d'une table valide, ou si la table n'a pas encore été chargée (GEN01), il y aura une erreur et l'instrument sera désactivé.

ixmode (facultatif, 0 par défaut) -- mode d'indexation.

  • 0 = xndx et ixoff varient dans l'intervalle compris entre 0 et la longueur de la table.

  • !=0 = xndx et ixoff varient dans l'intervalle compris entre 0 et 1.

ixoff (facultatif, 0 par défaut) -- décalage de l'index.

  • 0 = l'index est contrôlé directement par xndx, l'indexation partant du début de la table.

  • !=0 = l'indexation part d'un endroit dans la table. Les valeurs doivent être positives et inférieures à la longueur de la table (ixmode = 0) ou inférieures à 1 (ixmode != 0).

iwgmode (facultatif, 0 par défaut) -- Mode cyclique et point de garde.

  • 0 = mode limite.

  • 1 = mode cyclique.

  • 2 = mode avec point de garde.

Exécution

Mode limite (0)

Limite l'index total (ndx + ixoff) entre 0 et le point de garde. Pour une table de longueur 5, cela signifie que l'on peut écrire à la position 4 (le point de garde). Un index total négatif écrit à la position 0.

Mode cyclique (1)

Replie l'index total entre les positions 0 et E, où E est inférieur à la longueur de la table d'une unité. Par exemple, si le repliement se fait dans l'intervalle compris entre 0 et 3, un index total de 6 écrira à la position 2.

Mode point de garde (2)

Le point de garde est rempli en même temps que la postion 0, avec la même valeur.

Ceci facilite l'écriture dans les tables que l'on doit lire avec interpolation pour produire des formes d'ondes périodiques lisses. De plus, avant son utilisation, l'index total est incrémenté de la moitié de la distance entre deux positions adjacentes, avant d'être arrondi à la valeur entière de la position dans la table.

Normallement (igwmode = 0 ou 1) pour une table de longueur 5, dont les positions de 0 à 3 sont dans la table principale et dont la position 4 est le point de garde, un index total compris entre 0 et 0.999 écrira à la position 0. ("0.999" signifiant juste en dessous de 1.0). S'il est compris entre 1.0 et 1.999, il écrira à la position 1, etc. Tous les index totaux entre 0 et 4.999 (igwmode = 0) ou 3.999 (igwmode = 1) suivent le même schéma. igwmode = 0 permet d'écrire dans les positions 0 à 4, avec la possibilité d'avoir dans le point de garde (4) une valeur différente de celle qui est à la position 0.

Avec une table de longueur 5 et iwgmode = 2, lorsque l'index total est compris entre 0 et 0.499, on écrit dans les positions 0 à 4. L'intervalle compris entre 0.5 et 1.499 écrit dans la position 1, etc. De 3.5 à 4 on écrit aussi dans les positions 0 et 4.

De cette manière, l'opération d'écriture est au plus proche des résultats de la lecture avec interpolation. Le mode point de garde ne doit être utilisé qu'avec des tables ayant un point de garde.

Guardpoint mode is accomplished by adding 0.5 to the total index, rounding to the next lowest integer, wrapping it modulo the factor of two which is one less than the table length, writing the table (locations 0 to 3 in our example) and then writing to the guard point if index = 0.

ptablew n'a pas de valeur de sortie. Les trois derniers paramètres sont facultatifs et valent 0 par défaut.

Précaution avec les numéros de tables de taux-k

Au taux-k et au taux-a, si un numéro de table < 1 est donné, ou si le numéro de table pointe sur une table non-existante ou sur une table ayant un longueur nulle (à charger ultérieurement depuis un fichier), une erreur est générée et l'instrument est désactivé. Il faut initialiser kfn et afn au taux approprié en utilisant init. Si l'on tente de mettre une valeur de taux-i dans kfn ou dans afn, il y aura une erreur.

[Avertissement] Avertissement

Noter que ptablew est toujours un opcode de taux-k. Cela signigie que même sa version de taux-i est exécutée au taux-k et elle écrit la valeur de la variable de taux-i. Pour cette raison, le code suivant ne fonctionnera pas comme attendu :

<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
giFt ftgen  1, 0, 8, 2, 0
instr 1
indx = 0
     ptablew 10, indx, giFt
ival tab_i  indx, giFt
     print  ival
endin
</CsInstruments>
<CsScore>
i 1 0 1
</CsScore>
</CsoundSynthesizer>

Bien que l'on s'attende à ce que ce programme affiche un 10 sur la console, il affichera 0, car tab_i lira la valeur à l'initialisation de la note, avant la première passe d'exécution, quand ptablew écrit sa valeur.

Voir aussi

tableiw, tablewkt

Crédits

Auteur : John ffitch d'après Robin Whittle
Février 2012