Vital
Loading...
Searching...
No Matches
vital::SynthOscillator Class Reference

A core oscillator processor that generates audio by reading wavetable data with various effects. More...

#include <synth_oscillator.h>

Inheritance diagram for vital::SynthOscillator:
vital::Processor

Classes

struct  VoiceBlock
 A helper struct for loading per-voice data during audio processing. More...
 

Public Types

enum  {
  kWaveFrame , kMidiNote , kMidiTrack , kSmoothlyInterpolate ,
  kTranspose , kTransposeQuantize , kTune , kAmplitude ,
  kPan , kUnisonVoices , kUnisonDetune , kPhase ,
  kDistortionPhase , kRandomPhase , kBlend , kStereoSpread ,
  kStackStyle , kDetunePower , kDetuneRange , kUnisonFrameSpread ,
  kUnisonDistortionSpread , kUnisonSpectralMorphSpread , kSpectralMorphType , kSpectralMorphAmount ,
  kSpectralUnison , kDistortionType , kDistortionAmount , kActiveVoices ,
  kReset , kRetrigger , kNumInputs
}
 
enum  { kRaw , kLevelled , kNumOutputs }
 
enum  SpectralMorph {
  kNoSpectralMorph , kVocode , kFormScale , kHarmonicScale ,
  kInharmonicScale , kSmear , kRandomAmplitudes , kLowPass ,
  kHighPass , kPhaseDisperse , kShepardTone , kSkew ,
  kNumSpectralMorphTypes
}
 Types of spectral morph effects that can be applied to the wavetable. More...
 
enum  DistortionType {
  kNone , kSync , kFormant , kQuantize ,
  kBend , kSqueeze , kPulseWidth , kFmOscillatorA ,
  kFmOscillatorB , kFmSample , kRmOscillatorA , kRmOscillatorB ,
  kRmSample , kNumDistortionTypes
}
 Types of distortion/waveshaping used by the oscillator. More...
 
enum  UnisonStackType {
  kNormal , kCenterDropOctave , kCenterDropOctave2 , kOctave ,
  kOctave2 , kPowerChord , kPowerChord2 , kMajorChord ,
  kMinorChord , kHarmonicSeries , kOddHarmonicSeries , kNumUnisonStackTypes
}
 Ways to stack unison voices for chord or harmonic effects. More...
 

Public Member Functions

 SynthOscillator (Wavetable *wavetable)
 Constructs a SynthOscillator with the specified Wavetable.
 
void reset (poly_mask reset_mask, poly_int sample)
 Resets oscillator state with an offset sample count.
 
void reset (poly_mask reset_mask) override
 Resets oscillator phase and other variables for specified voices.
 
void setSpectralMorphValues (SpectralMorph spectral_morph)
 Sets the spectral morph values for internal morphing.
 
void setDistortionValues (DistortionType distortion_type)
 Sets the distortion values for internal waveshaping/fm/rm.
 
void process (int num_samples) override
 Processes the oscillator for a given number of samples, writing to the output buffers.
 
Processorclone () const override
 Clones this oscillator, returning a new instance with the same parameters.
 
void setFirstOscillatorOutput (Output *oscillator)
 Assigns an oscillator Output pointer for FM/RM modulation (first mod oscillator).
 
void setSecondOscillatorOutput (Output *oscillator)
 Assigns an oscillator Output pointer for FM/RM modulation (second mod oscillator).
 
void setSampleOutput (Output *sample)
 Assigns a sample Output pointer for FM/RM modulation using a sample.
 
void setOversampleAmount (int oversample) override
 Overrides the base Processor method to set oversampling. Ensures internal buffers are large enough.
 
- Public Member Functions inherited from vital::Processor
 Processor (int num_inputs, int num_outputs, bool control_rate=false, int max_oversample=1)
 Constructs a Processor with a given number of inputs/outputs and oversampling.
 
virtual ~Processor ()
 Virtual destructor.
 
virtual bool hasState () const
 Indicates whether this Processor requires per-voice state.
 
virtual void processWithInput (const poly_float *audio_in, int num_samples)
 An optional processing function taking explicit input buffer. Fallback is an assertion failure (not supported).
 
