GENpadsynth

"padsynth" — Génère une table d'échantillons au moyen de l'algorithme padsynth.

Description

L'algorithme "padsynth" de Paul Octavian Nasca ajoute une largeur de bande à chaque partiel d'une forme d'onde périodique. Cette largeur de bande est entendue comme couleur, mouvement et enrichissement du son.

D'abord la forme d'onde est définie par l'utilisateur comme une série d'harmoniques. Puis une largeur de bande est ajoutée en étalant indépendamment chaque partiel de la forme d'onde originale depuis une fréquence vers ses voisines en suivant une fonction "profil" : une courbe gaussienne, une fonction carrée ou une exponentielle croissante puis décroissante.

On peut considérer les partiels de la forme d'onde originale comme des échantillons dans une transformée de Fourier discrète de la forme d'onde. Normalement il n'y a pas de correspondance exacte point à point entre les fréquences des échantillons (bins de fréquence) de la transformée de Fourier discrète et les fréquences des harmoniques de la forme d'onde originale, car toute fréquence dans l'inverse de la transformée de Fourier discrète pourrait être synthétisée par interférence entre n'importe quel nombre de bins. Cependant, l'algorithme padsynth utilise une petite astuce pour créer cette correspondance. La transformée de Fourier discrète est simplement rendue si grande que la fréquence de chaque harmonique de la forme d'onde originale sera très proche de la fréquence du bin correspondant dans la transformée de Fourier. Une fois cette correspondance créée, le profil de largeur de bande peut être appliqué en le centrant sur le bin de fréquence de l'harmonique original, en pondérant le profil par la largeur de bande et en multipliant simplement l'harmonique original par chaque échantillon du progil et en ajoutant le produit au bin correspondant de la transformée de Fourier.

Plus les fréquences des harmoniques augmentent, plus leur largeur de bande peut augmenter de manière facultative ou (moins souvent) diminuer.

Une fois les harmoniques étalés de cette manière, la transformée de Fourier discrète peut recevoir des phases aléatoires et est ensuite simplement inversée pour synthétiser la forme d'onde désirée, que l'on peut utiliser comme table d'onde d'un oscillateur numérique.

Nota bene : la taille de la table de fonction ne reflète pas nécessairement une période de la forme d'onde qu'elle contient. La fréquence fondamentale doit être utilisée pour générer la hauteur désirée par un oscillateur utilisant la table de fonction, par exemple

oscillator_hz = desired_hz * (sr / padsynth_size / fundamental_hz)

Syntaxe

f # score_time table_size "padsynth" fundamental_frequency
    partial_bandwidth partial_scale harmonic_stretch profile_shape profile_shape_parameter
    partial1_amplitude [partial2_amplitude ...]

Initialisation

