convolve — Convolution d'un signal par une réponse impulsionnelle.
La sortie est le produit de convolution du signal ain par la réponse impulsionnelle contenue dans ifilcod. S'il y a plus d'un signal de sortie, chacun sera obtenu par convolution avec la même réponse impulsionnelle. Noter qu'il est considérablement plus efficace d'utiliser une instance de l'opérateur lorsque l'on traite une entrée mono pour créer des sorties stéréo ou quadraphoniques.
Note : cet opcode peut aussi s'écrire convle.
ifilcod -- entier ou chaîne de caractères définissant un fichier de données contenant une réponse impulsionnelle. Un entier définit le suffixe d'un fichier convolve.m ; une chaîne de caractères (entre guillemets) donne un nom de fichier, éventuellement un nom de chemin complet. Si ce n'est pas un nom de chemin complet, le fichier est d'abord cherché dans le répertoire courant, puis dans celui qui est donné par la variable d'environnement SADIR (si elle est définie). Le fichier de données contient la transformée de Fourier d'une réponse impulsionnelle. L'occupation mémoire dépend de la taille du fichier de données qui est lu en entier et gardé en mémoire durant le calcul, mais qui est partagé par des appels multiples.
ichannel (facultatif) -- quel canal du fichier de données de la réponse impulsionnelle utiliser.
ain -- signal audio en entrée.
convolve implémente la convolution rapide. Le sortie de cet opérateur est retardée en fonction de l'entrée. On peut calculer le délai avec les formules suivantes :
Pour (1/kr) <= IRdur: Delay = ceil(IRdur * kr) / kr Pour (1/kr) > IRdur: Delay = IRdur * ceil(1/(kr*IRdur)) Où : kr = taux de contrôle de Csound IRdur = durée, en secondes, de la réponse impulsionnelle ceil(n) = le plus petit entier qui n'est pas inférieur à n
Il faut également faire attention à prendre en compte le délai initial, s'il y en a un, de la réponse impulsionnelle. Par exemple, si une réponse impulsionnelle est créée à partir d'un enregistrement, le fichier son peut ne pas avoir de délai initial. Il faut ainsi soit s'assurer que le fichier son a la quantité correcte de zéro de remplissage au début, soit, de préférence compenser ce retard dans l'orchestre (cette dernière méthode étant plus efficace). Pour compenser le délai dans l'orchestre, il faut soustraire le délai initial du résultat calculé au moyen des formules ci-dessus, lorsque l'on calcule le délai requis à introduire dans la passe audio non "réverbérée".
Pour des applications typiques telles que la réverbération, le délai sera de l'ordre de 0.5 à 1.5 secondes, ou même plus long. Cela rend cette implémentation impropre aux applications en temps réel. Il est cependant concevable de l'utiliser pour du filtrage en temps réel, si le nombre de points de lecture est suffisamment petit.
L'auteur a l'intention de créer un opérateur de plus haut niveau qui mélangera le signal original et le signal réverbéré, en utilisant automatiquement la bonne quantité de délai.
Créer le fichier de réponse impulsionnelle dans le domaine fréquentiel au moyen de l'utilitaire cvanal utility :
csound -Ucvanal l1_44.wav l1_44.cv
Déterminer la durée de la réponse impulsionnelle. Pour une grande précision, déterminer le nombre de trames d'échantillon dans le fichier de la réponse impulsionnelle, puis calculer la durée avec :
durée = (trames d'échantillons)/(taux d'échantillonnage du fichier son)
Cela est du au fait que l'utilitaire sndinfo ne fournit la durée arrondie qu'au 10 ms les plus proches. Si l'on dispose d'un utilitaire qui fournit la durée avec la précision requise, alors il suffit d'utiliser directement la valeur retournée.
sndinfo l1_44.wav
length = 60822 samples, sample rate = 44100
Duration = 60822/44100 = 1.379s.
Déterminer le délai initial, s'il existe, de la réponse impulsionnelle. Si le délai initial de la réponse impulsionnelle n'a pas été enlevé, alors on peut ignorer cette étape. S'il a été enlevé, la seule manière de connaître le délai initial est de se procurer l'information séparément. Pour cet exemple, on suppose que le délai initial est de 60 ms (0.06 s).
Déterminer le délai qu'il faut nécessairement appliqué au signal original pour l'aligner sur le signal convolué :
Si kr = 441:
1/kr = 0.0023, qui est <= IRdur (1.379s), ainsi :
Delay1 = ceil(IRdur * kr) / kr
= ceil(608.14) / 441
= 609/441
= 1.38s
En prenant comme délai initial :
Delay2 = 0.06s
Total delay = delay1 - delay2
= 1.38 - 0.06
= 1.32s
Voici un exemple similaire de l'opcode convolve. Il utilise le fichier convolve.csd.
Exemple 160. Exemple de l'opcode convolve.
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 ;;;RT audio out ;-iadc ;;;uncomment -iadc if RT audio input is needed too ; For Non-realtime ouput leave only the line below: ;-o convolve.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> ; NB: 'Small' reverbs often require a much higher percentage of wet signal to sound interesting. 'Large' ; reverbs seem require less. Experiment! The wet/dry mix is very important - a small change can make a large difference. sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 ; by Menno Knevel - 2021 ires1 system_i 1,{{ cvanal rv_mono.wav rv_mono.con }} ; analyze mono spring reverb ires2 system_i 1,{{ cvanal rv_stereo.wav rv_stereo.con }} ; analyze stereo spring reverb instr 1 imix = 0.25 ;wet/dry mix. Vary as desired. ivol = .8 ;Overall volume level of reverb. Adjust to avoid clipping. idel filelen p4 ;calculate length and number of channels of soundfile ichnls filenchnls p4 prints "\n**this reverb file = %f seconds and has %d channel(s)**\n", idel, ichnls if (ichnls == 1) then ; if mono adry soundin "fox.wav" ; input (dry) audio awet convolve adry,"rv_mono.con" ; mono convolved (wet) audio awet1 diff awet ; brighten sound awet2 = awet1 ; as it is a mono file played stereo adrydel delay (1-imix)*adry, idel ; Delay dry signal to align it with convolved signal else ; if stereo adry soundin "fox.wav" ; input (dry) audio awet1, awet2 convolve adry,"rv_stereo.con" ; stereo convolved (wet) audio awet1 diff awet1 ; brighten left sound awet2 diff awet2 ; and brighten right sound adrydel delay (1-imix)*adry, idel ; Delay dry signal to align it with convolved signal endif outs ivol*(adrydel+imix*awet1),ivol*(adrydel+imix*awet2) ; Mix wet & dry signals endin </CsInstruments> <CsScore> i 1 0 4 "rv_mono.wav" i 1 5 4 "rv_stereo.wav" e </CsScore> </CsoundSynthesizer>