sndwarp

sndwarp — Lit un son mono échantillonné dans une table et lui applique une modification de durée et/ou de hauteur.

Description

sndwarp lit des échantillons sonores dans une table et applique une modification de durée et/ou de hauteur. Les modifications du temps et de la fréquence sont indépendantes l'une de l'autre. Par exemple un son peut être ralenti en durée tout en étant transposé dans l'aigu !

Les arguments de taille de fenêtre et de chevauchement influent grandement sur le résultat et seront fixés par expérimentation. En général ils doivent être aussi petits que possible. Par exemple, on peut commencer avec iwsize=sr/10 et ioverlap=15. Essayer irandw=iwsize*0,2. Si l'on peut arriver à ses fins avec moins de chevauchements, le programme sera plus rapide. Mais si ces dernières sont en nombre insuffisant, on peut entendre des fluctuations d'amplitude. L'algorithme réagit différemment selon le son en entrée et il n'y a pas de règle fixe adaptée à toutes les circonstances. Si l'on arrive à trouver les bons réglages, on peut obtenir d'excellents résultats.

Syntaxe

ares [, ac] sndwarp xamp, xtimewarp, xresample, ifn1, ibeg, iwsize, \
      irandw, ioverlap, ifn2, itimemode

Initialisation

ifn1 -- le numéro de la table contenant les échantillons qui seront traités par sndwarp. GEN01 est le générateur de fonction approprié pour mémoriser les échantillons d'un fichier son pré-existant.

ibeg -- le temps en secondes à partir duquel commencera la lecture dans la table. Lorsque itimemode est différent de zéro, la valeur de xtimewarp est décalée de ibeg.

iwsize -- la taille en échantillons de la fenêtre utilisée dans l'algorithme de variation de la durée.

irandw -- la largeur de bande d'un générateur de nombres aléatoires. Les nombres aléatoires seront ajoutés à iwsize.

ioverlap -- détermine la densité de fenêtres se chevauchant.

ifn2 -- une fonction qui fournit la forme de la fenêtre. On l'utilise habituellement pour créer une sorte de rampe qui part de zéro au début et qui y retourne à la fin de chaque fenêtre. Essayer d'utiliser une moitié de sinusoïde (c-à-d : f1 0 16384 9 .5 1 0) qui fonctionne plutôt bien. On peut utiliser d'autres formes.

Exécution

ares -- l'unique canal de sortie du générateur unitaire sndwarp. sndwarp suppose que la table de fonction contenant le signal échantillonné est monophonique. sndwarp indexera la table avec un incrément d'un seul échantillon. Il faut ainsi remarquer que si l'on utilise un signal stéréo avec sndwarp, la durée et la hauteur seront altérées en conséquence.

ac (facultatif) -- une version mono-couche (pas de superpositions), et non fenêtrée du signal modifié en durée et/ou en hauteur. Elle est fournie afin de permettre de pondérer l'amplitude du signal de sortie, qui contient habituellement beaucoup de versions se chevauchant et fenêtrées du signal, avec une version épurée du signal modifié en durée et en hauteur. Le traitement de sndwarp peut causer des variations notables en amplitude (en plus ou en moins), à cause de la différence de temps entre les superpositions lorsque la variation de durée est appliquée. Si on l'utilise avec une unité balance, ac permet d'améliorer grandement la qualité sonore.

xamp -- la valeur qui sert à pondérer l'amplitude (voir la note sur son utilisation avec ac).

xtimewarp -- détermine comment la durée du signal en entrée sera allongée ou raccourcie. Il y a deux manières d'utiliser cet argument selon la valeur donnée à itimemode. Si la valeur de itimemode est 0, xtimewarp changera l'échelle temporelle du son. Par exemple, une valeur de 2 doublera la durée du son. Si itimemode a une valeur non nulle, alors xtimewarp est utilisé comme un pointeur temporel de la même manière que dans lpread et dans pvoc. Un des exemples ci-dessous illustre cette possibilité. Dans les deux cas, la hauteur ne sera pas altérée par le traitement. La transposition de hauteur est effectuée indépendamment au moyen de xresample.

xresample -- le facteur de changement de la hauteur du son. Par exemple, une valeur de 2 produira un son une octave plus haut que l'original. La durée du son, quant à elle, ne sera pas modifiée.

