beadsynt

Abstract

Band-Enhanced Oscillator-Bank

Description

Band-Enhanced oscillator-bank, a port of Loris' oscillator (based on Supercollider's Beadsynt). Can work both with arrays and tables. 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.

The synthesis can be controlled via a set of flags (see iflags), allowing to switch between unifrom or gaussian noise for the noise components, wavetable interpolation (switch off to save cpu), and freq. interpolation between k-cycles (switch off to save cpu)

Note

kFreqs[], kAmps[] and kBws[] must all be the same size (this also holds true for ifreqft, iampft and ibwft)

Flags

The iflags value controls a series of behaviours. It controls the noise shape used for the residual spectrum (uniform or gaussian noise); whether to use linear interpolation in the oscillator; and if the frequency value of an oscillator is interpolated within a performance pass (relevant if frequencies are changing fast and ksmps is high)

iflags Description
+1 Uniform noise / Gaussian noise
+2 Fast (no interpolation) oscillator / Linear interpolation
+4 No frequency interpolation / Frequency interpolation

Syntax

aout beadsynt kFreqs[], kAmps[], kBws[], inumosc, 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

Arguments

  • 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
  • kfreq: Freq. scaling, all frequencies are multiplied by this (default = 1)
  • kbw: Bandwidth scaling, all bandwidths are multiplied by this (default = 1)
  • inumosc: the number of partials to resynthesize. In the array case, it can be left unset.
  • iflags: flags controlling oscillator quality, noise type and frequency interpolation. See table
  • ibwft: A table holding the bandwidths for each partial
  • iampft: A table holding the amplitudes for each partial
  • ifreqft: A table holding the frequencies for each partial
  • ifn: A table holding a sine wave (or -1 to use the builtin table) (default = -1)
  • iphs: Initial phase. -1: randomized, 0-1: initial phase, >1: table number holding the phases (default = -1)

Output

  • aout: The generated sound

Execution Time

  • Performance

Examples

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>

/*

This example uses the analysis file fox.mtx which was produced with 
loristrck_pack, see https://github.com/gesellkammer/loristrck
The file is in fact a wav file, with the difference that the wav format is used 
as a binary exchange format

*/

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

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

instr 1
  ifn = gispectrum
  iskip      tab_i 0, ifn
  inumrows   tab_i 1, ifn
  inumcols   tab_i 2, ifn
  it0 = tab_i(iskip, ifn)
  it1 = tab_i(iskip+inumcols, ifn)
  idt = it1 - it0
  inumpartials = (inumcols-1) / 3 
  imaxrow = inumrows - 2
  it = ksmps / sr
  igain init 1
  ispeed init 0.3
  idur = imaxrow * idt / ispeed
  kGains[] init inumpartials
  kfilter init 0
  ifreqscale init 1

  kt timeinsts
  kplayhead = phasor:k(ispeed/idur)*idur
  krow = kplayhead / idt
  ; each row has the format frametime, freq0, amp0, bandwidth0, freq1, amp1, bandwidth1, ...
  kF[] getrowlin krow, ifn, inumcols, iskip, 1, 0, 3
  kA[] getrowlin krow, ifn, inumcols, iskip, 2, 0, 3
  kB[] getrowlin krow, ifn, inumcols, iskip, 3, 0, 3

  if(kt > idur*0.6) then
    if metro(0) == 1 then
      println "Applying filter: bandpass between 1000-1500 Hz"
    endif
    kfilter = 1
  endif

  ifilterGain = 3    
  if (kfilter == 1) then
    kGains bpf kF, 990, 0.001, 1000, ifilterGain, 1500, ifilterGain, 1510, 0.01
    kA *= kGains
  endif 

  iflags = 7  ; max. quality
  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>

See also

Credits

Eduardo Moguillansky, 2019