virtual void init ()
 Called after constructor, used for any additional initialization. Subclasses can override. Sets the initialized flag.
 
virtual void hardReset ()
 Called to perform a "hard" reset for all voices.
 
bool initialized ()
 Returns whether this Processor has been initialized.
 
virtual void setSampleRate (int sample_rate)
 Updates the sample rate of this Processor (scaled by oversampling).
 
force_inline bool enabled () const
 Checks if this Processor is enabled.
 
virtual void enable (bool enable)
 Enables or disables this Processor.
 
force_inline int getSampleRate () const
 Retrieves the current (effective) sample rate.
 
force_inline int getOversampleAmount () const
 Retrieves the current oversampling factor.
 
force_inline bool isControlRate () const
 Checks if this Processor is running at control rate (buffer_size == 1).
 
virtual void setControlRate (bool control_rate)
 Sets whether this Processor runs at control rate.
 
force_inline poly_mask getResetMask (int input_index) const
 Retrieves a mask indicating which voices triggered a note-on event. Compares the input's trigger_value to kVoiceOn.
 
force_inline void clearOutputBufferForReset (poly_mask reset_mask, int input_index, int output_index) const
 Clears output samples for voices that are about to be reset, based on the trigger offset.
 
bool inputMatchesBufferSize (int input=0)
 Checks whether the buffer size of a particular input matches the size needed by this Processor.
 
bool checkInputAndOutputSize (int num_samples)
 Checks if all inputs and outputs have buffers big enough for num_samples.
 
virtual bool isPolyphonic () const
 Checks if this Processor is polyphonic by querying its ProcessorRouter.
 
void plug (const Output *source)
 Connects an external Output to this Processor's first input.
 
void plug (const Output *source, unsigned int input_index)
 Connects an external Output to a specified input index.
 
void plug (const Processor *source)
 Connects the first output of a Processor to this Processor's first input.
 
void plug (const Processor *source, unsigned int input_index)
 Connects the first output of a Processor to a specified input index.
 
void plugNext (const Output *source)
 Connects an external Output to the first available (unplugged) input.
 
void plugNext (const Processor *source)
 Connects the first output of a Processor to the first available (unplugged) input.
 
void useInput (Input *input)
 Uses an existing Input object as this Processor's first input.
 
void useInput (Input *input, int index)
 Uses an existing Input object at a specified input index.
 
void useOutput (Output *output)
 Uses an existing Output object as this Processor's first output.
 
void useOutput (Output *output, int index)
 Uses an existing Output object at a specified output index.
 
int connectedInputs ()
 Counts how many inputs are connected to a real source (not null_source_).
 
virtual void unplugIndex (unsigned int input_index)
 Removes the connection at a specified input index, if any.
 
virtual void unplug (const Output *source)
 Removes a connection to a given Output from all inputs.
 
virtual void unplug (const Processor *source)
 Removes connections to all outputs from a given Processor.
 
virtual void numInputsChanged ()
 Called when the number of inputs changes (e.g., new connections). Subclasses may override for dynamic behavior.
 
force_inline void router (ProcessorRouter *router)
 Sets the ProcessorRouter that owns or manages this Processor.
 
force_inline ProcessorRouterrouter () const
 Returns the ProcessorRouter that currently owns this Processor.
 
ProcessorRoutergetTopLevelRouter () const
 Gets the topmost (root) ProcessorRouter by traversing parent routers.
 
virtual void registerInput (Input *input, int index)
 Registers a new input, appending it to the input list.
 
virtual OutputregisterOutput (Output *output, int index)
 Registers a new Output in the output list at a specified index.
 
virtual void registerInput (Input *input)
 Registers a new Input by appending it to the end of the input list.
 
virtual OutputregisterOutput (Output *output)
 Registers a new Output by appending it to the end of the output list.
 
force_inline int numInputs () const
 Returns the total number of Input pointers (owned or otherwise).
 
force_inline int numOutputs () const
 Returns the total number of Output pointers (owned or otherwise).
 
force_inline int numOwnedInputs () const
 Returns how many Input objects this Processor owns.
 
force_inline int numOwnedOutputs () const
 Returns how many Output objects this Processor owns.
 
force_inline Inputinput (unsigned int index=0) const
 Retrieves the Input pointer at a given index.
 
