beadsynt

beadsynt — Banc d'oscillateurs à bande améliorée.

Description

Opcode du greffon beosc.

Banc d'oscillateurs à bande améliorée, portage de l'oscillateur de loris (basé sur BEAdsynt de Supercollider). Peut fonctionner avec des tableaux et des tables de fonction. La famille d'opcodes à bande améliorée (beosc, beadsynt) implémente une modélisation du son et une synthèse qui préservent l'élégance et la souplesse du modèle sinusoïdal tout en ajustant les sons avec des composantes bruiteuses (non sinusoïdales). L'analyse est faite hors-ligne par une méthode de McAulay-Quatieri (MQ) améliorée qui extrait l'information de largeur de bande en plus des paramètres sinusoïdaux pour chaque partiel. Pour produire les composantes bruiteuses, la synthèse est faite avec des oscillateurs sinusoïdaux modifiés pour permettre l'introduction d'une largeur de bande variable.

La synthèse peut être contrôlée via un ensemble d'indicateurs (voir iflags), permettant de choisir entre bruit uniforme et bruit gaussien pour les composantes bruiteuses, table d'onde interpolée (désactivée pour économiser le cpu), et interpolation de fréquence entre les cycles-k (désactivée pour économiser le cpu).

[Note] Note

L'implémentation originale (loris) utilise du bruit gaussien (normal) pour les composantes non sinusoïdales, qui, lorsqu'il est implémenté naïvement comme dans loris, consomme beaucoup de ressources cpu. Le portage dans Supercollider utilise un simple bruit uniforme. Nous implémentons les deux, avec une implémentation très efficace du bruit gaussien (utilisant une table précalculée), ce qui le rend presque aussi efficace que le bruit uniforme.

Syntaxe

aout beadsynt kFreqs[], kAmps[], kBws[] \
                   [, inumosc, iflags, kfreq, kbw, ifn, iphs ]
aout beadsynt ifreqft, iampft, ibwft, inumosc \
                   [, iflags, kfreq, kbw, ifn, iphs ]

Initialisation

ifreqft -- Une table contenant les fréquences pour chaque partiel.

iampft -- Une table contenant les amplitudes pour chaque partiel.

ibwft -- Une table contenant les largeurs de bande pour chaque partiel.

inumosc -- Le nombre de partiels à resynthétiser. dans la version avec tableaux, on peut le laisser non initialisé.

iflags -- 0 : bruit uniforme noise, 1 : bruit gaussien, +2 : oscillateur à interpolation linéaire, +4 : interpolation des fréquences. Vaut 1 par défaut.

ifn -- Une table contenant une onde sinus (ou -1 pour utiliser la table interne). Vaut -1 par défaut.

iphs -- Phase initiale. -1 : aléatoire, 0..1 : phase, > 1 : numéro d'une table contenant les phases. Vaut -1 par défaut.

Exécution

aout -- Le son généré.

kFreqs[] -- Un tableau contenant les fréquences de chaque partiel.

kAmps[] -- Un tableau contenant les amplitudes de chaque partiel.

kBws[] -- Un tableau contenant les largeurs de bande de chaque partiel.

kfreq -- Pondération des fréquences. Toutes les fréquences sont multipliées par ce facteur (1 par défaut).

kbw -- Pondération de la largeur de bande. Toutes les largeur de bande sont multipliées par ce facteur (1 par défaut).

[Note] Note

kFreqs[], kAmps[] et kBws[] doivent avoir la même taille (ceci vaut également pour ifreqft, iampft et ibwft).

Exemples

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

Exemple 88. Exemple de l'opcode beadsynt.

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>
-odac
</CsOptions>
<CsInstruments>

