pvadd

pvadd — Lit un fichier pvoc et utilise ses données pour réaliser une synthèse additive.

Description

pvadd lit un fichier pvoc et utilise ses données pour réaliser une synthèse additive au moyen d'un ensemble interne d'oscillateurs avec interpolation. L'utilisateur fournit la table d'onde (habituellement une période d'une onde sinusoïdale), et il peut choisir quels bins de l'analyse seront utilisés lors de la resynthèse.

Syntaxe

ares pvadd ktimpnt, kfmod, ifilcod, ifn, ibins [, ibinoffset] \
      [, ibinincr] [, iextractmode] [, ifreqlim] [, igatefn]

Initialisation

ifilcod -- entier ou chaîne de caractères dénotant un fichier de contrôle dérivé de l'analyse d'un signal audio par pvanal. Un entier dénote le suffixe d'un fichier pvoc.m ; une chaîne de caractères (entre guillemets) donne un nom de fichier, optionnellement 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, ensuite dans celui donné par la variable d'environnement SADIR (si elle est définie). Les fichiers de contrôle pvoc contiennent des données organisées pour la resynthèse par TFR. L'utilisation de la mémoire dépend de la taille des fichiers impliqués, qui sont lus et maintenus entièrement dans la mémoire durant les calculs, mais sont partagés par les appels multiples (voir aussi lpread).

ifn -- numéro de la table d'une fonction mémorisée contenant une onde sinusoïdale.

ibins -- nombre de bins utilisés dans la resynthèse (chaque bin compte pour un oscillateur dans la resynthèse).

ibinoffset (facultatif) -- est le premier bin utilisé (c'est une option et vaut 0 par défaut).

ibinincr (facultatif) -- fixe un incrément par lequel pvadd compte ibins composants à partir de ibinoffset pour la resynthèse (voir ci-dessous pour une explication plus détaillée).

iextractmode (facultatif) -- détermine s'il faut effectuer l'extraction spectrale et, dans ce cas, quels composants ayant des variations de fréquence sous ifreqlim ou au-dessus de ifreqlim seront écartés. Si iextractmode vaut 1, pvadd ne synthétise que les composants pour lesquels la différence de fréquence entre les trames d'analyse est plus grande que ifreqlim. Si iextractmode vaut 2, pvadd ne synthétise que les composants pour lesquels la différence de fréquence entre trames est plus petite que ifreqlim. iextractmode et ifreqlim valent 0 par défaut, ce qui provoque une simple resynthèse. Voir les exemples ci-dessous.

igatefn (facultatif) -- le numéro d'une fonction stockée à appliquer aux amplitudes des bins de l'analyse avant la resynthèse. Si igatefn est supérieur à 0, les amplitudes de chaque bin seront modifiées par igatefn par un procédé simple de correspondance. D'abord, les amplitudes de tous les bins dans toutes les trames de l'ensemble du fichier d'analyse sont comparées pour déterminer la valeur de l'amplitude maximale. Cette valeur est ensuite utilisée pour créer des amplitudes normalisées comme indices dans la fonction stockée igatefn. L'amplitude maximale correspond au dernier point dans la fonction. Une amplitude nulle correspond au premier point dans la fonction. Les valeurs entre 0 et 1 sont mises en correspondance avec les points tout au long de la table de fonction. Ceci est illustré dans les exemples ci-dessous.

Exécution

ktimpnt et kfmod sont utilisés de la même manière que dans pvoc.

Exemples

ktime line  0, p3, p3
asig  pvadd ktime, 1, « oboe.pvoc », 1, 100, 2

Ci-dessus, ibins vaut 100 et ibinoffset vaut 2. Avec ces réglages, la resynthèse contiendra 100 composants commençant avec le bin n°2 (les bins sont comptés à partir de 0). Donc, la resynthèse sera réalisée avec les bins 2 à 101 inclus. Il est généralement avisé de commencer avec le bin 1 ou 2, car le bin 0, et souvent le bin 1, contiennent des données inutiles voire inefficaces pour la création d'une resynthèse propre.

ktime line  0, p3, p3
asig  pvadd ktime, 1, « oboe.pvoc », 1, 100, 2, 2

L'exemple ci-dessus est le même que le précédent avec l'addition de la valeur 2 utilisée pour l'argument facultatif ibinincr. Le résultat comprend toujours 100 composants dans la resynthèse, mais pvadd compte les bins par 2 au lieu de 1. Il utilise ainsi les bins 2, 4, 6, 8, 10, et ainsi de suite. Avec ibins=10, ibinoffset=10 et ibinincr=10, pvadd utiliserait les bins 10, 20, 30, 40, jusqu'à 100 inclus.

Ci-dessous, un exemple utilisant l'extraction spectrale. Dans cet exemple, iextractmode vaut 1 et ifreqlim vaut 9. Ainsi, pvadd ne synthétise que les bins pour lesquels la moyenne de la déviation en fréquence prise sur 6 trames est supérieure à 9.

ktime line  0, p3, p3
asig  pvadd ktime, 1, « oboe.pvoc », 1, 100, 2, 2, 1, 9

Si iextractmode avait eu pour valeur 2 dans l'exemple ci-dessus, seuls les bins avec une déviation en fréquence moyenne inférieure à 9 auraient été synthétisés. Avec de bons réglages, cette technique peut être utilisée pour séparer les parties à hauteur définie du spectre des parties bruiteuses. En pratique, cela dépend beaucoup du type de son, de la qualité de l'enregistrement et de la numérisation, et aussi de la taille de la fenêtre d'analyse et de l'incrément de trame.

L'exemple suivant utilise le mappage d'amplitude. Le dernier 2 dans la liste d'arguments indique f2 dans la partition.

asig  pvadd ktime, 1, « oboe.pvoc », 1, 100, 2, 2, 0, 0, 2

En supposant que la partition contienne :

f2 0 512 7 0 256 1 256 1

Les bins dont l'amplitude est supérieure ou égale à 50% du maximum resteront inchangés, tandis que ceux dont l'amplitude est inférieure à 50% du maximum seront atténués. Dans ce cas, plus l'amplitude est faible et plus l'atténuation sera forte. Mais supposons que la partition contienne :

f2 0 512 5 1 512 .001

Dans ce cas, les amplitudes les plus faibles resteront inchangées tandis que les plus fortes seront atténuées, « inversant » le son en termes de spectre d'amplitude ! Les fonctions peuvent être arbitrairement compliquées. Il faut simplement se souvenir que les valeurs d'amplitude de l'analyse normalisées sont elles-mêmes les indices dans la fonction.

Finalement, on peut utiliser de concert l'extraction spectrale et le mappage d'amplitude. L'exemple ci-dessous ne synthétise que les composants ayant une déviation en fréquence de moins de 5 Hz par trame et il pondère les amplitudes selon la table f2.

asig  pvadd ktime, 1, « oboe.pvoc », 1, 100, 1, 1, 2, 5, 2

[Note] REMARQUES UTILES

En utilisant plusieurs unités pvadd ensemble, il est possible de faire un fondu entre différentes parties de la resynthèse, ce qui crée des effets de « filtrage » variés. L'auteur utilise pvadd pour synthétiser un bin à la fois afin de contrôler séparément chaque composant de la resynthèse.

Si une combinaison de ibins, ibinoffset et ibinincr crée une situation où pvadd doit utiliser un numéro de bin supérieur au nombre de bins dans l'analyse, il n'utilisera que l'ensemble des bins disponibles, sans protester. Ainsi, pour utiliser tous les bins, il suffit de donner une grande valeur à ibins (par exemple 2000).

Il faut s'attendre dans tous les cas à augmenter les amplitudes d'un facteur compris entre 10 et 100.

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

Exemple 798. Exemple de l'opcode pvadd.

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  --limiter=.95 ;;;realtime audio out, with limiter protection
;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
; For Non-realtime ouput leave only the line below:
; -o pvadd.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

sr = 44100 
ksmps = 32 
0dbfs  = 1 
nchnls = 2

; by Menno Knevel 2021

gilen  filelen "fox.wav"	    ; get length of impulse soundfile

; analyze sound file and output result to pvoc-ex file
ires system_i 1,{{ pvanal fox.wav fox1.pvx }}          ; default settings

instr 1 ; untreated signal
asig    diskin2   "fox.wav", 1
prints  "\n---***YOU NOW HEAR THE UNTREATED SOUND SAMPLE***---\n"
outs    asig, asig
endin

instr 2
prints  "\n---***YOU NOW HEAR THE RESULT OF THIS ANALYZED FILE:***---\n"
ibins   =  p4
igatefn =  p5
ktime line 0, p3, p3
asig  pvadd ktime, 1, "fox1.pvx", 1, ibins, 0, 1, 0, 0, igatefn
outs asig*.7, asig*.7
endin

</CsInstruments>
<CsScore>
f 1 0 16384 10 1	; sine wave
f 2 0 512 7 1 512 1 ; 3 different tables for scaling of the gate
f 3 0 512 5 1 256 .001
f 4 0 512 7 0 256 1 256 1


i1 0 2.76          ; original sample
s
;          bins   table
i2 0 2.76   300     2    ; lots of bins & table 2 scales amplitudes (= no change)  
i2 3 2.76   300     3    ; table 3 scales amplitudes
i2 6 2.76   300     4    ; table 4 scales amplitudes
s
;          bins   table
i2 0 2.76   30      2    ; a few bins & table 2 scales amplitudes (= no change)  
i2 3 2.76   30      3    ; table 3 scales amplitudes
i2 6 2.76   30      4    ; table 4 scales amplitudes
e
</CsScore>
</CsoundSynthesizer>


Crédits

Auteur : Richard Karpen
Seattle, WA USA
1998

Nouveau dans la version 3.48 de Csound, arguments supplémentaires dans la version 3.56