pconvolve

convolve — Convolution basée sur un algorithme overlap-save à découpage uniforme.

Description

Convolution basée sur un algorithme overlap-save à découpage uniforme. Comparé à l'opcode convolve, pconvolve a trois atouts :

  • petit délai

  • peut fonctionner en temps réel pour les fichier de réponse impulsionnelle les plus courts

  • pas de passe d'analyse avant le traitement

  • restitution souvent plus rapide que convolve

Syntaxe

ar1 [, ar2] [, ar3] [, ar4] pconvolve ain, ifilcod [, ipartitionsize, ichannel]

Initialisation

ifilcod -- entier ou chaîne de caractères définissant un fichier de réponse impulsionnelle. Les fichiers multi-canaux sont supportés. Le fichier doit avoir le même taux d'échantillonnage que l'orchestre. [Note : on ne peut pas utiliser les fichiers de cvanal !] Il faut garder à l'esprit que les fichiers plus longs nécessitent plus de temps de calcul [et probablement une plus grande taille des fragments et plus de latence]. Avec les processeurs actuels, les fichiers dépassant quelques secondes pourront ne pas être restitués en temps réel.

ipartitionsize (facultatif, par défaut égal à la taille du tampon de sortie [-b]) -- la taille en échantillons de chaque morceau de la réponse impulsionnelle. C'est le paramètre qu'il faut ajuster pour avoir les meilleures performances en fonction de la taille du fichier de réponse impulsionnelle. En général, une petite taille signifie une latence moins importante mais plus de temps de calcul. Si l'on spécifie une valeur qui n'est pas une puissance de 2 l'opcode trouvera la plus petite puissance de 2 immédiatement supérieure et l'utilisera comme taille des fragments.

ichannel (facultatif) -- le canal de la réponse impulsionnelle à utiliser.

Exécution

ain -- signal audio en entrée.

La latence totale de l'opcode peut être calculée comme ceci [ipartitionsize étant une puissance de 2]

    ilatency = (ksmps < ipartitionsize ? ipartitionsize + ksmps : ipartitionsize)/sr

Exemples

L'instrument 1 montre un exemple de convolution en temps réel.

L'instrument 2 montre comment faire une convolution basée sur un fichier avec une méthode de "prospection" pour supprimer tout délai.

[Note] NOTE

Vous pouvez télécharger les fichiers de réponse impulsionnelle depuis noisevault.com ou bien remplacer les noms de fichier avec vos propres fichiers de réponse impulsionnelle.

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

Exemple 744. Exemple de l'opcode pconvolve.

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 real audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o pconvolve.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

; additions by Menno Knevel 2022

sr = 44100
ksmps = 32
nchnls = 2
nchnls_i = 1    ; assume only one mono signal for audio input!
0dbfs  = 1

instr   1

kmix = .5                                   ; Wet/dry mix
kvol  = .05*kmix                            ; volume level of reverb
                                
kmix = (kmix < 0 || kmix > 1 ? .5 : kmix)   ; do some safety checking
kvol  = (kvol < 0 ? 0 : .5*kvol*kmix)       ; to make sure we the parameters a good

ipartitionsize = p4                         ; size of each convolution partion
                                            ; for best performance, this parameter needs to be tweaked
idel = (ksmps < ipartitionsize ? ipartitionsize + ksmps : ipartitionsize)/sr    ; calculate latency
prints "\nConvolving with a latency of %f seconds\n", idel
prints "***if no live input is given, nothing will sound...***\n\n"

alive in                                    ; get live input (mono)
awetl, awetr pconvolve kvol* (alive), "drumsSlp.wav", ipartitionsize

adryl delay (1-kmix)*alive, idel            ; delay dry signal, to align it with the convoled sig
adryr delay (1-kmix)*alive, idel
      outs adryl+awetl, adryr+awetr

endin
    
instr 2

imix = 0.5                                  ; Wet/dry mix
ivol = .05*imix                             ; volume level of reverb when wet/dry mix is changed, to avoid clipping

ipartitionsize = 1024                       ; size of each convolution partion
idel = (ksmps < ipartitionsize ? ipartitionsize + ksmps : ipartitionsize)/sr   ; latency of pconvolve opcode

kcount  init    idel*kr
; since we are using a soundin [instead of in] we can do a kind of "look ahead"
; without output, creating zero-latency  by looping during one k-pass
loop:
    asig soundin p4, 0
    awetl, awetr pconvolve ivol*(asig),"rv_stereo.wav", ipartitionsize
    adry delay  (1-imix)*asig,idel  ; Delay dry signal, to align it with
    kcount = kcount - 1
 if kcount > 0 kgoto loop
    outs awetl+adry, awetr+adry
        
endin

</CsInstruments>
<CsScore>

i 1 0 20 1024       ;play live for 20 seconds

i 2 20 5 "fox.wav"
i 2 25 5 "flute.aiff"
e
</CsScore>
</CsoundSynthesizer>


Voir aussi

convolve, dconv.

Crédits

Auteur : Matt Ingalls
2004