force_inline bool isInputSourcePolyphonic (int index=0)
 Checks if the input source at a given index is polyphonic.
 
force_inline InputownedInput (unsigned int index=0) const
 Retrieves an owned Input pointer at a given index.
 
force_inline Outputoutput (unsigned int index=0) const
 Retrieves the Output pointer at a given index.
 
force_inline OutputownedOutput (unsigned int index=0) const
 Retrieves an owned Output pointer at a given index.
 
void setPluggingStart (int start)
 Sets the position at which plugNext starts searching for an open input.
 

Static Public Member Functions

static bool isFirstModulation (int type)
 Checks if distortion type uses the first modulation oscillator.
 
static bool isSecondModulation (int type)
 Checks if distortion type uses the second modulation oscillator.
 
static void setDistortionValues (DistortionType distortion_type, poly_float *values, int num_values, bool spread)
 Sets distortion values for an array of poly_float, handling unison spread if necessary.
 
static void setSpectralMorphValues (SpectralMorph spectral_morph, poly_float *values, int num_values, bool spread)
 Sets spectral morph values for an array of poly_float, handling unison spread if necessary.
 
static void runSpectralMorph (SpectralMorph morph_type, float morph_amount, const Wavetable::WavetableData *wavetable_data, int wavetable_index, poly_float *dest, FourierTransform *transform)
 Applies a spectral morph operation (e.g., vocode, smear) directly on a buffer.
 
static vital::poly_int adjustPhase (DistortionType distortion_type, poly_int phase, poly_float distortion_amount, poly_int distortion_phase)
 Adjusts phase for sync, formant, quantize, etc.
 
static vital::poly_float getPhaseWindow (DistortionType distortion_type, poly_int phase, poly_int distorted_phase)
 Retrieves a window multiplier (for example, half-sin window in formant mode).
 
static poly_float interpolate (const mono_float *buffer, const poly_int indices)
 Performs linear interpolation on a single wave buffer.
 
static bool usesDistortionPhase (DistortionType distortion_type)
 Checks if a given distortion type uses a separate distortion_phase (kSync, kQuantize, etc).
 

Static Public Attributes

static constexpr int kMaxUnison = 16
 Maximum number of unison voices.
 
static constexpr int kPolyPhasePerVoice = kMaxUnison / poly_float::kSize
 Number of poly phases used per voice.
 
static constexpr int kNumPolyPhase = kMaxUnison / 2
 Number of poly phases total.
 
static constexpr int kNumBuffers = kNumPolyPhase * poly_float::kSize
 Number of buffers to store waveforms, based on the number of poly phases.
 
static constexpr int kSpectralBufferSize = Wavetable::kWaveformSize * 2 / poly_float::kSize + poly_float::kSize
 Size of spectral buffer for Fourier transforms.
 
static const mono_float kStackMultipliers [kNumUnisonStackTypes][kNumPolyPhase]
 Precomputed multipliers used for stacking unison voices into intervals.
 

Additional Inherited Members

- Protected Member Functions inherited from vital::Processor
OutputaddOutput (int oversample=1)
 Creates and registers a new Output. Handles control rate vs. audio rate.
 
InputaddInput ()
 Creates and registers a new Input, initially connected to null_source_.
 
- Protected Attributes inherited from vital::Processor
std::shared_ptr< ProcessorStatestate_
 Shared state (sample rate, oversample, etc.)
 
int plugging_start_
 The index at which plugNext starts searching for an unplugged input.
 
std::vector< std::shared_ptr< Input > > owned_inputs_
 Inputs owned by this Processor.
 
std::vector< std::shared_ptr< Output > > owned_outputs_
 Outputs owned by this Processor.
 
std::shared_ptr< std::vector< Input * > > inputs_
 All inputs, owned or external.
 
std::shared_ptr< std::vector< Output * > > outputs_
 All outputs, owned or external.
 
ProcessorRouterrouter_
 The ProcessorRouter that manages this Processor.
 
- Static Protected Attributes inherited from vital::Processor
static const Output null_source_
 A null (dummy) source used for unconnected inputs.
 

Detailed Description

A core oscillator processor that generates audio by reading wavetable data with various effects.

