pvinterp — Interpole entre les amplitudes et les fréquences de deux fichiers d'analyse par vocodeur de phase.
pvinterp interpole entre les amplitudes et les fréquences, bin par bin, de deux fichiers d'analyse par vocodeur de phase (l'un provenant d'une unité pvbufread appelée précedemment et l'autre étant spécifié dans la liste d'arguments), permettant des transitions définies par l'utilisateur entre les sons analysés. Il permet aussi une mise à l'échelle de l'ensemble des amplitudes et des fréquences de chaque fichier séparement avant le calcul des valeurs interpolées et leur envoi aux routines de resynthèse. L'argument kfmod dans pvinterp exécute sa mise à l'échelle des valeurs de fréquence sur le résultat de la mise à l'échelle individuelle suivie de l'interpolation si bien que cela agit comme une valeur de mise à l'échelle globale des nouvelles composantes de fréquence.
ares pvinterp ktimpnt, kfmod, ifile, kfreqscale1, kfreqscale2, \
kampscale1, kampscale2, kfreqinterp, kampinterp
ifile -- le numéro pvoc (n dans pvoc.n) ou le nom entre guillements du fichier d'analyse créé avec pvanal. (Voir pvoc.)
ktimpnt -- l'écoulement du temps, en secondes, dans ce fichier. ktimpnt doit toujours être positif, mais il peut avancer ou reculer dans le temps, être stationnaire ou discontinu, comme pointeur dans le fichier d'analyse.
kfmod -- un facteur de transposition au taux de contrôle : la valeur 1 n'implique pas de transposition, 1.5 transpose vers l'aigu d'un quinte juste et 0.5 d'une octave vers le grave.
kfreqscale1, kfreqscale2, kampscale1, kampscale2 -- utilisés dans pvinterp pour mettre à l'échelle les fréquences et les amplitudes stockées dans chaque trame du fichier d'analyse par vocodeur de phase. kfreqscale1 et kampscale1 mettent à l'échelle les fréquences et les amplitudes des données du fichier lu par le pvbufread appelé précedemment (ces données sont passées en interne à l'unité pvinterp). kfreqscale2 et kampscale2 mettent à l'échelle les fréquences et les amplitudes des données du fichier nommé par ifile dans la liste d'arguments de pvinterp et lu par l'unité pvinterp.
Il est possible d'ajuster ces valeurs au moyen de ces arguments avant l'application de l'interpolation. Par exemple, si file1 est beaucoup plus fort que file2, on peut vouloir diminuer les amplitudes de file1 ou augmenter celles de file2 avant l'interpolation. De même on peut ajuster les fréquences de chacun pour les rapprocher les unes des autres (ou bien les opposer, bien sûr !) avant d'effectuer l'interpolation.
kfreqinterp, kampinterp -- utilisés dans pvinterp, déterminent la distance d'interpolation entre les valeurs d'un fichier de vocodeur de phase et les valeurs d'un second fichier. Lorsque kfreqinterp vaut 1, les valeurs de fréquence sont toutes celles du premier fichier (lu par le pvbufread), mises ensuite à l'échelle par l'argument kfreqscale1. Lorsque kfreqinterp est nul, les valeurs de fréquence sont toutes celles du second fichier (lu par l'unité pvinterp elle-même), mises ensuite à l'échelle par kfreqscale2. Lorsque kfreqinterp se trouve entre 0 et 1, les valeurs de fréquence sont calculées, bin par bin, comme le pourcentage entre chaque paire de fréquences (autrement dit, kfreqinterp=0.5 met les valeurs de fréquence à mi-chemin entre les valeurs de l'ensemble des données du premier fichier et celles de l'ensemble des données du second fichier).
kampinterp travaille de la même manière sur les amplitudes des deux fichiers. Comme ces arguments sont de taux-k, les pourcentages peuvent changer dans le temps ce qui permet toutes sortes de transitions entre les sons.
L'exemple ci-dessous montre une utilisation de pvbufread avec pvinterp pour interpoler entre le son d'un hautbois et celui d'une clarinette. La valeur de kinterp retournée par l'opcode linseg est utilisée pour définir le déroulement temporel de la transition entre les deux sons. Les interpolations des fréquences et des amplitudes sont contrôlées par le même facteur dans cet exemple, mais il peut être intéressant de ne pas les synchroniser de cette manière pour obtenir d'autres effets. Cet exemple commence par un son de clarinette qui se transforme en hautbois et revient ensuite à la clarinette. kfreqscale2 vaut 1.065 car dans ce cas le hautbois est plus haut d'un demi-ton que la clarinette et cela les met approximativement à la même hauteur. kampscale2 vaut 0.75 car la clarinette analysée était un peu plus forte que le hautbois analysé. Les réglages de ces deux paramètres donnent une transition assez douce dans ce cas, mais de tels ajustements ne sont en aucun cas nécessaires ou même préconisés.
ktime1 line 0, p3, 3.5 ; used as index in the "oboe.pvoc" file ktime2 line 0, p3, 4.5 ; used as index in the "clar.pvoc" file kinterp linseg 1, p3*0.15, 1, p3*0.35, 0, p3*0.25, 0, p3*0.15, 1, p3*0.1, 1 pvbufread ktime1, "oboe.pvoc" apv pvinterp ktime2,1,"clar.pvoc", 1, 1.065, 1, 0.75, 1-kinterp, 1-kinterp
Voici un exemple complet de l'opcode pvinterp. Il utilise le fichier pvinterp.csd
Exemple 801. Exemple de l'opcode pvinterp.
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 -m0 ;;;realtime audio out ;-iadc ;;;uncomment -iadc if realtime audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o pvinterp.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 0dbfs = 1 nchnls = 2 ; by Menno Knevel 2021 gilen1 filelen "fox.wav" ; get length of impulse soundfile gilen2 filelen "finneganswake1.flac" ; analyze sound file and output result to pvoc-ex file ires1 system_i 1,{{ pvanal fox.wav fox1.pvx }} ; default settings ires2 system_i 1,{{ pvanal finneganswake1.flac finneganswake1.pvx }} ; default settings instr 1 ; untreated signals asig diskin2 p4 , 1 print gilen1 print gilen2 prints "\n---***YOU NOW HEAR THE UNTREATED SOUND SAMPLES***---\n" outs asig, asig endin instr 2 prints "\n---***YOU NOW HEAR THE RESULT OF THE ANALYZED FILES:***---\n" kfox line 0, p3, gilen1 ; timepointer in the "fox.pvx" file kflute line 0, p3, gilen2 ; & in the "finneganswake1.pvx" file kinterp line 1, p3, 0 pvbufread kfox, "fox1.pvx" asig pvinterp kflute, 1, "finneganswake1.pvx", p4, p5, 1, 1, 1-kinterp, 1-kinterp outs asig, asig endin </CsInstruments> <CsScore> s i1 0 2.76 "fox.wav" i1 3 12.7 "finneganswake1.flac" s ; freq.fox freq.finne i2 0 2.76 1 1 ; use duration of the fox i2 5 12.7 1 1 ; duration of finneganswake s i2 0 2.76 .1 4 ; duration of the fox & i2 5 12.7 .1 4 ; duration of finneganswake but different pitches e </CsScore> </CsoundSynthesizer>