You are on page 1of 25

Spectral Suite

All rights reserved

(c) 2019 Cristian Vogel
(p) 2019 NeverEngine Labs

email: support@neverenginelabs.com_
No part of this software, intellectual property, design or
documentation may be packaged or included in any other commercial
or non-commercial form without the explicit written permission of
the author.

All unprocessed audio examples are subject to copyright and may

not be used without the correct usage license.

'Living' source sample (c) Jan Gunnar Hoff used with kind
permission from the composer

Many thanks to Gustav Scholda, Symbolic Sound, Will Klingenmeier and Anders

Skibstead for their technical support and suggestions.

Huge thanks to SØS Gunver Ryberg for her encouragement, patience and un-

derstanding during the long design and development of this deep spectral instru-


Class Descriptions


This version of the Spectral Suite is specifically designed for realtime spectral ma-

nipulations from any source (live input, sample based sources, realtime Kyma

Sounds etc)

For best performance, it is recommended to operate at 44.1 or 48K sample

rate. In frequency domain processing, higher sample rates do not make a signifi-

cant difference to high frequency information.

First user decision is to choose an FFTSize. 4096 is good for most purpose and

is used as a default in most of the examples. Other valid FFTSizes are 512, 1024,

2048, 4096, 8192, 16384. Longer sizes will introduce longer latency which means

that changes to controls will not affect the output immediately. Also transients are

not well defined at the output, but on the other hand longer frame sizes are great

for deep and rich textures. Shorter FFT sizes can sound metallic and sharp, which

may be desirable.

As a means to optimising realtime processing efficiency in the spectral suite,

analysis and resynthesis is done only once internally. In order to introduce modu-

larity to the signal flow, SpectralSuite introduces a novel method for user selectable

builds ( see BuildOptions parameter description below for details). The whole set

of processors runs out of realtime when in stereo on a Paca at 48K. In the future,

the full suite in stereo for Paca owners may become possible as we find further

ways too optimise. In the meantime, Paca owners need to use the BuildOptions to

select which modules to disable when stereo processing is desired.

Another use for BuildOptions is for user optimisation towards just one or two

spectral processors that may be sharing DSP resources with other Kyma Sounds in

a larger design. The main point is that the User can tune performance and make

aesthetic decisions regarding the Spectral Suite processors when used with other

Kyma programming contexts. The Virtual Control Surface user interface for control-

ling the Spectral Suite will try to adapt when BuildOptions is used, so that the con-

trols related to disabled processors do not clutter up the VCS.

See the SpectralSuite examples to see how to use the BuildOptions for Paca

and Pacarana.


(c) 2017-2020 Cristian Vogel

(p) NeverEngineLabs 2019

Allowed values are 256 / 512 / 1024 / 2048 / 4096 / 8192 / 16384

This is the main frame size. It will influence the through time and reaction time.

An FFT of 4096 is probably good in most situations, but feel free to experiment

with short and long frame sizes.

This is the two channel input sound that will be passed through theSpectral Proces-


InputX: The Sound source at InputX crosses its spectral magnitude envelope with

the source at Input when the inputX option is active in the BuildOptions.

This Sound is ignored when inputX is false in the BuildOptions.

These are the options for building the FFT Suite. Make sure to use only the key-

words 'true' or 'false'.

If you are a Paca user and want stereo try deranger false shuffler false track-

Delays or masks also to false.


#stereo true or false

Builds stereo processing when true and mono when false. Big DSP difference

between Stereo and Mono. Please note that stereo width controls in the phase syn-

thesis section will be de-activated when stereo is set to false.

#inputx true or false

Activates the Sound source at InputX and crosses its spectral envelope with the

source at Input

#tonalNoise true or false

Builds the Tonal Noise split module. Activates its relevant parameter controls

#deranger true or false

Builds the Pitch Deranger module. Activates its relevant parameter controls.

Paca users could bypass this one to go stereo.

#masks true or false

Builds the Stochastic Masking module. Activates its relevant parameter con-


#shapedFreeze true or false

Builds the shaped freeze module. Activates its relevant parameter controls.

#shuffler true or falseBuilds the shuffle module. Activates

