hvs2
Précédent | Opcodes et opérateurs de l'orchestre | Suivant

## hvs2

hvs2 — Synthèse Hyper Vectorielle (SHV) à deux dimensions contrôlée par des variables de taux-k mises à jour en externe.

## Description

hvs2 permet la synthèse Hyper Vectorielle (SHV) à deux dimensions contrôlée par des variables de taux-k mises à jour en externe.

## Syntaxe

    hvs2 kx, ky, inumParms, inumPointsX, inumPointsY, iOutTab, iPositionsTab, iSnapTab [, iConfigTab]

## Initialisation

inumParms - nombre de paramètres contrôlés par la SHV. Chaque instantané de la SHV est composé de inumParms éléments.

inumPointsX, inumPointsY - nombre de points dont est composée chaque dimension du cube de la SHV (ou du carré dans le cas de la SHV à deux dimensions, ou du segment de droite dans le cas de la SHV à une dimension).

iOutTab - numéro de la table recevant l'ensemble des valeurs instantanées des paramètres de sortie de la SHV. Le nombre total de paramètres est défini par l'argument inumParms.

iPositionsTab – une table remplie avec les positions individuelles des instantanés dans la matrice de SHV (voir ci-dessous pour plur d'information).

iSnapTab – une table remplie avec tous les instantanés. Chaque instantané se compose d'un ensemble de valeurs des paramètres. Le nombre d'éléments contenus dans chaque instantané est spécifié par l'argument inumParms. L'ensemble des éléments de chaque instantané suit (et est adjacent à) l'instantané précédent dans la table. Ainsi la taille totale de cette table doit être >= à inumParms multiplié par le nombre d'instantanés que l'on veut mémoriser pour la SVH.

iConfigTab – (facultatif) une table contenant le comportement de la SHV pour chaque paramètre. Si iConfigTab vaut zéro (par défaut), cet argument est ignoré, ce qui signifie que chaque paramètre est interpolé linéairement par la SHV. Si iConfigTab est différent de zéro, il doit faire référence à une table existante dont le contenu fait référence à son tour à un genre particulier d'interpolation. Dans cette table, une valeur de -1 indique que le paramètre correspondant reste inchangé (ignoré) par la SHV ; une valeur de zéro indique que le paramètre correspondant est traité par interpolation linéaire ; tout autre valeur doit être un nombre entier indiquant une table existante remplie avec une forme qui détermine le genre d'interpolation spéciale à utiliser (interpolation basée sur une table).

## Exécution

kx, ky - ce sont des variables modifiées de l'extérieur, qui contrôlent le mouvement du pointeur dans la matrice cubique de SHV (ou carrée ou en ligne dans le cas où les matrices de SHV ont moins de 3 dimensions). Les valeurs de ces arguments d'entrée doivent être comprises entre 0 et 1.

La Synthèse Hyper Vectorielle est une technique qui permet de contrôler un ensemble immense de paramètres en utilisant une approche simple et globale. Les concepts clé de la SHV sont :

L'ensemble des paramètres de SHV, dont le nombre est fixé et défini par l'argument inumParms. Durant l'exécution de la SHV, tous ces paramètres sont variables et peuvent être appliqués à n'importe quelle technique de synthèse sonore, de même qu'à n'importe quel contrôle global de composition algorithmique ou de tout autre niveau. L'utilisateur doit définir au préalable plusieurs ensembles de valeurs fixes pour chaque paramètre de la SHV, chaque ensemble correspondant à une configuration de synthèse déterminée. Chaque ensemble de valeurs est appelé un instantané et peut être considéré comme les coordonnées d'un saut dans un espace multi-dimensionnel. La SHV consiste à faire évoluer un point dans cet espace multi-dimensionnel (en utilisant un pointeur de mouvement spécial, voie ci-dessous), selon les points et les limites définis par les instantanés. On peut fixer le nombre de paramètres de la SHV (chaque paramètre suivant une dimension de l'espace multi-dimensionnel), même un nombre très important, la limite ne dépendant que de la puissance de calcul (et de la mémoire) de votre ordinateur et de la complexité de la synthèse sonore utilisée.

Le cube de SHV (ou le carré ou le segment). C'est la matrice (à 3, 2 ou 1 dimensions, en fonction de l'opcode hvs utilisé) des points d'appui ou pivots de la SHV. Le nombre total de points pivots dépend de la valeur des arguments inumPointsX, inumPointsY et inumPointsZ. Dans le cas d'une matrice de SHV à 3 dimensions on peut définir, par exemple, 3 points pour la dimension X, 5 pour la dimension Y et 2 pour la dimension Z. Dans ce cas le nombre total de points pivots est 3 * 5 * 2 = 30. Avec cet ensemble de points pivots, le cube est divisé en zones cubiques plus petites, chacune étant délimitée par huit points. Chaque point est numéroté. La numérotation de ces points se fait de la manière suivante : numéro zéro pour le premier point, numéro un pour le second, et ainsi de suite. En supposant que l'on utilise un cube de SHV à 3 dimensions ayant le nombre de points mentionné ci-dessus (c'est-à-dire 3, 5 et 2 respectivement pour les axes X, Y et Z), le premier point (point zéro) est le coin supérieur gauche de la face avant du cube, si l'on regarde le plan XY du cube. Le second point est le centre de l'arête supérieure de la face avant du cube, ainsi de suite. On peut se référer à la figure ci-dessous pour comprendre comment la numérotation des points pivots est réalisée :

