"padsynth" — Génère une table d'échantillons au moyen de l'algorithme padsynth.
Opcode du greffon padsynth.
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)
f # score_time table_size "padsynth" fundamental_frequency
partial_bandwidth partial_scale harmonic_stretch profile_shape profile_shape_parameter
partial1_amplitude [partial2_amplitude ...]
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).
Voici un exemple de la routine GENpadsynth. Il utilise le fichier padsynth_gen.csd.
Exemple 1322. 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>