Vital
|
A base class representing a component in a wavetable synthesis chain. More...
#include <wavetable_component.h>
Public Types | |
enum | InterpolationStyle { kNone , kLinear , kCubic , kNumInterpolationStyles } |
Defines how interpolation is performed between keyframes. More... | |
Public Member Functions | |
WavetableComponent () | |
Constructs a WavetableComponent with a default linear interpolation style. | |
virtual | ~WavetableComponent () |
virtual WavetableKeyframe * | createKeyframe (int position)=0 |
Creates a new keyframe at a given position. | |
virtual void | render (vital::WaveFrame *wave_frame, float position)=0 |
Renders the waveform at a given position into a WaveFrame. | |
virtual WavetableComponentFactory::ComponentType | getType ()=0 |
Returns the type of this WavetableComponent. | |
virtual json | stateToJson () |
Serializes the component’s state and all keyframes to a JSON object. | |
virtual void | jsonToState (json data) |
Restores the component’s state from a JSON object. | |
virtual void | prerender () |
Called before rendering to perform any needed precomputation. | |
virtual bool | hasKeyframes () |
Indicates whether this component relies on multiple keyframes. | |
void | reset () |
Clears all keyframes and inserts a default one at position 0. | |
void | interpolate (WavetableKeyframe *dest, float position) |
Interpolates a destination keyframe at a given position. | |
WavetableKeyframe * | insertNewKeyframe (int position) |
Inserts a new keyframe at the given position, creating and sorting it into the array. | |
void | reposition (WavetableKeyframe *keyframe) |
Repositions a keyframe in the keyframe list after its position changed. | |
void | remove (WavetableKeyframe *keyframe) |
Removes a specific keyframe from the component. | |
int | numFrames () const |
Gets the number of keyframes. | |
int | indexOf (WavetableKeyframe *keyframe) const |
Finds the index of a given keyframe. | |
WavetableKeyframe * | getFrameAt (int index) const |
Gets a keyframe by index. | |
int | getIndexFromPosition (int position) const |
Finds the insertion index for a given position to keep keyframes sorted. | |
WavetableKeyframe * | getFrameAtPosition (int position) |
Gets a keyframe by position if one matches exactly, or nullptr otherwise. | |
int | getLastKeyframePosition () |
Gets the highest position among all keyframes. | |
void | setInterpolationStyle (InterpolationStyle type) |
Sets the global interpolation style. | |
InterpolationStyle | getInterpolationStyle () const |
Gets the current global interpolation style. | |
Protected Attributes | |
std::vector< std::unique_ptr< WavetableKeyframe > > | keyframes_ |
The list of keyframes sorted by position. | |
InterpolationStyle | interpolation_style_ |
Current interpolation style (none, linear, cubic). | |
A base class representing a component in a wavetable synthesis chain.
WavetableComponent manages a collection of WavetableKeyframes, each representing a waveform configuration at a certain position (time/frame index). By interpolating between these keyframes, the component produces a smooth transition of waveform shapes across the wavetable dimension. WavetableComponents can represent sources of waveforms, or modifiers that apply transformations to existing waveforms.
Key functionalities include:
|
inline |
Constructs a WavetableComponent with a default linear interpolation style.
|
inlinevirtual |
|
pure virtual |
Creates a new keyframe at a given position.
Implemented by subclasses to produce a keyframe type suited to their functionality.
position | The wavetable frame index (0 to kNumOscillatorWaveFrames-1). |
Implemented in FileSource, FrequencyFilterModifier, PhaseModifier, SlewLimitModifier, WaveFoldModifier, WaveLineSource, WaveSource, WaveWarpModifier, and WaveWindowModifier.
|
inline |
Gets a keyframe by index.
index | The keyframe index. |
WavetableKeyframe * WavetableComponent::getFrameAtPosition | ( | int | position | ) |
Gets a keyframe by position if one matches exactly, or nullptr otherwise.
position | The position to search for. |
int WavetableComponent::getIndexFromPosition | ( | int | position | ) | const |
Finds the insertion index for a given position to keep keyframes sorted.
position | The position along the wavetable. |
|
inline |
Gets the current global interpolation style.
int WavetableComponent::getLastKeyframePosition | ( | ) |
Gets the highest position among all keyframes.
If no keyframes exist, returns 0. If the component doesn't use keyframes, returns the last possible frame index.
|
pure virtual |
Returns the type of this WavetableComponent.
Used to identify the specific component for serialization and UI mapping.
Implemented in FileSource, FrequencyFilterModifier, PhaseModifier, ShepardToneSource, SlewLimitModifier, WaveFoldModifier, WaveLineSource, WaveSource, WaveWarpModifier, and WaveWindowModifier.
|
inlinevirtual |
Indicates whether this component relies on multiple keyframes.
Reimplemented in ShepardToneSource.
|
inline |
Finds the index of a given keyframe.
keyframe | The keyframe pointer to find. |
WavetableKeyframe * WavetableComponent::insertNewKeyframe | ( | int | position | ) |
Inserts a new keyframe at the given position, creating and sorting it into the array.
position | The position along the wavetable dimension. |
void WavetableComponent::interpolate | ( | WavetableKeyframe * | dest, |
float | position ) |
Interpolates a destination keyframe at a given position.
Uses the current interpolation style (none, linear, cubic) to populate dest
with data interpolated from existing keyframes.
dest | The destination keyframe to fill. |
position | The position along the wavetable to interpolate at. |
|
virtual |
Restores the component’s state from a JSON object.
Clears existing keyframes and reconstructs them from the provided JSON data.
data | The JSON object containing saved state data. |
Reimplemented in FileSource, FrequencyFilterModifier, PhaseModifier, WaveLineSource, WaveSource, WaveWarpModifier, and WaveWindowModifier.
|
inline |
Gets the number of keyframes.
|
inlinevirtual |
Called before rendering to perform any needed precomputation.
By default does nothing, can be overridden by subclasses.
void WavetableComponent::remove | ( | WavetableKeyframe * | keyframe | ) |
Removes a specific keyframe from the component.
keyframe | The keyframe to remove. |
|
pure virtual |
Renders the waveform at a given position into a WaveFrame.
Uses interpolation between keyframes based on the current interpolation style to produce a waveform for the given position.
wave_frame | The WaveFrame to fill with the resulting waveform. |
position | The position along the wavetable dimension [0, kNumOscillatorWaveFrames-1]. |
Implemented in FileSource, FrequencyFilterModifier, PhaseModifier, ShepardToneSource, SlewLimitModifier, WaveFoldModifier, WaveLineSource, WaveSource, WaveWarpModifier, and WaveWindowModifier.
void WavetableComponent::reposition | ( | WavetableKeyframe * | keyframe | ) |
Repositions a keyframe in the keyframe list after its position changed.
Removes and re-inserts it in sorted order by position.
keyframe | The keyframe to reposition. |
void WavetableComponent::reset | ( | ) |
Clears all keyframes and inserts a default one at position 0.
|
inline |
Sets the global interpolation style.
type | The InterpolationStyle (none, linear, cubic). |
|
virtual |
Serializes the component’s state and all keyframes to a JSON object.
Reimplemented in FileSource, FrequencyFilterModifier, PhaseModifier, WaveLineSource, WaveSource, WaveWarpModifier, and WaveWindowModifier.
|
protected |
Current interpolation style (none, linear, cubic).
|
protected |
The list of keyframes sorted by position.