Modulation de phase avec rétroaction

Sources et résultat sonore :

Dans cet exemple, un oscillateur se module lui-même en phase par une boucle de rétroaction. On remarquera que la fréquence fondamentale de l'oscillateur n'est pas affectée par la modulation, ce qui permet de garder une stabilité de la hauteur de la note jouée. L'indice de modulation des dernières notes de l'exemple est exagéré, ce qui ajoute du bruit au timbre.

L'orchestre Csound

         sr = 44100
         kr = 4410
      ksmps = 10
     nchnls = 1

          opcode fdbkPM, a, kk
            setksmps  1
kcps, kmod  xin
asig0       init      0
aphi        phasor    kcps
;in Phase Modulation, modulation index is independant from modulator frequency
aphi        =         frac(aphi + kmod*asig0)
asig        tablei    aphi, 1, 1, 0, 1
asig0       =         asig
            xout      asig
          endop

          instr 3
idur        = p3
iamp        = p4
icarcps     = cpspch(p5)
indxmul     = p6 / 6.2831853      ;p6/(2*pi)

kndx        adsr      0.4, 0.5, 0.1, 0.05
kmod        =         kndx * indxmul
asig        fdbkPM    icarcps, kmod
kenv        adsr      0.1, 0.2, 0.8, 0.2
            out       iamp * kenv * asig
          endin
   

Pour que la boucle de rétroaction fonctionne, il faut que le taux de contrôle soit le même que le taux d'échantillonnage (ksmps = 1). C'est pourquoi l'algorithme est implémenté dans un opérateur défini par l'utilisateur (UDO) appelé fdbkPM. Cet opérateur prend deux paramètres de taux k, la fréquence de l'oscillateur et l'indice de modulation, et retourne un signal audio. L'instruction setksmps 1 fixe l'égalité entre le taux de contrôle et le taux d'échantillonage à l'intérieur de l'opérateur. La a-variable asig0 sert de tampon pour le délai d'un échantillon de la boucle de rétroaction.