its relevant parameter controls. Paca users could also bypass

this one to go stereo.

#phasor true or false

Builds the Complex Phasor deranger module. Activates its relevant parameter


#phasorScope true or false

Builds the scope for the Complex Phasor.

#postFilters true or false

#preFilters true or false

Builds either pre- or post- FFT time domain filtering. Activates the time domain

filtering parameter controls.

#spectralDynamics true or false

Builds the Spectral Dynamics module. Activates its relevant parameter controls.

#spectralEnvelopes true or false

Builds the Spectral Envelopes module. Activates its relevant parameter con-


#spectrogram true or false

Builds the Output spectrogram.

#trackDelays true or false

Builds the TrackDelays module which is the last processor in the chain. Acti-

vates its relevant parameter controls. Paca users could also bypass this one to go


InputProcessing: Attenuator on the input level.

TimeDomainProcessing low pass filtering on the input

TimeDomainProcessing high pass filtering on the input

ShapeProgrammer: Load in a multicycle file of concatenated wavetables of 4096

samples in length. These will become the basic shapes which can be selected us-

ing the !ShapeForm parameter and further transformed using the other shape pro-

grammer controls. Use the NeverEngineLabs ROMTools or a DAW to create new

'necklaces' of wavetables.

Alternatively simply load in any sample file and the !ShapeForm paramater will

skip through it as if it were 4096 sample wavetables, providing many new shapes

to sculpt with.

ShapeProgrammer: Scrub the shaper waveform around

ShapeProgrammer: Shift the freeze shaper wave form - this has the effect of rotat-

ing its effect through the spectral frames. The most audible effects wil happen to-

wards the lower end of the Frame , where magnitudes are highest

ShapeProgrammer: alter the bandwith of the shaper waveform

ShapeProgrammer: morph the waveform of the shaper extracting 4096 sample

cycles from the audio file specified in ShapeWaves field

ShapeProgrammer: offset the shaper waveform - note a point of the shape clips

to 1 at the top of the framescope

ShapeProgrammer: scale the shape being used as a waveform

ShapeProgrammer: Tilt the shaper in a positive or negative direction. 0 means

flat. Generally, the left end of the shape on the scope, is where the lower bins are,

which contain the most energy. So a tilt helps emphasise them in the freezing ef-


ShapeProgrammer: a hot value constant either 1,2,3 or 4 defines the Order of

magnitude or exponentiation factor of the waveform

#ShapeProgrammer: Routes the shaper to the FormantShifter offsets. The shape

will be expressed by proportionally pitch shifting each bin seperately. A value of 0

bypasses the routing.

ShapeProgrammer: Routes the shaper to the ShapedFreeze module. The shape

will affect how frozen each bin is, and how loud it is in the spectrum.

ShapeProgrammer: Routes the Shape Programmer to interact with the thousands

of masking thresholds filtering each bin in and out of the spectrum.

ShapeProgrammer: Routes the Shape Programmer to interact with the thousands

of Delay times affecting each bin.

ShapeProgrammer: Routes the shaper to the SpectralDynamics thresholding.

The shape will be blended with the default frequency weighted curve being used

to threshold the magnitude of each bin.

FrameShuffler: Blend in the frame shuffling effect

FrameShuffler: bypass the frame shuffler effect

FrameShuffler: Introduces jitter into the sequence of recalled frozen frames

FrameShuffler: No Capytalk here. This defines the number of storable Frames that

can be grab and recalled at the current shuffle speed. 10 is a good value, try more

or less. This number impacts the DSP quite a lot, so keep it low.

FrameShuffler: the rate at which new frames are grabbed and shuffled. It cannot

go faster than FFTSize samp bpm

ShapedFreeze: Perform a full freeze when this value is non-zero. Full freeze takes a

snapshot of the current frame and hangs it. So you will need to use the ResetFreeze

parameter to grab a new frame from the input stream.

ShapedFreeze: When this parameter is positive, frozen or partially frozen frames

will be subtracted from the spectrum. Adjusting the FrozenLevel will also affect the

amount of subtraction.

ShapedFreeze: a non-zero value bypasses Shaped Freezing

ShapedFreeze: A positive value here, will unfreeze everything momentarily so that

