MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Impulse.cpp
Go to the documentation of this file.
1#include "Impulse.hpp"
2
4
5Impulse::Impulse(float frequency, double amplitude, float offset)
6 : m_offset(offset)
7 , m_frequency_modulator(nullptr)
8 , m_amplitude_modulator(nullptr)
9 , m_impulse_occurred(false)
10{
11 m_amplitude = amplitude;
14}
15
16Impulse::Impulse(const std::shared_ptr<Node>& frequency_modulator, float frequency, double amplitude, float offset)
17 : m_offset(offset)
18 , m_frequency_modulator(frequency_modulator)
19 , m_amplitude_modulator(nullptr)
20 , m_impulse_occurred(false)
21{
22 m_amplitude = amplitude;
25}
26
27Impulse::Impulse(float frequency, const std::shared_ptr<Node>& amplitude_modulator, double amplitude, float offset)
28 : m_offset(offset)
29 , m_frequency_modulator(nullptr)
30 , m_amplitude_modulator(amplitude_modulator)
31 , m_impulse_occurred(false)
32{
33 m_amplitude = amplitude;
36}
37
38Impulse::Impulse(const std::shared_ptr<Node>& frequency_modulator, const std::shared_ptr<Node>& amplitude_modulator,
39 float frequency, double amplitude, float offset)
40 : m_offset(offset)
41 , m_frequency_modulator(frequency_modulator)
42 , m_amplitude_modulator(amplitude_modulator)
43 , m_impulse_occurred(false)
44{
45 m_amplitude = amplitude;
48}
49
55
60
61void Impulse::set_frequency_modulator(const std::shared_ptr<Node>& modulator)
62{
63 m_frequency_modulator = modulator;
64}
65
66void Impulse::set_amplitude_modulator(const std::shared_ptr<Node>& modulator)
67{
68 m_amplitude_modulator = modulator;
69}
70
76
77double Impulse::process_sample(double input)
78{
79 double output = 0.0;
80 m_impulse_occurred = false;
81
82 double effective_freq = m_frequency;
85 uint32_t state = m_frequency_modulator->m_state.load();
86 if (state & Nodes::NodeState::PROCESSED) {
87 effective_freq += m_frequency_modulator->get_last_output();
88 } else {
89 effective_freq = m_frequency_modulator->process_sample(0.F);
91 }
92
93 if (effective_freq <= 0) {
94 effective_freq = 0.001;
95 }
96 update_phase_increment(effective_freq);
97 }
98
99 if (m_phase < m_phase_inc) {
100 output = m_amplitude;
101 m_impulse_occurred = true;
102 } else {
103 output = 0.0;
104 }
105
106 double current_amplitude = m_amplitude;
109 uint32_t state = m_amplitude_modulator->m_state.load();
110
111 if (state & NodeState::PROCESSED) {
112 current_amplitude += m_amplitude_modulator->get_last_output();
113 } else {
114 current_amplitude += m_amplitude_modulator->process_sample(0.F);
116 }
117 }
118
119 output *= current_amplitude;
120 m_amplitude = current_amplitude;
121 output += m_offset;
122
124 if (m_phase >= 1.0) {
125 m_phase -= 1.0;
126 }
127
128 m_last_output = output;
129
131 && !m_networked_node) {
132 notify_tick(output);
133 }
134
138 }
142 }
143
144 return output;
145}
146
147std::vector<double> Impulse::process_batch(unsigned int num_samples)
148{
149 std::vector<double> output(num_samples, 0.0);
150
151 for (unsigned int i = 0; i < num_samples; ++i) {
152 output[i] = process_sample(0.0); // Use 0.0 as default input
153 }
154
155 return output;
156}
157
158void Impulse::reset(float frequency, float amplitude, float offset)
159{
160 m_phase = 0.0;
161 m_amplitude = amplitude;
162 m_offset = offset;
164 m_last_output = 0.0;
165}
166
167void Impulse::on_impulse(const NodeHook& callback)
168{
170}
171
172bool Impulse::remove_hook(const NodeHook& callback)
173{
174 bool removed_from_tick = safe_remove_callback(m_callbacks, callback);
175 bool removed_from_impulse = safe_remove_callback(m_impulse_callbacks, callback);
176 return removed_from_tick || removed_from_impulse;
177}
178
179void Impulse::notify_tick(double value)
180{
181 update_context(value);
182 auto& ctx = get_last_context();
183
184 for (auto& callback : m_callbacks) {
185 callback(ctx);
186 }
187 for (auto& [callback, condition] : m_conditional_callbacks) {
188 if (condition(ctx)) {
189 callback(ctx);
190 }
191 }
192 if (m_impulse_occurred) {
193 for (auto& callback : m_impulse_callbacks) {
194 callback(ctx);
195 }
196 }
197}
198
214
230
231} // namespace MayaFlux::Nodes::Generator
double frequency
float m_frequency
Base frequency of the generator.
NodeContext & get_last_context() override
Gets the last created context object.
Definition Generator.cpp:51
double m_amplitude
Base amplitude of the generator.
virtual void update_context(double value) override
Updates the context object for callbacks.
Definition Generator.cpp:21
double m_phase
Current phase of the generator.
bool remove_hook(const NodeHook &callback) override
Removes a previously registered callback.
Definition Impulse.cpp:172
std::shared_ptr< Node > m_amplitude_modulator
Node that modulates the amplitude.
Definition Impulse.hpp:262
void restore_state() override
Restores the node's state from the last save Recursively cascades through all connected modulator nod...
Definition Impulse.cpp:215
void save_state() override
Saves the node's current state for later restoration Recursively cascades through all connected modul...
Definition Impulse.cpp:199
void notify_tick(double value) override
Notifies all registered callbacks about a new sample.
Definition Impulse.cpp:179
std::vector< NodeHook > m_impulse_callbacks
Collection of impulse-specific callback functions.
Definition Impulse.hpp:276
double m_phase_inc
Phase increment per sample.
Definition Impulse.hpp:247
Impulse(float frequency=1, double amplitude=1, float offset=0)
Basic constructor with fixed parameters.
Definition Impulse.cpp:5
std::vector< double > process_batch(unsigned int num_samples) override
Processes multiple samples at once.
Definition Impulse.cpp:147
double process_sample(double input=0.) override
Processes a single input sample and generates an impulse sample.
Definition Impulse.cpp:77
void reset(float frequency=1, float amplitude=1.0F, float offset=0)
Resets the generator's phase and parameters.
Definition Impulse.cpp:158
void clear_modulators()
Removes all modulation connections.
Definition Impulse.cpp:71
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:56
void set_frequency_modulator(const std::shared_ptr< Node > &modulator)
Sets a node to modulate the generator's frequency.
Definition Impulse.cpp:61
void on_impulse(const NodeHook &callback)
Registers a callback for every impulse.
Definition Impulse.cpp:167
void set_frequency(float frequency) override
Sets the generator's frequency.
Definition Impulse.cpp:50
std::shared_ptr< Node > m_frequency_modulator
Node that modulates the frequency.
Definition Impulse.hpp:257
void set_amplitude_modulator(const std::shared_ptr< Node > &modulator)
Sets a node to modulate the generator's amplitude.
Definition Impulse.cpp:66
std::vector< NodeHook > m_callbacks
Collection of standard callback functions.
Definition Node.hpp:406
bool m_state_saved
tracks if the node's state has been saved by a snapshot operation
Definition Node.hpp:429
bool m_networked_node
Flag indicating if the node is part of a NodeNetwork This flag is used to disable event firing when t...
Definition Node.hpp:424
uint32_t m_sample_rate
Sample rate for audio processing, used for normalization.
Definition Node.hpp:431
double m_last_output
The most recent sample value generated by this oscillator.
Definition Node.hpp:377
bool m_fire_events_during_snapshot
Internal flag controlling whether notify_tick fires during state snapshots Default: false (events don...
Definition Node.hpp:455
std::vector< std::pair< NodeHook, NodeCondition > > m_conditional_callbacks
Collection of conditional callback functions with their predicates.
Definition Node.hpp:416
std::function< void(NodeContext &)> NodeHook
Callback function type for node processing events.
Definition NodeUtils.hpp:25
@ PROCESSED
Node has been processed this cycle.
Definition NodeSpec.hpp:49
void atomic_add_flag(std::atomic< NodeState > &state, NodeState flag)
Atomically adds a flag to a node state.
Definition NodeUtils.cpp:94
bool safe_add_callback(std::vector< NodeHook > &callbacks, const NodeHook &callback)
Safely adds a callback to a collection if it doesn't already exist.
Definition NodeUtils.cpp:31
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.
bool safe_remove_callback(std::vector< NodeHook > &callbacks, const NodeHook &callback)
Safely removes a callback from a collection.
Definition NodeUtils.cpp:49