tablewa — Ecrit dans une table à des positions adjacentes.
Cet opcode écrit dans une table à des positions adjacentes depuis un signal de taux-a. Un peu de réflexion est nécessaire avant de l'utiliser. Il a au moins deux applications principales et assez différentes discutées ci-dessous.
kstart -- Position de lecture ou d'écriture dans la table.
kfn -- numéro de taux-i ou -k de la table à lire ou écrire.
asig -- signal de taux-a dont viennent les valeurs à écrire dans la table.
koff -- décalage de taux-i ou k dans la table. Intervalle illimité - voir les explications à la fin de cette section.
Dans une application, on utilise un ou plusieurs opcodes tablera avant un tablewa -- tous partageant la même variable kstart.
Ceux-ci lisent depuis ou écrivent dans des positions adjacentes d'une table au taux audio, avec ksmps flottants écrits et lu à chaque cycle.
tablera commence à lire à la position kstart. tablewa commence à écrire à la position kstart, et continue à écrire à kstart le numéro de la position étant incrémenté d'une unité. (Noter que pour tablewa, kstart est à la fois une variable d'entrée et de sortie). Si l'index d'écriture atteint la fin de la table, aucune écriture ultérieure n'a lieu et zéro est écrit dans kstart.
Par exemple, si la longueur de la table est 16 (positions 0 à 15) et que ksmps vaut 5, alors les étapes suivantes se produiront à chaque appel de l'opcode tablewa, en supposant que kstart est parti 0.
Numéro de l'appel | kstart initial | kstart final | Positions écrites |
---|---|---|---|
1 | 0 | 5 | 0 1 2 3 4 |
2 | 5 | 10 | 5 6 7 8 9 |
3 | 10 | 15 | 10 11 12 13 14 |
4 | 15 | 0 | 15 |
Ceci facilite le traitement des données de table avec du code d'orchestre standard au taux-a entre les opcodes tablera et tablewa. Il est ainsi permis d'utiliser tous les opérateurs de taux-k de Csound (avec précaution) sur des variables de taux-a, ce qui ne serait autrement possible qu'avec ksmps = 1, downsamp et upsamp.
Plusieurs précautions | |
---|---|
|
Ces deux opcodes génèrent une erreur et désactivent l'instrument si une table de longueur < ksmps est choisie. Il y aura également une erreur si kstart est inférieur à zéro ou supérieur à la position la plus haute dans la table - si kstart = longueur de la table.
kstart est supposé contenir des valeurs entières comprises entre 0 et (longueur de la table - 1). Des valeurs fractionnaires entre celles-ci n'affecteront pas l'opération mais ne produiront rien de spécial.
Ces opcodes sont sans interpolation et les paramètres kstart et koff sont toujours dans l'intervalle 0 à (longueur de la table - 1) - pas 0 à 1 comme c'est possible dans d'autres opcodes de lecture/écriture de table. koff peut se trouver en dehors de cet intervalle mais il y est ramené par le ET final.
Ces opcodes sont en permanence en mode cyclique. Quand koff vaut 0, aucun repliement n'est nécessaire, car l'indice kstart++ se trouve toujours dans l'intervalle normal de la table. koff différent de 0 peut conduire à un repliement.
Le décalage n'affecte pas le nombre de cycles de lecture/écriture exécutés, ou la valeur écrite dans kstart par tablewa.
Ces opcodes ne peuvent pas lire ou écrire le point de garde. Utiliser tablegpw pour écrire le point de garde après les manipulations effectuées avec tablewa.
kstart = 0 lab1: atemp tablera ktabsource, kstart, 0 ; Lit 5 valeurs de la table dans une ; variable de taux-a. atemp = log(atemp) ; Traite les valeurs en utilisant ; du code de taux-a. kstart tablewa ktabdest, atemp, 0 ; Ecriture dans la table if ktemp 0 goto lab1 ; Boucle jusqu'à ce que toute les positions ; de la table aient été traitées.
L'exemple ci-dessus montre une boucle de traitement qui s'exécute à chaque cycle-k, lisant chaque position dans la table ktabsource, et écrivant le logarithme de ces valeurs dans les mêmes positions de la table ktabdest.
Cela permet de manipuler en une fois, avec du code de taux-a, des tables entières, des parties de tables (avec décalages et différentes boucles de contrôle) et des données provenant de plusieurs tables, et de les écrire vers une autre (ou la même) table. C'est un peu compliqué mais c'est plus rapide que de le faire avec du code de lecture et d'écriture de taux-k.
Une autre application :
kzero = 0 kloop = 0 kzero tablewa 23, asignal, 0 ; écrit ksmps échantillons de taux-a ; dans les positions 0 à (ksmps -1) de la table 23. lab1: ktemp table kloop, 23 ; Commence une boucle de ksmps itérations, ; dans laquelle chaque passage traite une des [ Du code pour manipuler ] ; valeurs de la table 23 avec du code de l'orchestre [ la valeur de ktemp. ] ; de taux-k. tablew ktemp, kloop, 23 ; Ecrit la valeur traitée dans la table. kloop = kloop + 1 ; Incrémente kloop, qui est à la fois ; le pointeur dans la table et le compteur de if kloop < ksmps goto lab1 ; la boucle. Continue la boucle jusqu'à ce que ; toutes les valeurs dans la table aient été traitées. asignal tablera 23, 0, 0 ; Copie le contenu de la table ; dans une variable de taux-a.
koff -- C'est un décalage qui est ajouté à la somme de kstart et de l'indice interne variable qui parcourt la table. Le résultat subit ensuite un ET logique avec le masque de longueur (000 0111 pour une table de longueur 8 - ou 9 avec un point de garde) et l'indice résultant est utilisé pour lire ou écrire dans la table. koff peut avoir n'importe quelle valeur. Il est converti en entier long au moyen de la fonction ANSI floor() ; ainsi -4.3 devient -5. C'est le comportement désiré pour des décalages variant de part et d'autre de zéro.
Idéalement ce devrait être une variable facultative, valant 0 par défaut. Cependant, avec le code de lecture de l'orchestre Csound existant, de tels paramètres par défaut ne peuvent être que de taux-i. Nous voulons ici un paramètre de taux-k et donc, nous ne pouvons pas avoir de valeur par défaut.