This class handles unison, spectral morphing, distortion, FM/RM modulation, and more. It inherits from Processor, allowing it to be part of Vital's modular audio graph.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
kWaveFrame 

Waveform frame selection.

kMidiNote 

MIDI note (for pitch)

kMidiTrack 

MIDI tracking toggle.

kSmoothlyInterpolate 

Not used directly in this file, but part of the Vital architecture.

kTranspose 

Transpose amount.

kTransposeQuantize 

Transpose quantize setting.

kTune 

Fine tune.

kAmplitude 

Output amplitude.

kPan 

Stereo panning.

kUnisonVoices 

Number of unison voices.

kUnisonDetune 

Unison detune amount.

kPhase 

Phase offset.

kDistortionPhase 

Phase distortion offset.

kRandomPhase 

Random phase amount.

kBlend 

Blend between center voice and detuned voices.

kStereoSpread 

Stereo spread amount.

kStackStyle 

Unison stack style.

kDetunePower 

Detune power exponent.

kDetuneRange 

Detune range.

kUnisonFrameSpread 

Unison wavetable frame spread.

kUnisonDistortionSpread 

Unison distortion spread.

kUnisonSpectralMorphSpread 

Unison spectral morph spread.

kSpectralMorphType 

Spectral morph type.

kSpectralMorphAmount 

Spectral morph amount.

kSpectralUnison 

Toggle for spectral unison.

kDistortionType 

Distortion type.

kDistortionAmount 

Distortion amount.

kActiveVoices 

Active voice mask.

kReset 

Manual reset (phase reset)

kRetrigger 

Retrigger mask.

kNumInputs 

Number of inputs.

◆ anonymous enum

anonymous enum
Enumerator
kRaw 

Unleveled or "raw" output.

kLevelled 

Output after amplitude leveling/panning.

kNumOutputs 

Number of outputs.

◆ DistortionType

Types of distortion/waveshaping used by the oscillator.

Enumerator
kNone 

No distortion.

kSync 

Sync distortion.

kFormant 

Formant shifting.

kQuantize 

Quantization.

kBend 

Bend distortion.

kSqueeze 

Squeeze distortion.

kPulseWidth 

Pulse width distortion.

kFmOscillatorA 

FM using oscillator A.

kFmOscillatorB 

FM using oscillator B.

kFmSample 

FM using sample.

kRmOscillatorA 

RM using oscillator A.

kRmOscillatorB 

RM using oscillator B.

kRmSample 

RM using sample.

kNumDistortionTypes 

◆ SpectralMorph

Types of spectral morph effects that can be applied to the wavetable.

Enumerator
kNoSpectralMorph 

No spectral morph effect.

kVocode 

Vocode morph.

kFormScale 

Formant scaling.

kHarmonicScale 

Harmonic scaling.

kInharmonicScale 

Inharmonic scaling.

kSmear 

Smear morph.

kRandomAmplitudes 

Random amplitudes morph.

kLowPass 

Lowpass morph.

kHighPass 

Highpass morph.

kPhaseDisperse 

Phase dispersion.

kShepardTone 

Shepard tone morph.

kSkew 

Skew morph.

kNumSpectralMorphTypes 

◆ UnisonStackType

Ways to stack unison voices for chord or harmonic effects.

Enumerator
kNormal 

Standard unison.

kCenterDropOctave 

Shift center voice down an octave.

kCenterDropOctave2 

Shift center voice down two octaves.

kOctave 

Alternate between the base pitch and +1 octave.

kOctave2 

Alternate among the base pitch, +1 octave, +2 octaves.

kPowerChord 

Power chord intervals.

kPowerChord2 

Extended power chord intervals.

kMajorChord 

Major chord intervals.

kMinorChord 

Minor chord intervals.

kHarmonicSeries 

Harmonic series.

kOddHarmonicSeries 

Odd harmonic series.

kNumUnisonStackTypes 

Constructor & Destructor Documentation

◆ SynthOscillator()

vital::SynthOscillator::SynthOscillator ( Wavetable * wavetable)

Constructs a SynthOscillator with the specified Wavetable.

Parameters
wavetableA pointer to the wavetable used for generating wave data.

Member Function Documentation

◆ adjustPhase()

