23 int start_index =
indexOf(keyframe);
33 int start_index =
indexOf(keyframe);
40 for (
json json_keyframe : data[
"keyframes"]) {
45 if (data.count(
"interpolation_style"))
53 keyframes_data.emplace_back(
keyframes_[i]->stateToJson());
56 {
"keyframes", keyframes_data },
74 int clamped_index = std::min(std::max(index, 0),
numFrames() - 1);
79 dest->
copy(from_frame);
83 int to_position =
keyframes_[index + 1]->position();
84 float t = (1.0f * position - from_position) / (to_position - from_position);
89 int next_index = index + 2;
90 int prev_index = index - 1;
94 prev_index = index + 1;
101 int to_position =
keyframes_[index + 1]->position();
102 float t = (1.0f * position - from_position) / (to_position - from_position);
111 if (position < keyframe->position())
static std::string getComponentName(ComponentType type)
Gets the human-readable name of a component from its enumerated type.
Definition wavetable_component_factory.cpp:75
int numFrames() const
Gets the number of keyframes.
Definition wavetable_component.h:155
virtual WavetableKeyframe * createKeyframe(int position)=0
Creates a new keyframe at a given position.
@ kLinear
Linear interpolation between adjacent keyframes.
Definition wavetable_component.h:40
@ kNone
No interpolation, just jumps between keyframes.
Definition wavetable_component.h:39
@ kCubic
Cubic interpolation for smoother transitions.
Definition wavetable_component.h:41
virtual json stateToJson()
Serializes the component’s state and all keyframes to a JSON object.
Definition wavetable_component.cpp:49
void interpolate(WavetableKeyframe *dest, float position)
Interpolates a destination keyframe at a given position.
Definition wavetable_component.cpp:68
void reset()
Clears all keyframes and inserts a default one at position 0.
Definition wavetable_component.cpp:62
WavetableKeyframe * insertNewKeyframe(int position)
Inserts a new keyframe at the given position, creating and sorting it into the array.
Definition wavetable_component.cpp:8
virtual void jsonToState(json data)
Restores the component’s state from a JSON object.
Definition wavetable_component.cpp:37
int getLastKeyframePosition()
Gets the highest position among all keyframes.
Definition wavetable_component.cpp:127
int indexOf(WavetableKeyframe *keyframe) const
Finds the index of a given keyframe.
Definition wavetable_component.h:163
std::vector< std::unique_ptr< WavetableKeyframe > > keyframes_
The list of keyframes sorted by position.
Definition wavetable_component.h:219
WavetableKeyframe * getFrameAtPosition(int position)
Gets a keyframe by position if one matches exactly, or nullptr otherwise.
Definition wavetable_component.cpp:119
virtual WavetableComponentFactory::ComponentType getType()=0
Returns the type of this WavetableComponent.
int getIndexFromPosition(int position) const
Finds the insertion index for a given position to keep keyframes sorted.
Definition wavetable_component.cpp:107
void remove(WavetableKeyframe *keyframe)
Removes a specific keyframe from the component.
Definition wavetable_component.cpp:31
virtual bool hasKeyframes()
Indicates whether this component relies on multiple keyframes.
Definition wavetable_component.h:108
void reposition(WavetableKeyframe *keyframe)
Repositions a keyframe in the keyframe list after its position changed.
Definition wavetable_component.cpp:21
InterpolationStyle interpolation_style_
Current interpolation style (none, linear, cubic).
Definition wavetable_component.h:220
Represents a single state of a waveform at a specific position in a wavetable.
Definition wavetable_keyframe.h:35
int position() const
Gets the wavetable frame position of this keyframe.
Definition wavetable_keyframe.h:81
void setPosition(int position)
Sets the frame position of this keyframe.
Definition wavetable_keyframe.h:88
virtual void smoothInterpolate(const WavetableKeyframe *prev_keyframe, const WavetableKeyframe *from_keyframe, const WavetableKeyframe *to_keyframe, const WavetableKeyframe *next_keyframe, float t)
Performs a smooth (cubic) interpolation using four keyframes for even smoother transitions.
Definition wavetable_keyframe.h:121
virtual void interpolate(const WavetableKeyframe *from_keyframe, const WavetableKeyframe *to_keyframe, float t)=0
Linearly interpolates between two keyframes.
virtual void copy(const WavetableKeyframe *keyframe)=0
Copies the state from another keyframe of the same type.
void setOwner(WavetableComponent *owner)
Sets the owner of this keyframe.
Definition wavetable_keyframe.h:159
virtual void jsonToState(json data)
Restores the keyframe's state from a JSON object.
Definition wavetable_keyframe.cpp:41
#define VITAL_ASSERT(x)
Definition common.h:11
nlohmann::json json
Definition line_generator.h:7
constexpr int kNumOscillatorWaveFrames
Number of wave frames in each oscillator’s wavetable.
Definition synth_constants.h:19