tableiw

tableiw — Change le contenu de tables de fonction existantes.

Description

Cet opcode opère sur des tables de fonction existantes en changeant leur contenu. tableiw est utilisé quand toutes les entrées sont des variables de taux-i ou des constantes et que l'on veut seulement l'exécuter à l'initialisation de l'instrument. Les combinaisons valides des types de variable sont indiquées par la première lettre des noms de variable.

Syntaxe

tableiw isig, indx, ifn [, ixmode] [, ixoff] [, iwgmode]

Initialisation

isig -- Valeur d'entrée à écrire dans la table.

indx -- Indice dans la table, un nombre positif compris entre 0 et la longueur de la table (ixmode = 0) ou entre 0 et 1 (ixmode différent de 0).

ifn -- Numéro de la table. Doit être >= 1. Les nombres flottants sont arrondis à l'entier inférieur. Si un numéro de table ne pointe pas vers une table valide, ou si la table n'a pas encore été chargée (GEN01) une erreur est générée et l'instrument est désactivé.

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

  • 0 = indx et ixoff sont compris entre 0 et la longueur de la table.

  • différent de 0 = indx et ixoff sont compris entre 0 et 1.

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

  • 0 = l'indice résultant est contrôlé directement par indx, l'indexation commençant depuis le début de la table.

  • Différent de 0 = l'indexation démarre dans la table. La valeur doit être positive et inférieure à la longueur de la table (ixmode = 0) ou inférieure à 1 (ixmode différent de 0).

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

  • 0 = mode limite.

  • 1 = mode cyclique.

  • 2 = mode point de garde.

Exécution

Mode limite (0)

Limite l'indice résultant (indx + ixoff) entre 0 et le point de garde. Pour une table de longueur 5, cela signigie que les positions allant de 0 à 3 et la position 4 (le point de garde) peuvent être écrites. Un indice résultant négatif provoque l'écriture en position 0.

Mode cyclique (1)

Parcours cyclique de l'indice résultant dans les positions 0 à E, où E vaut soit la longueur de la table moins un, soit le facteur de 2 qui est égal à la longueur de la table moins un. Par exemple, un parcours cyclique entre 0 et 3, si bien que l'indice 6 signifie une écriture dans la position 2.

Mode point de garde (2)

Le point de garde est écrit en même temps que la position 0 avec la même valeur.

Facilite l'écriture dans des tables prévues pour être lues avec interpolation pour produire des formes d'onde cycliques sans discontinuité. De plus, avant son utilisation, l'indice résultant est augmenté de la moitié de la distance entre une position et la suivante, avant d'être arrondi à l'adresse entière inférieure d'une position dans la table.

Normalement (iwgmode = 0 ou 1), pour une table de longueur 5, qui comprend les positions 0 à 3 en partie principale et la position 4 comme point de garde, un indice résultant compris entre 0 et 0.999 provoquera une écriture dans la position 0. ("0.999" signifie juste inférieur à 1.0), entre 1.0 et 1.999, l'écriture se fera dans la position 1, etc. La même interprétation a lieu pour les indices résultants compris entre 0 et 4.999 (igwmode = 0) ou 3.999 (igwmode = 1). igwmode = 0 permet l'écriture dans les positions 0 à 4, avec la possibilité d'avoir dans le point de garde (4) une valeur différente de celle de la position 0.

Avec une table de longueur 5 et iwgmode = 2, quand l'indice résultant est compris entre 0 et 0.499, l'écriture se fera dans les positions 0 et 4. S'il est compris entre 0.5 et 1.499, l'écriture se fera dans la position 1, etc. S'il est compris entre 3.5 et 4.0, l'écriture se fera également dans les positions 0 et 4.

Ainsi, l'écriture s'approche le plus possible des résultats de la lecture avec interpolation. Le mode point de garde ne doit être utilisé qu'avec des tables qui ont un point de garde.

Le mode point de garde se fait en ajoutant 0.5 à l'indice résultant, en l'arrondissant à l'entier inférieur le plus proche, puis en le réduisant modulo le facteur de deux égal à la longueur de la table moins un, enfin en écrivant dans la table (positions 0 à 3 dans notre exemple) et dans le point de garde si l'indice vaut 0.

Exemples

Voici un exemple de l'opcode tableiw. Il utilise le fichier tableiw.csd.

Exemple 874. Exemple de l'opcode tableiw.

Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation des options de la ligne de commande.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
-odac     ;;;realtime audio out
;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o tableiw.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

sr = 44100
ksmps = 32
nchnls = 2
0dbfs  = 1

seed 0	;generate new values every time the instr is played

instr 1

ifn = p4
isize = p5
ithresh = 0.5
    
itemp ftgen ifn, 0, isize, 21, 2

iwrite_value = 0
i_index = 0
    
loop_start:
    iread_value tablei i_index, ifn
    
    if iread_value > ithresh then
         iwrite_value = 1
    else
         iwrite_value = -1
    endif
tableiw iwrite_value, i_index, ifn
loop_lt i_index, 1, isize, loop_start        
    turnoff

endin

instr 2

ifn = p4
isize = ftlen(ifn)    
prints "Index\tValue\n"
    
i_index = 0
loop_start:
    ivalue tablei i_index, ifn
    prints "%d:\t%f\n", i_index, ivalue

  loop_lt i_index, 1, isize, loop_start		;read table 1 with our index

aout oscili .5, 100, ifn			;use table to play the polypulse
     outs   aout, aout

endin
</CsInstruments>
<CsScore>
i 1 0 1 100 16
i 2 0 2 100
e
</CsScore>
</CsoundSynthesizer>


Voir aussi

tablew, tablewkt

Plus d'information sur cet opcode : http://www.csounds.com/journal/issue12/genInstruments.html , écrit par Jacob Joaquin.

Crédits

Auteur : Robin Whittle
Australie
Mai 1997

Nouveau dans la version 3.47

Mise à jour en août 2002, grâce à Abram Hindle qui a indiqué le syntaxe correcte.