poly_int vital::SynthOscillator::adjustPhase ( DistortionType distortion_type,
poly_int phase,
poly_float distortion_amount,
poly_int distortion_phase )
static

Adjusts phase for sync, formant, quantize, etc.

Parameters
distortion_typeType of distortion.
phaseCurrent phase to be distorted.
distortion_amountAmount of distortion to apply.
distortion_phaseAdditional phase offset used by certain distortion types.
Returns
Distorted phase value.

◆ clone()

Processor * vital::SynthOscillator::clone ( ) const
inlineoverridevirtual

Clones this oscillator, returning a new instance with the same parameters.

Returns
Pointer to a new SynthOscillator instance.

Implements vital::Processor.

◆ getPhaseWindow()

poly_float vital::SynthOscillator::getPhaseWindow ( DistortionType distortion_type,
poly_int phase,
poly_int distorted_phase )
static

Retrieves a window multiplier (for example, half-sin window in formant mode).

Parameters
distortion_typeThe distortion type.
phaseThe original oscillator phase.
distorted_phaseThe phase after distortion.
Returns
The multiplier to apply to the final audio sample.

◆ interpolate()

poly_float vital::SynthOscillator::interpolate ( const mono_float * buffer,
const poly_int indices )
static

Performs linear interpolation on a single wave buffer.

Parameters
bufferThe buffer of mono_float samples.
indicesThe poly_int of indices to read from.
Returns
Interpolated poly_float sample.

◆ isFirstModulation()

static bool vital::SynthOscillator::isFirstModulation ( int type)
inlinestatic

Checks if distortion type uses the first modulation oscillator.

Parameters
typeThe distortion type.
Returns
True if distortion type uses the first oscillator for FM/RM.

◆ isSecondModulation()

static bool vital::SynthOscillator::isSecondModulation ( int type)
inlinestatic

Checks if distortion type uses the second modulation oscillator.

Parameters
typeThe distortion type.
Returns
True if distortion type uses the second oscillator for FM/RM.

◆ process()

void vital::SynthOscillator::process ( int num_samples)
overridevirtual

Processes the oscillator for a given number of samples, writing to the output buffers.

Parameters
num_samplesThe number of audio samples to generate.

Implements vital::Processor.

◆ reset() [1/2]

void vital::SynthOscillator::reset ( poly_mask reset_mask)
overridevirtual

Resets oscillator phase and other variables for specified voices.

Parameters
reset_maskThe mask indicating which voices to reset.

Reimplemented from vital::Processor.

◆ reset() [2/2]

void vital::SynthOscillator::reset ( poly_mask reset_mask,
poly_int sample )

Resets oscillator state with an offset sample count.

Parameters
reset_maskThe mask indicating which voices need resetting.
sampleA poly_int sample offset for retrigger.

◆ runSpectralMorph()

void vital::SynthOscillator::runSpectralMorph ( SpectralMorph morph_type,
float morph_amount,
const Wavetable::WavetableData * wavetable_data,
int wavetable_index,
poly_float * dest,
FourierTransform * transform )
static

Applies a spectral morph operation (e.g., vocode, smear) directly on a buffer.

Parameters
morph_typeThe spectral morph type.
morph_amountThe amount of morphing to apply (0.0 - 1.0).
wavetable_dataPointer to the original wavetable data.
wavetable_indexWhich frame of the wavetable to process.
destPointer to the destination buffer for the result.
transformPointer to the Fourier transform helper.

◆ setDistortionValues() [1/2]

void vital::SynthOscillator::setDistortionValues ( DistortionType distortion_type)

Sets the distortion values for internal waveshaping/fm/rm.

Parameters
distortion_typeThe type of distortion to apply.

◆ setDistortionValues() [2/2]

void vital::SynthOscillator::setDistortionValues ( DistortionType distortion_type,
poly_float * values,
int num_values,
bool spread )
static

Sets distortion values for an array of poly_float, handling unison spread if necessary.

Parameters
distortion_typeThe type of distortion used.
valuesPointer to the poly_float array to modify.
num_valuesThe number of items in the array.
spreadTrue if a unison spread is applied to these values.

◆ setFirstOscillatorOutput()

void vital::SynthOscillator::setFirstOscillatorOutput ( Output * oscillator)
inline