Pour la SHV à 2 dimensions, c'est la même chose, en omettant seulement la face arrière du cube, si bien que chaque zone est délimitée par 4 points pivots au lieu de 8. Pour la SHV à 1 dimension, tout devient plus simple car il n'y a qu'un segment de droite sur lequel les points pivots sont répartis de gauche à droite. Chaque point est couplé à un instantané.

L'ordre des instantanés, comme il est stocké dans la table iSnapTab, peut suivre ou pas l'ordre des numéros des points pivots. En fait il est possible de modifier cet ordre avec la table iPositionsTab, qui repositionne chaque instantané en fonction des points pivots. La table iPositionsTab est constituée des positions des instantanés (contenus dans la table iSnapTab) sur la grille à deux dimensions. Chaque élément successif est un pointeur représentant la position dans la table iSnapTab. Par exemple, dans une matrice de SHV à 2 dimensions comme la suivante (ayant dans ce cas inumPointsX = 3 et inumPointsY = 5) :

Tableau 10.

5 | 7 | 1
3 | 4 | 9
6 | 2 | 0
4 | 1 | 3
8 | 2 | 7

Ces numéros (à stocker dans la table iSnapTab en utilisant, par exemple, le générateur de fonction GEN02), représentent la position des instantanés dans la grille (dans ce cas une matrice 3x5). Ainsi, le premier élément 5 a l'indice zéro et représente le sixième (l'élément zéro est le premier) instantané contenu dans la table iSnapTab, le second élément 7 représente le huitième élément de iSnapTab, ainsi de suite. En résumé, les sommets de chaque zone (une zone cubique est délimitée par 8 sommets, une zone carrée par 4 sommets et une zone linéaire par 2 points) sont liés à un instantané donné, dont le numéro est transformé par la table iSnapTab.

