tablera

tablera — Lecture séquentielle de tables.

Description

Cet opcode lit séquentiellement des tables vers une variable de taux-a. Il faut bien réfléchir à la manière de l'utiliser. Il a au moins deux applications principales, et assez différentes, qui sont discutées ci-dessous.

Syntaxe

ares tablera kfn, kstart, koff

Exécution

ares -- destination au taux-a de la lecture de ksmps valeurs depuis une table.

kfn -- numéro au taux-i ou au taux-k de la table à lire.

kstart -- où lire dans la table.

koff -- décalage au taux-i ou au taux-k dans la table. Intervalle illimité - voir les explications à la fin de la section.

Dans une application, tablera est apparié avec un tablewa, ou plusieurs opcodes tablera sont placés 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, les étapes suivantes se produiront lors d'appels répétés de l'opcode tablewa, en supposant que kstart est parti de 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 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.

[Attention] Plusieurs précautions

  • Le code de taux-k dans la boucle de traitement est réellement exécuté au taux-a, si bien que les fonctions dépendant du temps comme port et oscil travaillent plus vite que d'habitude - leur code s'attendant à fonctionner au taux-k.

  • Le système produira des effets indésirables si ksmps n'est pas compris dans la longueur de la table. Par exemple, une table de longueur 16 supportera de 1 à 16 échantillons, et donc le système fonctionnera avec ksmps compris entre 1 et 16.

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.

Exemples

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.

Voir aussi

tablewa