Assigns an oscillator Output pointer for FM/RM modulation (first mod oscillator).

Parameters
oscillatorA pointer to the Output that provides modulation data.

◆ setOversampleAmount()

void vital::SynthOscillator::setOversampleAmount ( int oversample)
inlineoverridevirtual

Overrides the base Processor method to set oversampling. Ensures internal buffers are large enough.

Parameters
oversampleThe new oversampling factor.

Reimplemented from vital::Processor.

◆ setSampleOutput()

void vital::SynthOscillator::setSampleOutput ( Output * sample)
inline

Assigns a sample Output pointer for FM/RM modulation using a sample.

Parameters
sampleA pointer to the Output that provides the sample data.

◆ setSecondOscillatorOutput()

void vital::SynthOscillator::setSecondOscillatorOutput ( Output * oscillator)
inline

Assigns an oscillator Output pointer for FM/RM modulation (second mod oscillator).

Parameters
oscillatorA pointer to the Output that provides modulation data.

◆ setSpectralMorphValues() [1/2]

void vital::SynthOscillator::setSpectralMorphValues ( SpectralMorph spectral_morph)

Sets the spectral morph values for internal morphing.

Parameters
spectral_morphThe type of spectral morph.

◆ setSpectralMorphValues() [2/2]

void vital::SynthOscillator::setSpectralMorphValues ( SpectralMorph spectral_morph,
poly_float * values,
int num_values,
bool spread )
static

Sets spectral morph values for an array of poly_float, handling unison spread if necessary.

Parameters
spectral_morphThe type of spectral morph to apply.
valuesPointer to the poly_float array to modify.
num_valuesThe number of items in the array.
spreadTrue if a unison spread is applied to these values.

◆ usesDistortionPhase()

bool vital::SynthOscillator::usesDistortionPhase ( DistortionType distortion_type)
static

Checks if a given distortion type uses a separate distortion_phase (kSync, kQuantize, etc).

Parameters
distortion_typeThe distortion type.
Returns
True if uses distortion phase, otherwise false.

Member Data Documentation

◆ kMaxUnison

int vital::SynthOscillator::kMaxUnison = 16
staticconstexpr

Maximum number of unison voices.

◆ kNumBuffers

int vital::SynthOscillator::kNumBuffers = kNumPolyPhase * poly_float::kSize
staticconstexpr

Number of buffers to store waveforms, based on the number of poly phases.

◆ kNumPolyPhase

int vital::SynthOscillator::kNumPolyPhase = kMaxUnison / 2
staticconstexpr

Number of poly phases total.

◆ kPolyPhasePerVoice

int vital::SynthOscillator::kPolyPhasePerVoice = kMaxUnison / poly_float::kSize
staticconstexpr

Number of poly phases used per voice.

◆ kSpectralBufferSize

int vital::SynthOscillator::kSpectralBufferSize = Wavetable::kWaveformSize * 2 / poly_float::kSize + poly_float::kSize
staticconstexpr

Size of spectral buffer for Fourier transforms.

◆ kStackMultipliers

const mono_float vital::SynthOscillator::kStackMultipliers
static
Initial value:
= {
{ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f },
{ 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f },
{ 0.25f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f },
{ 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f, 1.0f, 2.0f },
{ 1.0f, 2.0f, 3.0f, 1.0f, 2.0f, 3.0f, 1.0f, 2.0f },
{ 1.0f, kFifthMult, 2.0f, 1.0f, kFifthMult, 2.0f, 1.0f, kFifthMult },
{ 1.0f, kFifthMult, 2.0f, 2.0f * kFifthMult, 4.0f, 1.0f, kFifthMult, 2.0f },
{ 1.0f, kMajorThirdMult, kFifthMult, 2.0f, 1.0f, kMajorThirdMult, kFifthMult, 2.0f },
{ 1.0f, kMinorThirdMult, kFifthMult, 2.0f, 1.0f, kMinorThirdMult, kFifthMult, 2.0f },
{ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f },
{ 1.0f, 3.0f, 5.0f, 7.0f, 9.0f, 11.0f, 13.0f, 15.0f }
}

Precomputed multipliers used for stacking unison voices into intervals.


The documentation for this class was generated from the following files: