MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Sine.cpp
Go to the documentation of this file.
1#include "Sine.hpp"
3
5
6Sine::Sine(float frequency, double amplitude, float offset)
7 : m_offset(offset)
8 , m_frequency_modulator(nullptr)
9 , m_amplitude_modulator(nullptr)
10{
11 m_amplitude = amplitude;
12 m_frequency = frequency;
13 update_phase_increment(frequency);
14
16}
17
18Sine::Sine(const std::shared_ptr<Node>& frequency_modulator, float frequency, double amplitude, float offset)
19 : m_offset(offset)
20 , m_frequency_modulator(frequency_modulator)
21 , m_amplitude_modulator(nullptr)
22{
23 m_amplitude = amplitude;
24 m_frequency = frequency;
25 update_phase_increment(frequency);
26}
27
28Sine::Sine(float frequency, const std::shared_ptr<Node>& amplitude_modulator, double amplitude, float offset)
29 : m_offset(offset)
30 , m_frequency_modulator(nullptr)
31 , m_amplitude_modulator(amplitude_modulator)
32{
33 m_amplitude = amplitude;
34 m_frequency = frequency;
35 update_phase_increment(frequency);
36}
37
38Sine::Sine(const std::shared_ptr<Node>& frequency_modulator, const std::shared_ptr<Node>& amplitude_modulator, float frequency, double amplitude, float offset)
39 : m_offset(offset)
40 , m_frequency_modulator(frequency_modulator)
41 , m_amplitude_modulator(amplitude_modulator)
42{
43 m_amplitude = amplitude;
44 m_frequency = frequency;
45 update_phase_increment(frequency);
46}
47
48void Sine::set_frequency(float frequency)
49{
50 m_frequency = frequency;
51 update_phase_increment(frequency);
52}
53
54void Sine::update_phase_increment(double frequency)
55{
56 uint64_t s_rate = 48000U;
58 s_rate = Config::get_sample_rate();
59 }
60 m_phase_inc = (2 * M_PI * frequency) / (double)s_rate;
61}
62
63void Sine::set_frequency_modulator(const std::shared_ptr<Node>& modulator)
64{
65 m_frequency_modulator = modulator;
66}
67
68void Sine::set_amplitude_modulator(const std::shared_ptr<Node>& modulator)
69{
70 m_amplitude_modulator = modulator;
71}
72
79
80double Sine::process_sample(double input)
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}
142
143std::vector<double> Sine::process_batch(unsigned int num_samples)
144{
145 std::vector<double> output(num_samples);
146 for (unsigned int i = 0; i < num_samples; i++) {
147 output[i] = process_sample(0.0);
148 }
149 return output;
150}
151
152void Sine::reset(float frequency, double amplitude, float offset)
153{
154 m_phase = 0;
155 m_frequency = frequency;
156 m_amplitude = amplitude;
157 m_offset = offset;
158 update_phase_increment(frequency);
159}
160
161void Sine::notify_tick(double value)
162{
164
165 for (auto& callback : m_callbacks) {
166 callback(*m_last_context);
167 }
168 for (auto& [callback, condition] : m_conditional_callbacks) {
169 if (condition(*m_last_context)) {
170 callback(*m_last_context);
171 }
172 }
173}
174
190
206
208{
209}
210
212{
213}
214
215}
virtual std::unique_ptr< NodeContext > create_context(double value) override
Creates a context object for callbacks.
Definition Generator.cpp:19
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
std::vector< double > process_batch(unsigned int num_samples) override
Processes multiple samples at once.
Definition Sine.cpp:143
void restore_state() override
Restores the node's state from the last save Recursively cascades through all connected modulator nod...
Definition Sine.cpp:191
void notify_tick(double value) override
Notifies all registered callbacks about a new sample.
Definition Sine.cpp:161
void set_frequency_modulator(const std::shared_ptr< Node > &modulator)
Sets a node to modulate the oscillator's frequency.
Definition Sine.cpp:63
void update_phase_increment(double frequency)
Updates the phase increment based on a new frequency.
Definition Sine.cpp:54
void clear_modulators()
Removes all modulation connections.
Definition Sine.cpp:73
std::shared_ptr< Node > m_frequency_modulator
Node that modulates the frequency.
Definition Sine.hpp:222
void save_state() override
Saves the node's current state for later restoration Recursively cascades through all connected modul...
Definition Sine.cpp:175
void set_frequency(float frequency) override
Sets the oscillator's frequency.
Definition Sine.cpp:48
void printGraph() override
Prints a visual representation of the sine wave.
Definition Sine.cpp:207
void printCurrent() override
Prints the current parameters of the sine oscillator.
Definition Sine.cpp:211
void reset(float frequency=440, double amplitude=0.5, float offset=0)
Resets the oscillator's phase and parameters.
Definition Sine.cpp:152
Sine(float frequency=440, double amplitude=1, float offset=0)
Basic constructor with fixed parameters.
Definition Sine.cpp:6
std::shared_ptr< Node > m_amplitude_modulator
Node that modulates the amplitude.
Definition Sine.hpp:227
void set_amplitude_modulator(const std::shared_ptr< Node > &modulator)
Sets a node to modulate the oscillator's amplitude.
Definition Sine.cpp:68
double process_sample(double input=0.) override
Processes a single input sample and generates a sine wave sample.
Definition Sine.cpp:80
std::vector< NodeHook > m_callbacks
Collection of standard callback functions.
Definition Node.hpp:416
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
std::vector< std::pair< NodeHook, NodeCondition > > m_conditional_callbacks
Collection of conditional callback functions with their predicates.
Definition Node.hpp:426
std::unique_ptr< NodeContext > m_last_context
The last context object created for callbacks.
Definition Node.hpp:396
uint32_t get_sample_rate()
Gets the sample rate from the default engine.
Definition Config.cpp:46
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
bool is_engine_initialized()
Checks if the default audio engine is initialized.
Definition Config.cpp:9