if any bins were fully frozen by the shape programmer ( they have a value of 1 or

very close to 1) or the FullFreeze is on, then they will change immediately and

freeze again with the spectrum from the newest frame. It also affects partially frozen


ShapedFreeze: This is a level for the spectral Tracks that are currently being frozen

(or partially frozen)

ShapedFreeze: This is a level for the spectral Tracks that are currently not being

frozen (or partially frozen)

TonalNoise: Blends the tonal noise balance.

TonalNoise: Mixes Noisier frames louder through the algorithm

TonalNoise: Extra gain setting for the Tonal content of the signal.

FormantMod: Shifts the whole spectrum upwards and downwards in pitch using a

spectral stretch ( a vertical stretch through the frequencies )

FormantMod: Stretches or compresses the frequency spectrum, without shifting it.

For example a full spectrum ( this setting at 0) filling 4096 bins could be packed

into to much fewer bins dialing this value in the negative direction - this has the ef-

fect of limiting the pitch deviation range of the original signal. Similarly stretching it

upwards (positive values) spreads the range of signal throughout the full spectrum.

FormantMod: introduce negative or positive pitch derangement applying Holt-

Winters double exponential smoothing to every single bin agnitude independent-

ly. Explore this parameter at full negative or positive range for complex content re-

lated pitch perturbations.

FormantMod: even more complex pitch derangement

DeepBlur: Resets the time constants and start times of each bin, after shaping

from the Shaped Freezing module or Spread controls....

DeepBlur: Reverses the direction of the interpolations so that they interpolate

backwards over their time constants.

DeepBlur: When postive, the blurring will smoothly interpolate each sampled

point of each bin over the duration of the (shaped) BlurTimeConstant. When this is

zero, it will instead hold or 'freeze' each sampled point of each bin, resulting in

more of a (shaped) spectral sample and hold kind of effect.

DeepBlur: The base time constant for the deep blur interpolations. Points of the

magnitude spectrum for each bin will be sampled every TimeConstant seconds

and the interpolation from one point to the next will occur over this duration. There

may be up to 16384 simultaneous interpolations happening according to the FFT-


DeepBlur: at 0 , the start times of each bins magnitude blur is aligned. At 1 (or -1)

the start times are offset from each other, high bins could start their interpolations

much later than low bins, or vice versa

masks: Scales the influence of Masks. Masks is a stochastic filter. It selects whether

a bin will be resynthesised or not, according to whether a slowly (or quickly) chang-

ing random walk has crossed a threshold. The threshold is defined by the !Masking

value. At 0 there is no masking.

The choice is windowed, meaning that a selection will fade in and/or out over

an arbitrary duration. There maybe up to 16384 masking windows occuring simul-

taneously according to the FFTsize, triggered by up to 16384 independent random


masks: how long a selected bin will fade in

masks: how long a selected bin will fade out

masks: influence the stochastic algorithm selected which bins are selected and un-


masks: the time constant defining the rate of updates for the stochastic path aka

random walk

SpectralEnvelopes: Load in a multicycle file of concatenated wavetables of 4096

samples in length. These will become the basic shapes which can be selected us-

ing the !SpecEnvelopeShape. Use the NeverEngineLabs ROMTools or a DAW to

create new 'necklaces' of wavetables.

Alternatively simply load in any sample file and the !SpecEnvelopeShape para-

meter will skip through it as if it were 4096 sample wavetables, providing many

new shapes to sculpt with.

SpectralEnvelopes: Basic Low Speed of the Envelope LFO. Keep it relatively low

for best results, its an LFO rate.

SpectralEnvelopes: Scale the effect of the Spectral Envelopes on the magnitude

modulation. These are envelopes that are all slighlty out of phase with each other

scaling the magnitudes of each bin. There maybe up to 16384 of these envelopes

acting at once! This is of course defined by the FFTSize.

SpectralEnvelopes: morph through different spectral envelope shapes

SpectralEnvelopes: This field should contain two parameters, hot values must be

contained in curly brackets. Like this example:

{!specenv.x smoothFor: 2 s} {1 s tick nextChaotic7}

These represent phase shifting modulation of the Spectral Envelope 'polysignal'