Les valeurs de sortie de la SHV sont influencées par le mouvement du pointeur, un point dont la position dans le cube de SHV (ou le carré ou le segment) est déterminée par les arguments kx, ky et kz. Les valeurs de ces arguments, qui doivent être comprises entre 0 et 1, sont fixées extérieurement par l'utilisateur. Les valeurs de sortie, dont le nombre est égal à l'argument inumParms, sont stockée dans la table iOutTab, laquelle doit avoir été allouée auparavant par l'utilisateur et doit avoir une taille d'au moins inumParms. De quelle manière le mouvement du pointeur influence-t-il la sortie ? Lorsque le pointeur tombe dans une zone cubique déterminée, délimitée par exemple par 8 sommets (ou points pivots), nous supposons que chaque sommet est associé à un instantané différent (c'est-à-dire un ensemble de inumParms valeurs), la sortie sera la moyenne pondérée des 8 sommets, calculée en fonction de la distance du pointeur à chacun des 8 sommets. Dans le comportement par défaut, lorsque l'argument iConfigTab n'est pas défini, la sortie exacte est calculée en utilisant une interpolation linéaire qui est appliquée à chaque paramètre de la SHV. Cependant, il est possible de modifier ce comportement en donnant à l'argument iConfigTab le numéro d'une table dont le contenu peut affecter un ou plusieurs paramètres de la SHV. Les éléments de la table iConfigTab sont associés à chaque paramètre de SHV et leurs valeurs affectent la sortie de la SHV de la manière suivante :

- Si iConfigTab vaut -1, la sortie correspondante est ignorée, c'est-à-dire que l'élément n'est pas calculé, laissant la valeur de l'élément correspondant dans la table iOutTab inchangée ;

- Si iConfigTab est égal à zéro, la sortie de la SHV normale est calculée (en utilisant la moyenne pondérée des sommets les plus proches de la zone dans laquelle le pointeur mobile est tombé) ;

- Si iConfigTab est égal à un nombre entier > zéro, le contenu d'une table ayant ce numéro est utilisé comme la forme d'une interpolation basée sur cette table.

## Exemples

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

Exemple 398. Exemple de l'opcode hvs2.

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
    ; Audio out   Audio in    No messages
    -odac           -iadc     -d     ;;;RT audio I/O
    </CsOptions>
    <CsInstruments>
    sr=44100
    ksmps=100
    nchnls=2
    0dbfs = 1
    ginumLinesX init	4
    ginumLinesY init	4
    ginumParms	init	3
    giOutTab	ftgen	5,0,8, -2,      0
    giPosTab	ftgen	6,0,32, -2,     3,2,1,0,4,5,6,7,8,9,10, 11, 15, 14, 13, 12
    giSnapTab	ftgen	8,0,64, -2,     1,1,1,   2,0,0,  3,2,0,  2,2,2,  5,2,1,  2,3,4,  6,1,7,    0,0,0, \
                                  1,3,5,   3,4,4,  1,5,8,  1,1,5,  4,3,2,  3,4,5,  7,6,5,    7,8,9
    tb0_init	giOutTab
            FLpanel	"Prova HVS2",600,400,10,100,0
    gk1,    gk2,   ih1, ih2  FLjoy   "HVS controller XY", 0,    1,     1,     0,     0,     0,     -1,     -1,     300,    300,     0, 50
    ; *ihandle,                      *numlinesX,   *numlinesY, *iwidth, *iheight, *ix, *iy,*image;
    gihandle	FLhvsBox	ginumLinesX,   ginumLinesY,  300,   300,      300,  50, 1
            FLpanel_end
            FLrun

    	instr	1
    ; Smooth control signals to avoid clicks
    kx portk gk1, 0.02
    ky portk gk2, 0.02
    ;              kx,  ky,  inumParms,  inumlinesX,  inumlinesY,  iOutTab,  iPosTab,  iSnapTab [, iConfigTab]
            hvs2  kx, ky, ginumParms, ginumLinesX, ginumLinesY, giOutTab, giPosTab, giSnapTab  ;, iConfigTab
    ;                       *kx, *ky, *ihandle;
            FLhvsBoxSetValue gk1, gk2, gihandle
    k0	init	0
    k1	init	1
    k2	init	2
    printk2	tb0(k0)
    printk2	tb0(k1), 10
    printk2	tb0(k2), 20
      kris init 0.003
      kdur init 0.02
      kdec init 0.007
    ; Make parameters of synthesis depend on the table values produced by hvs
    ares1 fof 0.2, tb0(k0)*100 + 50, tb0(k1)*100 + 200, 0, tb0(k2) * 10 + 50, 0.003, 0.02, 0.007, 20, \
          1, 2, p3
    ares2 fof 0.2, tb0(k1)*100 + 50, tb0(k2)*100 + 200, 0, tb0(k0) * 10 + 50, 0.003, 0.02, 0.007, 20, \
          1, 2, p3
    outs ares1, ares2
    	endin
    </CsInstruments>
    <CsScore>
    f 1 0 1024 10 1  ;Sine wave
    f 2 0 1024 19 0.5 0.5 270 0.5  ;Grain envelope table
    f0 3600
    i1 0 3600
    </CsScore>
    </CsoundSynthesizer>

Voici un second exemple de l'opcode hvs2. Il utilise le fichier hvs2-2.csd.

Exemple 399. Second exemple de l'opcode hvs2.

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
    ; Audio out   Audio in
    -odac           -iadc    ;;;RT audio I/O
    ; For Non-realtime ouput leave only the line below:
    ; -o hvs2.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    sr=48000
    ksmps=100
    nchnls=2

    ; Example by James Hearon 2008
    ; Edited by Andres Cabrera

    ginumPointsX init       16
    ginumPointsY init       16
    ginumParms  init        3

    ;Generate 9 tables with arbitrary points
    gitmp ftgen 100, 0, 16, -2, 70, 260, 390, 180, 200, 300, 980, 126, \
                    330, 860, 580, 467, 220, 399, 1026, 1500
    gitmp ftgen 200, 0, 16, -2, 100, 200, 300, 140, 600, 700, 880, 126, \
                    330, 560, 780, 167, 220, 999, 1026, 1500
    gitmp ftgen 300, 0, 16, -2, 400, 200, 300, 540, 600, 700, 880, 126, \
                    330, 160, 780, 167, 820, 999, 1026, 1500
    gitmp ftgen 400, 0, 16, -2, 100, 200, 800, 640, 600, 300, 880, 126, \
                    330, 660, 780, 167, 220, 999, 1026, 1500
    gitmp ftgen 500, 0, 16, -2, 200, 200, 360, 440, 600, 700, 880, 126, \
                    330, 560, 380, 167, 220, 499, 1026, 1500
    gitmp ftgen 600, 0, 16, -2, 100, 600, 300, 840, 600, 700, 880, 126, \
                    330, 260, 980, 367, 120, 399, 1026, 1500
    gitmp ftgen 700, 0, 16, -2, 100, 200, 300, 340, 200, 500, 380, 126, \
                    330, 860, 780, 867, 120, 999, 1026, 1500
    gitmp ftgen 800, 0, 16, -2, 100, 600, 300, 240, 200, 700, 880, 126, \
                    130, 560, 980, 167, 220, 499, 1026, 1500
    gitmp ftgen 900, 0, 16, -2, 100, 800, 200, 140, 600, 700, 680, 126, \
                    330, 560, 780, 167, 120, 299, 1026, 1500

    giOutTab ftgen   5,0,8, -2,      0
    giPosTab ftgen   6,0,32, -2, 0,1,2,3,4,5,6,7,8,9,10, 11, 15, 14, 13, 12
    giSnapTab ftgen   8,0,64, -2,  1,1,1,   2,0,0,  3,2,0,  2,2,2,  \
            5,2,1,  2,3,4,  6,1,7,  0,0,0,  1,3,5,  3,4,4,  1,5,8,  1,1,5,  \
            4,3,2,  3,4,5,  7,6,5,  7,8,9

    tb0_init        giOutTab

            FLpanel "hsv2",440,100,10,10,0
    gk1,ih1 FLslider "X", 0,1, 0, 5, -1, 400,20, 20,10
    gk2, ih2 FLslider "Y", 0, 1, 0, 5, -1, 400, 20, 20, 50
            FLpanel_end

            FLpanel "hvsBox",280,280,500,1000,0
    ;ihandle FLhvsBox inumlinesX, inumlinesY, iwidth, iheight, ix, iy [, image]
    gih1  FLhvsBox  16, 16, 250, 250, 10, 1
            FLpanel_end
            FLrun

            instr   1
    FLhvsBoxSetValue gk1, gk2, gih1

    hvs2    gk1,gk2,  ginumParms, ginumPointsX, ginumPointsY, giOutTab, giPosTab, giSnapTab  ;, iConfigTab

    k0      init    0
    k1      init    1
    k2      init    2
    kspeed  init    0

    kspeed = int((tb0(k2)) + 1)*.10

    kenv  oscil   25000, kspeed*16, 10

    k1    phasor kspeed ;slow phasor: 200 sec.
    kpch  tableikt k1 * 16, int((tb0(k1)) +1)*100 ;scale phasor * length
    a1    oscilikt kenv, kpch, int(tb0(k0)) +1000;scale pitch slightly
    ahp butterlp a1, 2500
    outs ahp, ahp

            endin

    </CsInstruments>
    <CsScore>

    f 10  0  1024 20  5 ;use of windowing function
    f1000 0 1024 10 .33 .25 .5
    f1001 0 1024 10 1
    f1002 0 1024 10 .5  .25  .05
    f1003 0 1024 10 .05  .10  .3  .5  1
    f1004 0 1024 10 1 .5  .25  .125  .625
    f1005 0 1024 10 .33  .44  .55  .66
    f1006 0 1024 10 1 1 1 1 1
    f1007 0 1024 10 .05 .25 .05 .25 .05 1

    f0 3600
    i1 0 3600

    </CsScore>
    </CsoundSynthesizer>

## Voir aussi

hvs1, hvs3, vphaseseg

## Crédits

Auteur : Gabriel Maldonado

Nouveau dans la version 5.06

Précédent | Niveau supérieur | Suivant
hvs1 | Sommaire | hvs3