table_size -- Taille de la table de fonction. Doit être grande, par exemple 218 == 262144. Doit être une puissance de 2 ou une puissance de 2 plus 1 (voir l'instruction f).

fundamental_frequency -- fréquence fondamentale pour la table générée.

partial_bandwidth -- largeur de bande de chaque partiel en cents.

partial_scale -- facteur de pondération pour la largeur de bande de chaque partiel (log de l'augmentation/diminution avec la fréquence d'harmonique, 0 signifiant pas d'étirement ni de compression).

harmonic_stretch -- Etirement/compression harmonique pour tous les partiels (1 est harmonique).

profile_shape -- Nombre indiquant la forme du profil de largeur de bande : 1 = gaussien, 2 = carré et 3 = exponentiel.

profile_shape_parameter -- Paramètre passé à la fonction générant la forme du profil, par exemple un exposant.

partial1_amplitude, partial2_amplitude, ... -- Amplitudes pour chaque harmonique (peut valoir zéro).

Exemples

Voici un exemple de la routine GENpadsynth. Il utilise le fichier padsynth_gen.csd.

Exemple 1172. Un exemple de la routine GENpadsynth.

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
sr=44100
ksmps=1
nchnls=2
0dbfs=2000

	gispec_len init 2^18

	instr 1
    prints "Plain sine for frequency/amplitude/distortion comparison.\n"
	gi_padsynth_1 ftgenonce 0, 0, gispec_len, 10, 1
    iattack = 0.08
    idecay = 0.1
    isustain = 0.25
    irelease = 0.2
    aenv madsr iattack, idecay, isustain, irelease
    ifreq cpsmidinn p4
    iamp ampdb p5
    ibasefreq = 440 ; can be lower or higher frequency; close to played frequency is said to be best
    ibw_cents = 56.96943 ; width of the peaks, 100 is semitone
	asig poscil iamp, ifreq, gi_padsynth_1
    asig = aenv * asig
	aleft, aright pan2 asig, 0.5
	outs aleft, aright
	endin

	instr 2
    prints "PadSynth with sine tone.\n"
    ibasehz = 261.625565
    ;                       p1 p2 p3          p4           p5       p6  p7    p8 p9  p10  p11
	gi_padsynth_1 ftgenonce 0, 0, gispec_len, "padsynth", ibasehz, p6, 0.0,  1, 1,  1.0, 1
    iattack = 0.08
    idecay = 0.1
    isustain = 0.25
    irelease = 0.2
    aenv madsr iattack, idecay, isustain, irelease
    ifreq cpsmidinn p4
    iamp ampdb p5
	asig poscil iamp, ifreq*(sr/gispec_len/ibasehz), gi_padsynth_1
    asig = aenv * asig
	aleft, aright pan2 asig, 0.5
	outs aleft, aright
	endin

	instr 3
    prints "PadSynth with harmonics.\n"
    ibasehz = 261.625565
    ;                       p1 p2 p3          p4           p5       p6  p7 p8 p9  p10  p11
	gi_padsynth_1 ftgenonce 0, 0, gispec_len, "padsynth", ibasehz, p6, 1, 1, 1,  1, 0.7600046992, 0.6199994683, 0.9399998784, 0.4400023818, 0.0600003302, 0.8499968648, 0.0899999291, 0.8199964762, 0.3199984133, 0.9400014281, 0.3000001907, 0.120003365, 0.1799997687, 0.5200006366, 0.9300042987
    iattack = 0.08
    idecay = 0.1
    isustain = 0.25
    irelease = 0.2
    aenv madsr iattack, idecay, isustain, irelease
    ifreq cpsmidinn p4
    iamp ampdb p5
	asig poscil iamp, ifreq*(sr/gispec_len/ibasehz), gi_padsynth_1
    asig = aenv * asig
	aleft, aright pan2 asig, 0.5
	outs aleft, aright
	endin

	instr 4
    prints "PadSynth with inharmonic partials.\n"
    ibasehz = 261.625565
    ;                       p1 p2 p3          p4           p5       p6  p7 p8 p9  p10  p11
	gi_padsynth_1 ftgenonce 0, 0, gispec_len, "padsynth", ibasehz, p6, 1, 2, 3,  1, 0.7600046992, 0.6199994683, 0.9399998784, 0.4400023818, 0.0600003302, 0.8499968648, 0.0899999291, 0.8199964762, 0.3199984133, 0.9400014281, 0.3000001907, 0.120003365, 0.1799997687, 0.5200006366, 0.9300042987
    iattack = 0.08
    idecay = 0.1
    isustain = 0.25
    irelease = 0.2
    aenv madsr iattack, idecay, isustain, irelease
    ifreq cpsmidinn p4
    iamp ampdb p5
	asig poscil iamp, ifreq*(sr/gispec_len/ibasehz), gi_padsynth_1
    asig = aenv * asig
	aleft, aright pan2 asig, 0.5
	outs aleft, aright
	endin


</CsInstruments>
<CsScore>



i1  0 2 60.00 60
i1  + 2 72.00 60
i1  + 2 84.00 60

i2  7 2 60.00 60 0.3
i2  + 2 72.00 60 0.3
i2  + 2 84.00 60 0.3
i2  + 2 60.00 60 25
i2  + 2 72.00 60 25
i2  + 2 84.00 60 25
i2  + 2 60.00 60 55
i2  + 2 72.00 60 55
i2  + 2 84.00 60 55

i3 26 2 60.00 60 0.3
i3  + 2 72.00 60 0.3
i3  + 2 84.00 60 0.3
i3  + 2 60.00 60 25
i3  + 2 72.00 60 25
i3  + 2 84.00 60 25
i3  + 2 60.00 60 55
i3  + 2 72.00 60 55
i3  + 2 84.00 60 55

i4 45 2 60.00 60 0.3
i4  + 2 72.00 60 0.3
i4  + 2 84.00 60 0.3
i4  + 2 60.00 60 25
i4  + 2 72.00 60 25
i4  + 2 84.00 60 25
i4  + 2 60.00 60 55
i4  + 2 72.00 60 55
i4  + 2 84.00 60 55

e
</CsScore>
</CsoundSynthesizer>


Voir aussi

Plus d'information sur padsynth : www.paulnasca.com/algorithms-created-by-me

Crédits

Ecrit par Michael Gogins

Nouveau dans la version 6.05