convolve — Convolution basée sur un algorithme overlap-save à découpage uniforme.
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
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.
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
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 |
---|---|
Il faut télécharger les fichiers de réponse impulsionnelle depuis noisevault.com ou remplacer les noms de fichier avec vos propres fichiers de réponse impulsionnelle. |
sr = 44100 ksmps = 100 nchnls = 2 instr 1 kmix = .5 ; Wet/dry mix. Vary as desired. kvol = .5*kmix ; Overall volume level of reverb. May need to adjust ; when wet/dry mix is changed, to avoid clipping. ; do some safety checking to make sure we the parameters a good kmix = (kmix < 0 || kmix > 1 ? .5 : kmix) kvol = (kvol < 0 ? 0 : .5*kvol*kmix) ; size of each convolution partion -- for best performance, this parameter needs to be tweaked ipartitionsize = p4 ; calculate latency of pconvolve opcode idel = (ksmps < ipartitionsize ? ipartitionsize + ksmps : ipartitionsize)/sr prints "Convolving with a latency of %f seconds%n", idel ; actual processing al, ar ins awetl, awetr pconvolve kvol*(al+ar), "Mercedes-van.wav", ipartitionsize ; Delay dry signal, to align it with the convoled sig adryl delay (1-kmix)*al, idel adryr delay (1-kmix)*ar, idel outs adryl+awetl, adryr+awetr endin instr 2 imix = 0.5 ; Wet/dry mix. Vary as desired. ivol = .5*imix ; Overall volume level of reverb. May need to adjust ; when wet/dry mix is changed, to avoid clipping. ipartitionsize = 32768 ; 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 ins] we can ; do a kind of "look ahead" by looping during one k-pass ; without output, creating zero-latency loop: al, ar soundin "John_Cage_1.aif", 0 awetl, awetr pconvolve ivol*(al+ar),"FactoryHall.aif", ipartitionsize adryl delay (1-imix)*al,idel ; Delay dry signal, to align it with adryr delay (1-imix)*ar,idel kcount = kcount - 1 if kcount > 0 kgoto loop outs awetl+adryl, awetr+adryr endin