/*

This is the example file for beadsynt

beadsynt
========

Band-enhanced additive synthesis.
A port of Loris' band-enhanced resynthesis algorithms
(basen on Supercollider's BEOsc)

The band-enhanced family of opcodes (beosc, beadsynt) implement
sound modeling and synthesis that preserves the elegance and
malleability of a sinusoidal model, while accommodating sounds
with noisy (non-sinusoidal) components. Analysis is done offline,
with an enhanced McAulay-Quatieri (MQ) style analysis that extracts
bandwidth information in addition to the sinusoidal parameters for
each partial. To produce noisy components, we synthesize with sine
wave oscillators that have been modified to allow the introduction
of variable bandwidth.

Syntax
======

beadsynt exists in two forms, one using arrays, the other using f-tables

aout beadsynt kFreqs[], kAmps[], kBws[], inumosc=-1, iflags=1, kfreq=1, kbw=1, ifn=-1, iphs=-1
aout beadsynt ifreqft, iampft, ibwft, inumosc, iflags=1, kfreq=1, kbw=1, ifn=-1, iphs=-1

kFreqs[]: an array holding the frequencies of each partial
kAmps[]: an array holding the amplitudes of each partial
kBws[]: an array holding the bandwidths of each partial
ifreqft: a table holding the frequencies of each partial
iampft: a table holding the amplitudes of each partial
ibwft: a table holding the bandwidths of each partial
inumosc: the number of partials to resynthesize (-1 to synthesize all)
iflags: 0: uniform noise
        1: gaussian noise
       +2: use linear interpolation for the oscil (similar to oscili)
       +4: freq interpolation
kfreq: freq. scaling factor
kbw: bandwidth scaling factor
ifn: a table holding a sine wave (or -1 to use builtin sine)
iphs: initial phase of the oscillators.
      -1: randomize phase (default)
     0-1: initial phase
     >=1: table holding the phase for each oscillator (size>=inumosc)

NB: kFreqs, kAmps and kBws must all be the same size (this also holds true for
    ifreqft, iampfr and ibwft)

This example uses the analysis file fox.mtx.wav which was produced with
loristrck_pack, see https://github.com/gesellkammer/loristrck

*/

sr = 44100
ksmps = 128
nchnls = 2
0dbfs = 1.0

gispectrum ftgen 0, 0, 0, -1, "fox.mtx.wav", 0, 0, 0

instr 1
  ifn = gispectrum
  iskip      tab_i 0, ifn
  idt        tab_i 1, ifn
  inumcols   tab_i 2, ifn
  inumrows   tab_i 3, ifn
  itimestart tab_i 4, ifn
  inumpartials = inumcols / 3 
  imaxrow = inumrows - 2
  it = ksmps / sr
  igain init 1
  ispeed init 1
  idur = imaxrow * idt / ispeed
  kGains[] init inumpartials
  kfilter init 0
  ifreqscale init 1
  
  kt timeinsts
  kplayhead = phasor:k(ispeed/idur)*idur
  krow = kplayhead / idt
  kF[] getrowlin krow, ifn, inumcols, iskip, 0, 0, 3
  kA[] getrowlin krow, ifn, inumcols, iskip, 1, 0, 3
  kB[] getrowlin krow, ifn, inumcols, iskip, 2, 0, 3

  if(kt > idur*0.5) then
    kfilter = 1
  endif

  if (kfilter == 1) then
    kGains bpf kF, 300, 0.001, 400, 1, 1000, 1, 1100, 0.001
    kA *= kGains
  endif 
   
  iflags = 0    ; uniform noise, no interpolation
  aout beadsynt kF, kA, kB, -1, iflags, ifreqscale
   
  if(kt > idur) then
    event "e", 0, 0, 0
  endif
  aenv cosseg 0, 0.02, igain, idur-0.02-0.1, igain, 0.1, 0
  aout *= aenv
  outs aout, aout
endin

schedule 1, 0, -1

</CsInstruments>
<CsScore>
</CsScore>
</CsoundSynthesizer>


Voir aussi

beosc, adsynt2,

Crédits

Auteur : Eduardo Moguillansky 2018

Nouveau greffon dans la version 6.12