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

◆ process_sample()

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

Processes a single input sample and generates an impulse sample.

Parameters
inputInput sample (used for modulation when modulators are connected)
Returns
Generated impulse sample (1.0 at the start of each cycle, 0.0 elsewhere)

This method advances the generator's phase and computes the next sample of the impulse train, applying any modulation from connected nodes.

Implements MayaFlux::Nodes::Node.

Definition at line 82 of file Impulse.cpp.

83{
84 double output = 0.0;
85 m_impulse_occurred = false;
86
87 double effective_freq = m_frequency;
90 uint32_t state = m_frequency_modulator->m_state.load();
91 if (state & Utils::NodeState::PROCESSED) {
92 effective_freq += m_frequency_modulator->get_last_output();
93 } else {
94 effective_freq = m_frequency_modulator->process_sample(0.F);
96 }
97
98 if (effective_freq <= 0) {
99 effective_freq = 0.001;
100 }
101 update_phase_increment(effective_freq);
102 }
103
104 if (m_phase < m_phase_inc) {
105 output = m_amplitude;
106 m_impulse_occurred = true;
107 } else {
108 output = 0.0;
109 }
110
111 double current_amplitude = m_amplitude;
114 uint32_t state = m_amplitude_modulator->m_state.load();
115
116 if (state & Utils::NodeState::PROCESSED) {
117 current_amplitude += m_amplitude_modulator->get_last_output();
118 } else {
119 current_amplitude += m_amplitude_modulator->process_sample(0.F);
121 }
122 }
123
124 output *= current_amplitude;
125 m_amplitude = current_amplitude;
126 output += m_offset;
127
129 if (m_phase >= 1.0) {
130 m_phase -= 1.0;
131 }
132
133 m_last_output = output;
134
136 notify_tick(output);
137
141 }
145 }
146
147 return output;
148}
float m_frequency
Base frequency of the generator.
double m_amplitude
Base amplitude of the generator.
double m_phase
Current phase of the generator.
std::shared_ptr< Node > m_amplitude_modulator
Node that modulates the amplitude.
Definition Impulse.hpp:262
void notify_tick(double value) override
Notifies all registered callbacks about a new sample.
Definition Impulse.cpp:182
double m_phase_inc
Phase increment per sample.
Definition Impulse.hpp:247
float m_offset
DC offset added to the output.
Definition Impulse.hpp:252
void update_phase_increment(double frequency)
Updates the phase increment based on a new frequency.
Definition Impulse.cpp:57
std::shared_ptr< Node > m_frequency_modulator
Node that modulates the frequency.
Definition Impulse.hpp:257
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.
@ PROCESSED
Node has been processed this cycle.
Definition Utils.hpp:34

References MayaFlux::Nodes::atomic_add_flag(), MayaFlux::Nodes::atomic_dec_modulator_count(), MayaFlux::Nodes::atomic_inc_modulator_count(), 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, m_impulse_occurred, 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: