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

## spat3dt

spat3dt — Utilisable pour obtenir une réponse impulsionnelle dans un espace 3D au temps-i.

## Description

Cet opcode positionne le son d'entrée dans un espace 3D, avec simulation facultative d'un espace acoustique, dans différents formats de sortie. spat3dt peut être utilisé pour obtenir la réponse impulsionnelle au temps-i, stockant sa sortie dans une table de fonction, convenant à la convolution.

## Syntaxe

    spat3dt ioutft, iX, iY, iZ, idist, ift, imode, irlen [, iftnocl]

## Initialisation

ioutft -- Numéro de la ftable de sortie. Les sorties W, X, Y et Z sont écrites de manière entrelacée dans cette table. Si la table est trop courte, la sortie est tronquée.

iX -- Coordonnée X de la source sonore en mètres (positive : à droite, négative : à gauche).

iY -- Coordonnée Y de la source sonore en mètres (positive : en avant, négative : en arrière).

iZ -- Coordonnée Z de la source sonore en mètres (positive : en haut, négative : en bas).

idist -- Pour les modes 0 à 3, idist est la distance du cercle unité en mètres. Pour le mode 4, idist est la distance entre les microphones.

Les formules suivantes décrivent l'amplitude et le retard comme une fonction de la distance entre la source sonore et le(s) microphone(s) :

amplitude = 1 / (0.1 + distance)

delay = distance / 340 (en secondes)

La distance peut être calculée par :

distance = sqrt(iX^2 + iY^2 + iZ^2)

Dans le mode 4, la distance est calculée par :

distance from left mic = sqrt((iX + idist/2)^2 + iY^2 + iZ^2)
distance from right mic = sqrt((iX - idist/2)^2 + iY^2 + iZ^2)

Avec spat3d la distance entre la source sonore et un microphone doit valoir au moins (340 * 18) / sr mètres. Les distances inférieures fonctionneront mais pourront produire des artefacts dans certains cas. Cette limitation n'existe pas pour spat3di et spat3dt.

Les changements brusques et les discontinuités dans le positionnement de la source sonore peuvent donner des pops ou des clics. Un mouvement très rapide peut aussi dégrader la qualité.

ift -- Table de fonction contenant les paramètres spatiaux (pour une spatialisation en milieu ouvert, mettre zéro ou une valeur négative). La taille de la table est 54. Les valeurs dans la table sont :

Paramètre Spatial | Fonction
--- | ---
0 | Profondeur de récursion des premières réflexions (0 est la source sonore, 1 est la première réflexion, etc.) pour spat3d et spat3di. Le nombre d'échos pour quatre murs (avant, arrière, droit, gauche) est : N = (2*R + 2) * R. Si les six murs sont pris en compte : N = (((4*R + 6)*R + 8)*R) / 3
1 | Profondeur de récursion des réflexions secondaires (utilisé seulement par spat3dt). spat3dt passe les premières réflexions et restitue des échos jusqu'à ce niveau. Si la profondeur des premières réflexions est négative, spat3d et spat3di donneront zéro en sortie, tandis que spat3dt commencera sa restitution depuis la source sonore.
2 | imdel pour spat3d. Remplace le paramètre de l'opcode s'il est non négatif.
3 | irlen pour spat3dt. Remplace le paramètre de l'opcode s'il est non négatif.
4 | valeur de idist. Remplace le paramètre de l'opcode si elle est >= 0.
5 | Graine aléatoire (0 - 65535). -1 fait prendre le temps courant comme graine.
6 - 53 | paramètre de mur (w = 6 : plafond, w = 14 : plancher, w = 22 : avant, w = 30 : arrière, w = 38 : droite, w = 46 : gauche)
w + 0 | Active les réflexions depuis ce mur (0 : non, 1 : oui)
w + 1 | Distance entre le mur et l'auditeur (en mètres)
w + 2 | Variation aléatoire de la distance du mur (0 à 1) (en unités de 1 / (distance du mur))
w + 3 | Niveau de réflexion level (-1 à 1)
w + 4 | Fréquence de l'égaliseur paramétrique en Hz.
w + 5 | Niveau de l'égaliseur paramétrique (1.0 : pas de filtrage)
w + 6 | Q de l'égaliseur paramétrique (0.7071 : pas de résonnance)
w + 7 | Mode de l'égaliseur paramétrique (0 : peak EQ, 1 : low shelf, 2 : high shelf)

imode -- Mode de sortie.

- 0 : format B avec sortie W seulement (mono)

  aout = aW

- 1 : format B avec sorties W et Y (stéréo)

  aleft = aW + 0.7071*aY
  aright = aW - 0.7071*aY

- 2 : format B avec sorties W, X et Y (2D). Peut être converti au format UHJ :

  aWre, aWim hilbert aW
  aXre, aXim hilbert aX
  aYre, aYim hilbert aY
  aWXr = 0.0928*aXre + 0.4699*aWre
  aWXiYr = 0.2550*aXim - 0.1710*aWim + 0.3277*aYre
  aleft = aWXr + aWXiYr
  aright = aWXr - aWXiYr

- 3 : format B avec toutes les sorties (3D)

- 4 : Simule une paire de microphones (sortie stéréo)

  aW butterlp aW, ifreq ; les valeurs recommendées pour ifreq
  aY butterlp aY, ifreq ; se situent autour de 1000 Hz
  aleft = aW + aX
  aright = aY + aZ

Le mode 0 est le moins couteux en capacité de calcul, tandis que le mode 4 est le plus gourmand.

Dans le mode 4, les filtres passe-bas facultatifs peuvent changer la réponse en fréquence en fonction de la direction. Par exemple, si la source sonore se situe à gauche de l'auditeur, les fréquences élevées sont atténuées dans le canal droit et légèrement augmentées dans le canal gauche. Si l'on utilise pas de filtre, cet effet n'a pas lieu. On peut expérimenter avec d'autres filtres (tone, etc.) pour un meilleur effet.

Noter que le mode 4 est plutôt destiné à une écoute au casque et qu'il est aussi plus coûteux en calcul que les modes du format B (0 à 3). Dans ce cas, le paramètre idist fixe la distance entre les microphones gauche et droit ; pour le casque, des valeurs comprises entre 0.2 et 0.25 sont recommandées, bien que l'on puisse utiliser des valeurs plus grandes, jusqu'à 0.4, pour des effets stéréo larges.

On peut trouver plus d'information sur le format B ici : http://www.york.ac.uk/inst/mustech/3d_audio/ambis2.htm

irlen -- Longueur de la réponse impulsionnelle des échos (en secondes). Dépend des paramètres du filtre, les valeurs entre 0.005 et 0.01 conviennent à la plupart des usages (les valeurs supérieures donnent une sortie plus précise, mais plus lente à calculer).

iftnocl (facultatif, 0 par défaut) -- S'il vaut 1, la ftable de sortie n'est pas effacée (mélange avec les données existantes), s'il vaut 0, la table est effacée avant l'écriture.

## Exemples

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

Exemple 867. Exemple de l'opcode spat3dt.

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 spat3dt.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    sr = 44100
    ksmps = 32
    nchnls = 2
    0dbfs  = 1

    garvb   init 0
    gaW     init 0
    gaX     init 0
    gaY     init 0

    itmp ftgen 1, 0, 64, -2, 2, 40, -1, -1, -1, 123,          \
               1, 13.000, 0.05, 0.85, 20000.0, 0.0, 0.50, 2,   \
               1,  2.000, 0.05, 0.85, 20000.0, 0.0, 0.25, 2,   \
               1, 16.000, 0.05, 0.85, 20000.0, 0.0, 0.35, 2,   \
               1,  9.000, 0.05, 0.85, 20000.0, 0.0, 0.35, 2,   \
               1, 12.000, 0.05, 0.85, 20000.0, 0.0, 0.35, 2,   \
               1,  8.000, 0.05, 0.85, 20000.0, 0.0, 0.35, 2

    itmp ftgen 2, 0, 262144, -2, 0
         spat3dt 2, -0.2, 1, 0, 1, 1, 2, 0.005

    itmp ftgen 3, 0, 262144, -52, 3, 2, 0, 4, 2, 1, 4, 2, 2, 4

    instr 1

    a1   vco2 1, 440, 10
    kfrq port 100, 0.008, 20000
    a1   butterlp a1, kfrq
    a2   linseg 0, 0.003, 1, 0.01, 0.7, 0.005, 0, 1, 0
    a1   =  a1 * a2 * 2
         denorm a1
         vincr garvb, a1
    aw, ax, ay, az spat3di a1, p4, p5, p6, 1, 1, 2
         vincr gaW, aw
         vincr gaX, ax
         vincr gaY, ay

    endin

    instr 2

    denorm garvb
    ; skip as many samples as possible without truncating the IR
    arW, arX, arY ftconv garvb, 3, 2048, 2048, (65536 - 2048)
    aW     =  gaW + arW
    aX     =  gaX + arX
    aY     =  gaY + arY
    garvb  =  0
    gaW    =  0
    gaX    =  0
    gaY    =  0

    aWre, aWim hilbert aW
    aXre, aXim hilbert aX
    aYre, aYim hilbert aY
    aWXr    =  0.0928*aXre + 0.4699*aWre
    aWXiYr  =  0.2550*aXim - 0.1710*aWim + 0.3277*aYre
    aL      =  aWXr + aWXiYr
    aR      =  aWXr - aWXiYr
            outs aL, aR

    endin

    </CsInstruments>
    <CsScore>

    i 1 0 0.5  0.0  2.0 -0.8
    i 1 1 0.5  1.4  1.4 -0.6
    i 1 2 0.5  2.0  0.0 -0.4
    i 1 3 0.5  1.4 -1.4 -0.2
    i 1 4 0.5  0.0 -2.0  0.0
    i 1 5 0.5 -1.4 -1.4  0.2
    i 1 6 0.5 -2.0  0.0  0.4
    i 1 7 0.5 -1.4  1.4  0.6
    i 1 8 0.5  0.0  2.0  0.8
    i 2 0 10
    e

    </CsScore>
    </CsoundSynthesizer>

## Voir aussi

spat3d, spat3di

## Crédits

Auteur : Istvan Varga
2001

Nouveau dans la version 4.12

Mis à jour en avril 2002 par Istvan Varga

Précédent | Niveau supérieur | Suivant
spat3di | Sommaire | spdist