algorithm. The 'polysignal' is a WireFrames concept ( see our library WireFrames to

discover more). The Spectral Envelope algorithm expresses a continuosly changing

wavetable as a multitude of descynchronised, dephased low frequency oscillators

altering the magnitude of each bin independently. A scope is generated to visu-

alise the effect on the frequency domain information.

SpectralEnvelopes: Resets all the spectral envelopes phase synchronisation

Phasor: Scales the influence of Complex Phasing

phasor: a non-zero value will put the modulation into fine tune mode

phasor: At 0.5 this parameter will stop the formant peaks from moving through the

frequency spectrum. Towards 0 will begin to move the peaks downwards through

the spectrum and towards 1 will move them upwards.

phasor: Morph smoothly through formant peak shapes

phasor: controls how many formant peaks will move through the spectrum

spectralDynamics: Specify the mix and type of spectral dynamic processing.

When this value is 0 then the effect of the spectral dynamics will be bypassed.

Between 0 and 0.5 the magnitudes of each FFT band will begin to duck ac-

cording to the thresholding (shaped) curve. At 0.25, there is parallel blend be-

tween the original magnitudes and the compressed frame. At 0.5 only the com-

pressed magnitudes will be heard.

When the value of !dynamics moves beyond 0.5 the magnitudes will begin to

expand ( go up in magnitude ) according to the thresholds. There is a scope to ob-

serve what is happening.

SpectralDynamics: This file will be applied as a frequency weighting curve on the

spectral dynamics. See examples in the Spectral Suite folder.Feel free to

design your own.

spectralDynamics: introduces a curvature to the thresholds influencing the com-

pander - use it to explore different emphasis in the dynamic spectrum, lower fre-

quency mags will be heard more when this value is negative and higher frequency

mags will be heard more when positive.

spectralDynamics: Specify a ceiling for the recalculated dynamics of the spec-

trum. At full, you may experience some clipping especially when expanding.

spectralDynamics: a base threshold value for each of the individual thresholds

acting on the bins. Explore according to the dynamics of the source material

spectralDynamics: set attack reaction time of complex compander

spectralDynamics: set release reaction time of complex compander

StereoPhaseSynthesis: There are two main modes for handling phase relation-

ships. Extract tries to match the original phase information as much as possible.

Magic Dust randomises the phase information, creating a diffuse and smooth re-

sult. A value in between will introduce phase error glitching which may be interest-

ing in some cases.

StereoPhaseSynthesis: Rotates the stereo image of the MagicDust / DeepBlur

throughout the spectrum. Listen carefully on headphones to understand how this


StereoPhaseSynthesis: Narrows the stereo image of the MagicDust / DeepBlur

throughout the spectrum. Listen carefully on headphones to understand how this


PhaseResynthesis: Introduces a glitchy frame based signal to the magnitudes as

well as the phases when in Glitchy phases resynthesis mode. It means that the

glitching will be even more pronounced. Set it to 0 if you don't want this.

PhaseResynthesis: a kind of rate variation for the phase glitching resynthesis


PhaseResynthesis: a kind of shape variation for the phase glitching resynthesis


TrackDelays: No CapyTalk here! A fixed value in FRAMES for the maximum any bin

can be delayed when the sample value that affects it in the TrackDelay signal has a

value of 1.

To calculate a time in seconds, for example;

(10 s samp / FFTSize) removeUnits

TrackDelays: Scales the delay times of each individual Bin, by scaling the overall

shape of the Track Delays - whatever the might be

TrackDelays: This control tilts the TrackDelays shape. Its a form of programming

that each of the thousands of individual delay times is different. Experiment with

how it can make spectra feel harp-like, ascending or descending in frequency dis-

tribution over time

TrackDelays: Introduce feedback for each individually delayed bin.

TrackDelays: Blend the dry and delayed frequency domain processing

TrackDelays: a positive value will read the sample buffers in reverse, which is kind

of glitchy like a granular effect

TrackDelays: Bypasses the TrackDelays module when postive

A mid-side stereo width controller in the time domain, allowing better control over

the final spatial image.

Increase the output gain

Unique seed for seeding internal random algorithms such as masks