hvs1 — Synthèse Hyper Vectorielle (SHV) à une dimension contrôlée par une variable de taux-k mise à jour en externe.
hvs1 permet la synthèse Hyper Vectorielle (SHV) à une dimension contrôlée par une variable de taux-k mise à jour en externe.
inumParms - nombre de paramètres contrôlés par la SHV. Chaque instantané de la SHV est composé de inumParms éléments.
inumPointsX - 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).
kx - 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) :
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.
Voici un exemple de l'opcode hvs1. Il utilise le fichier hvs1.csd.
Exemple 448. Exemple de l'opcode hvs1.
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 ; For Non-realtime ouput leave only the line below: ; -o hvs1.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr=44100 ksmps=32 nchnls=2 0dbfs = 1 ; after the original FLTK example by Gabriel Maldonado and Andres Cabrera ; by Stefano Cucchi and Menno Knevel instr 1 inumLinesX init 16 inumParms init 3 iOutTab ftgen 5,0,8, -2, 0 iPosTab ftgen 6,0,32, -2, 3,2,1,0,4,5,6,7,8,9,10, 11, 15, 14, 13, 12 iSnapTab 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 k1 linseg 0, p3, 1 printk 0.2, k1 ; kx, inumParms, inumPointsX, iOutTab, iPosTab, iSnapTab [, iConfigTab] hvs1 k1, inumParms, inumLinesX, iOutTab, iPosTab, iSnapTab ;, iConfigTab k0 tab 0, 5 k1 tab 1, 5 k2 tab 2, 5 printk2 k0 printk2 k1, 10 printk2 k2, 20 aosc1 oscil k0/20, k1*100 + 200, 1 aosc2 oscil k1/20, k2*100 + 200, 1 aosc3 oscil k2/20, k0*100 + 200, 1 aosc4 oscil k1/20, k0*100 + 200, 1 aosc5 oscil k2/20, k1*100 + 200, 1 aosc6 oscil k0/20, k2*100 + 200, 1 outs (aosc1 + aosc2 + aosc3)*0.7, (aosc4 + aosc5 + aosc6)*0.7 endin </CsInstruments> <CsScore> f1 0 1024 10 1 i1 0 10 </CsScore> </CsoundSynthesizer>