spdist — Calcule les valeurs de distance à partir des coordonnées xy.
spdist utilise les mêmes données xy que space, depuis un fichier texte lu par Gen28 ou depuis les arguments x et y donnés directement dans l'unité. Cet opcode à pour but de mettre à disposition les valeurs de distance calculées à partir des coordonnées xy.
Dans le cas de space, les valeurs xy sont utilisées pour déterminer une distance qui sert à atténuer le signal et à le préparer pour son utilisation dans spsend. Mais il est également utile d'avoir ces valeurs de distance pour pondérer la fréquence du signal avant de l'envoyer à l'unité space.
ifn -- numéro de la fonction créée au moyen de Gen28. Ce générateur de fonction lit un fichier texte qui contient des groupes de trois valeurs représentant les coordonnées xy et un paramètre de temps indiquant quand le signal doit être placé à cette position. Le fichier ressemblera à ceci :
0 -1 1
1 1 1
2 4 4
2.1 -4 -4
3 10 -10
5 -40 0
Avec un fichier nommé « move » l'appel à Gen28 dans la partition s'écrira :
f1 0 0 28 "move"
Gen28 prend pour taille 0 et alloue la mémoire automatiquement. Il crée ses valeurs avec une résolution de 10 ms. Ainsi dans ce cas, il y aura 500 valeurs créées en interpolant de X1 à X2 à X3 et ainsi de suite, et de Y1 à Y2 à Y3 et ainsi de suite, sur le nombre approprié de valeurs stockées dans la table de fonction. Dans l'exemple ci-dessus, le son démarre à l'avant-gauche, après une seconde il atteind l'avant-droite, après une autre seconde il est plus éloigné mais toujours à l'avant-droite, ensuite il bouge à l'arrière-gauche en moins d'un dizième de seconde, un peu éloigné. Enfin, durant les neuf dixièmes de seconde suivants le son bouge à l'arrière-droite, modérément distant, puis il se fixe entre les deux haut-parleurs de gauche (plein ouest !), assez éloigné. Comme les valeurs dans la table sont lues par l'unité space au moyen d'un pointeur temporel, le temps courant peut être réglé pour suivre exactement celui du fichier, ou bien il peut être réglé pour aller plus vite ou plus lentement le long de la même trajectoire. Si l'on a accès à l'interface graphique permettant de dessiner et d'éditer les fichiers, il n'est pas nécessaire de créer les fichiers texte manuellement. Mais dès lors que le fichier est en ASCII dans le format ci-dessus, peu importe comment il a été créé !
IMPORTANT: Si ifn vaut 0, spdist obtient les valeurs des coordonnées xy depuis kx et ky.
La configuration des coordonnées xy dans l'espace place le signal de la manière suivante :
a1 est en (-1, 1)
a2 est en (1, 1)
a3 est en (-1, -1)
a4 est en (1, -1)
Ceci suppose une disposition des haut-parleurs où a1 est à l'avant-gauche, a2 à l'avant-droit, a3 à l'arrière-gauche et a4 à l'arrière-droite. Les valeurs supérieures à 1 donnent un son atténué, comme s'il était éloigné. space considère que les haut-parleurs sont à une distance de 1 ; on peut utiliser des valeurs de xy inférieures, mais space n'amplifiera pas le signal dans ce cas. Il équilibrera le signal cependant de manière à ce qu'il soit entendu comme s'il se trouvait à l'intérieur de l'espace des quatre haut-parleurs. x=0, y=1, place le signal entre les canaux avant gauche et droite, x=y=0 place le signal également entre les quatre canaux, et ainsi de suite. Bien que space fournisse quatre signaux en sortie, on peut l'utiliser dans un orchestre à deux canaux. Si les xy sont tels que y reste >= 1, il fonctionnera correctement pour faire des panoramiques et des localisations fixes dans un champ stéréophonique.
ktime -- indice dans la table contenant les coordonnées xy. S'il est utilisé comme ceci :
ktime line 0, 5, 5
a1, a2, a3, a4 space asig, 1, ktime, ...
avec le fichier « move » décrit ci-dessus, la vitesse du mouvement du signal sera exactement celle qui est décrite dans ce fichier. Cependant avec :
ktime line 0, 10, 5
le signal se déplacera deux fois moins vite qu'à la vitesse spécifiée. Ou dans le cas de :
ktime line 5, 15, 0
le signal se déplacera dans la direction inverse et trois fois moins vite ! Enfin avec :
ktime line 2, 10, 3
le signal ne se déplacera que depuis l'endroit spécifié à la ligne 3 du fichier texte jusqu'à l'endroit spécifié à la ligne 5 du fichier texte, et il lui faudra 10 secondes pour le faire.
kx, ky -- lorsque ifn vaut 0, space et spdist utilisent ces valeurs comme coordonnées xy pour positionner le signal.
Voici un exemple de l'opcode spdist. Il utilise le fichier spdist.csd.
Exemple 994. Exemple de l'opcode spdist.
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 spdist.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 0dbfs = 1 nchnls = 4 ga1 init 0 ga2 init 0 ga3 init 0 ga4 init 0 instr 1 ;uses GEN28 file "move2", as found in /manual/examples ifreq = 1 kx init 0 ky init 0 ktime line 0, 5.6, 5.6 ;same time as in table 1 (="move2") kdist spdist 1, ktime, kx, ky kfreq = (ifreq*340) / (340 + kdist) ;calculate doppler shift printk2 kdist ;print distance values asig diskin2 "flute.aiff", kfreq, 0, 1 ;sound source is looped a1, a2, a3, a4 space asig, 1, ktime, .1, kx, ky ;use table 1 = GEN28 ar1, ar2, ar3, ar4 spsend ;send to reverb ga1 = ga1+ar1 ga2 = ga2+ar2 ga3 = ga3+ar3 ga4 = ga4+ar4 outq a1, a2, a3, a4 endin instr 99 ; reverb instrument a1 reverb2 ga1, 2.5, .5 a2 reverb2 ga2, 2.5, .5 a3 reverb2 ga3, 2.5, .5 a4 reverb2 ga4, 2.5, .5 outq a1, a2, a3, a4 ga1=0 ga2=0 ga3=0 ga4=0 endin </CsInstruments> <CsScore> f1 0 0 28 "move2" ;from left front and left rear to the middle in front i 1 0 5.6 ;same time as ktime i 99 0 10 ;keep reverb active e </CsScore> </CsoundSynthesizer>
Les mêmes fonction et valeurs temporelles sont utilisées pour spdist et pour space. Grâce à cela les valeurs de distance utilisées en interne par l'unité space seront les mêmes que celles retournées par spdist pour donner l'impression de l'effet Doppler !