Exemples

Voici en exemple de l'opcode sndwarp. Il utilise le fichier sndwarp.csd.

Exemple 983. Exemple de l'opcode sndwarp.

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

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

instr 1

ktimewarp line 0, p3, 2.7	;length of "fox.wav"
kresample init 1		;do not change pitch
ibeg = 0			;start at beginning
kwsize  line 4410, p3, 2000
iwsize = 4410			;window size in samples with
irandw = 882			;bandwidth of a random number generator
itimemode = 1			;ktimewarp is "time" pointer
ioverlap = p4

asig  sndwarp  .5, ktimewarp, kresample, 1, ibeg, iwsize, irandw, ioverlap, 2, itimemode
asig2 sndwarp2 .5, ktimewarp, kresample, 1, ibeg, kwsize, irandw, ioverlap, 2, itimemode
     outs asig, asig2

endin
</CsInstruments>
<CsScore>
f 1 0 131072 1 "fox.wav" 0 0 0	; audio file
f 2 0 1024 9 0.5 1 0		; half of a sine wave

i 1 0 7 2			;different overlaps
i 1 + 7 5
i 1 + 7 15
e

</CsScore>
</CsoundSynthesizer>


L'exemple ci-dessous montre un ralentissement du son stocké dans la table (ifn1). Pendant toute la durée de la note, le ralentissement s'intensifiera depuis l'original jusqu'à un son dix fois plus « lent » que l'original. Pendant ce temps, la hauteur montera progressivement d'une octave.

iwindfun = 1
isampfun = 2
ibeg = 0
iwindsize = 2000
iwindrand = 400
ioverlap = 10
awarp   line    1, p3, 1
aresamp line    1, p3, 2
kenv    line    1, p3, .1
asig    sndwarp kenv, awarp, aresamp, isampfun, ibeg, iwindsize, iwindrand, ioverlap, iwindfun, 0

Voici maintenant un exemple utilisant xtimewarp comme pointeur temporel et la stéréophonie :

itimemode     =         1
atime         line      0, p3, 10
ar1, ar2      sndwarpst kenv, atime, aresamp, sampfun, ibeg, iwindsize, iwindrand, ioverlap, \
                        iwindfun, itimemode

Ci-dessus, atime avance le pointeur temporel utilisé dans sndwarpst de 0 à 10 sur toute la durée de la note. Si p3 vaut 20 alors le son sera deux fois plus lent que l'original. Bien sûr, on peut utiliser une fonction plus complexe qu'une simple ligne droite pour contrôler le facteur temporel.

Maintenant le même exemple que ci-dessus mais en utilisant la fonction balance avec les sorties facultatives :

asig, acmp  sndwarp 1, awarp, aresamp, isampfun, ibeg, iwindsize, iwindrand, ioverlap, iwindfun, itimemode
abal        balance asig, acmp
  
asig1,asig2,acmp1,acmp2 sndwarpst 1, atime, aresamp, sampfun, ibeg, iwindsize, iwindrand, ioverlap, \
                                  iwindfun, itimemode
abal1       balance asig1, acmp1
abal2       balance asig2, acmp2

Noter l'utilisation de l'unité balance dans les deux exemples ci-dessus. La sortie de balance peut ensuite être pondérée, enveloppée, envoyée à un out ou un outs, etc. Noter que les arguments d'amplitude de sndwarp et de sndwarpst valent « 1 » dans ces exemples. En pondérant le signal après son traitement par sndwarp, abal, abal1, et abal2 contiendront des signaux ayant à peu près la même amplitude que le signal original traité par sndwarp. Il est ainsi plus facile de prédire les niveaux et d'éviter d'avoir des échantillons hors intervalle ou des valeurs d'échantillon trop petites.

[Note] Conseil Supplémentaire

N'utilisez la version stéréo que si vous avez réellement besoin de traiter un fichier stéréo. Elle est sensiblement plus lente que la version mono et si vous utilisez la fonction balance, c'est encore plus lent. Il n'y a aucun inconvénient à utiliser un sndwarp mono dans un orchestre stéréo puis d'envoyer le résultat à un ou aux deux canaux de la sortie stéréo.

Voir aussi

sndwarpst

Crédits

Auteur : Richard Karpen
Seattle, WA USA
1997