MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ process_sample()

double MayaFlux::Nodes::Generator::Sine::process_sample ( double  input = 0.)
overridevirtual

Processes a single input sample and generates a sine wave sample.

Parameters
inputInput sample (used for modulation when modulators are connected)
Returns
Generated sine wave sample

This method advances the oscillator's phase and computes the next sample of the sine wave, applying any modulation from connected nodes.

Implements MayaFlux::Nodes::Node.

Definition at line 80 of file Sine.cpp.

81{
84 uint32_t state = m_frequency_modulator->m_state.load();
85 double current_freq = m_frequency;
86
87 if (state & Utils::NodeState::PROCESSED) {
88 current_freq += m_frequency_modulator->get_last_output();
89 } else {
90 current_freq += m_frequency_modulator->process_sample(0.F);
92 }
93 update_phase_increment(current_freq);
94 }
95
96 double current_sample = std::sin(m_phase + m_offset);
98
99 if (m_phase > 2 * M_PI) {
100 m_phase -= 2 * M_PI;
101 } else if (m_phase < -2 * M_PI) {
102 m_phase += 2 * M_PI;
103 }
104
105 double current_amplitude = m_amplitude;
108 uint32_t state = m_amplitude_modulator->m_state.load();
109
110 if (state & Utils::NodeState::PROCESSED) {
111 current_amplitude += m_amplitude_modulator->get_last_output();
112 if (!(state & Utils::NodeState::ACTIVE)) {
114 }
115 } else {
116 current_amplitude += m_amplitude_modulator->process_sample(0.F);
118 }
119 }
120 current_sample *= current_amplitude;
121
122 if (input != 0.0) {
123 current_sample += input;
124 current_sample *= 0.5F;
125 }
126
127 m_last_output = current_sample;
128
130 notify_tick(current_sample);
131
135 }
139 }
140 return current_sample;
141}
float m_frequency
Base frequency of the generator.
double m_amplitude
Base amplitude of the generator.
double m_phase
Current phase of the generator.
float m_offset
DC offset added to the output.
Definition Sine.hpp:217
double m_phase_inc
Phase increment per sample.
Definition Sine.hpp:212
void notify_tick(double value) override
Notifies all registered callbacks about a new sample.
Definition Sine.cpp:161
void update_phase_increment(double frequency)
Updates the phase increment based on a new frequency.
Definition Sine.cpp:54
std::shared_ptr< Node > m_frequency_modulator
Node that modulates the frequency.
Definition Sine.hpp:222
std::shared_ptr< Node > m_amplitude_modulator
Node that modulates the amplitude.
Definition Sine.hpp:227
double m_last_output
The most recent sample value generated by this oscillator.
Definition Node.hpp:378
bool m_fire_events_during_snapshot
Internal flag controlling whether notify_tick fires during state snapshots Default: false (events don...
Definition Node.hpp:448
void atomic_add_flag(std::atomic< Utils::NodeState > &state, Utils::NodeState flag)
Atomically adds a flag to a node state.
Definition NodeUtils.cpp:96
void try_reset_processed_state(std::shared_ptr< Node > node)
Attempts to reset the processed state of a node.
void atomic_inc_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically increments the modulator count by a specified amount.
void atomic_dec_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically decrements the modulator count by a specified amount.
void atomic_remove_flag(std::atomic< Utils::NodeState > &state, Utils::NodeState flag)
Atomically removes a flag from a node state.
@ ACTIVE
Engine is processing this node.
Definition Utils.hpp:30
@ PROCESSED
Node has been processed this cycle.
Definition Utils.hpp:34

References MayaFlux::Utils::ACTIVE, MayaFlux::Nodes::atomic_add_flag(), MayaFlux::Nodes::atomic_dec_modulator_count(), MayaFlux::Nodes::atomic_inc_modulator_count(), MayaFlux::Nodes::atomic_remove_flag(), MayaFlux::Nodes::Generator::Generator::m_amplitude, m_amplitude_modulator, MayaFlux::Nodes::Node::m_fire_events_during_snapshot, MayaFlux::Nodes::Generator::Generator::m_frequency, m_frequency_modulator, MayaFlux::Nodes::Node::m_last_output, m_offset, MayaFlux::Nodes::Generator::Generator::m_phase, m_phase_inc, m_state_saved, notify_tick(), MayaFlux::Utils::PROCESSED, MayaFlux::Nodes::try_reset_processed_state(), and update_phase_increment().

Referenced by process_batch().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: