MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Sine.cpp
Go to the documentation of this file.
1#include "Sine.hpp"
2
4
5Sine::Sine(float frequency, double amplitude, float offset)
6 : m_offset(offset)
7 , m_frequency_modulator(nullptr)
8 , m_amplitude_modulator(nullptr)
9{
10 m_amplitude = amplitude;
13}
14
15Sine::Sine(const std::shared_ptr<Node>& frequency_modulator, float frequency, double amplitude, float offset)
16 : m_offset(offset)
17 , m_frequency_modulator(frequency_modulator)
18 , m_amplitude_modulator(nullptr)
19{
20 m_amplitude = amplitude;
23}
24
25Sine::Sine(float frequency, const std::shared_ptr<Node>& amplitude_modulator, double amplitude, float offset)
26 : m_offset(offset)
27 , m_frequency_modulator(nullptr)
28 , m_amplitude_modulator(amplitude_modulator)
29{
30 m_amplitude = amplitude;
33}
34
35Sine::Sine(const std::shared_ptr<Node>& frequency_modulator, const std::shared_ptr<Node>& amplitude_modulator, float frequency, double amplitude, float offset)
36 : m_offset(offset)
37 , m_frequency_modulator(frequency_modulator)
38 , m_amplitude_modulator(amplitude_modulator)
39{
40 m_amplitude = amplitude;
43}
44
50
52{
53 m_phase_inc = (2 * M_PI * frequency) / (double)m_timing_rate;
54}
55
56void Sine::set_frequency_modulator(const std::shared_ptr<Node>& modulator)
57{
58 m_frequency_modulator = modulator;
59}
60
61void Sine::set_amplitude_modulator(const std::shared_ptr<Node>& modulator)
62{
63 m_amplitude_modulator = modulator;
64}
65
72
74{
77 uint32_t state = m_frequency_modulator->m_state.load();
78 double current_freq = m_frequency;
79
80 if (state & NodeState::PROCESSED) {
81 current_freq += m_frequency_modulator->get_last_output();
82 } else {
83 current_freq += m_frequency_modulator->process_sample(0.F);
85 }
86 update_phase_increment(current_freq);
87 }
88
89 double current_sample = std::sin(m_phase + m_offset);
91
92 if (m_phase > 2 * M_PI) {
93 m_phase -= 2 * M_PI;
94 } else if (m_phase < -2 * M_PI) {
95 m_phase += 2 * M_PI;
96 }
97
98 double current_amplitude = m_amplitude;
101 uint32_t state = m_amplitude_modulator->m_state.load();
102
103 if (state & NodeState::PROCESSED) {
104 current_amplitude += m_amplitude_modulator->get_last_output();
105 if (!(state & NodeState::ACTIVE)) {
107 }
108 } else {
109 current_amplitude += m_amplitude_modulator->process_sample(0.F);
111 }
112 }
113 current_sample *= current_amplitude;
114
115 if (input != 0.0) {
116 current_sample += input;
117 current_sample *= 0.5F;
118 }
119
120 m_last_output = current_sample;
121
123 && !m_networked_node) {
124 notify_tick(current_sample);
125 }
126
130 }
134 }
135 return current_sample;
136}
137
138std::vector<double> Sine::process_batch(unsigned int num_samples)
139{
140 std::vector<double> output(num_samples);
141 for (unsigned int i = 0; i < num_samples; i++) {
142 output[i] = process_sample(0.0);
143 }
144 return output;
145}
146
147void Sine::reset(float frequency, double amplitude, float offset)
148{
149 m_phase = 0;
151 m_amplitude = amplitude;
152 m_offset = offset;
154}
155
171
187
188std::vector<std::pair<ModulatorRole, std::shared_ptr<Node>>>
190{
191 std::vector<std::pair<ModulatorRole, std::shared_ptr<Node>>> result;
196 return result;
197}
198
199}
Core::GlobalInputConfig input
Definition Config.cpp:36
double frequency
void notify_tick(double value) override
Notifies all registered callbacks with the current context.
Definition Generator.cpp:70
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:196
double m_phase_inc
Phase increment per sample.
Definition Sine.hpp:191
std::vector< double > process_batch(unsigned int num_samples) override
Processes multiple samples at once.
Definition Sine.cpp:138
void restore_state() override
Restores the node's state from the last save Recursively cascades through all connected modulator nod...
Definition Sine.cpp:172
std::vector< std::pair< ModulatorRole, std::shared_ptr< Node > > > get_modulators() const override
Retrieves the current modulators connected to this node.
Definition Sine.cpp:189
void set_frequency_modulator(const std::shared_ptr< Node > &modulator)
Sets a node to modulate the oscillator's frequency.
Definition Sine.cpp:56
void update_phase_increment(double frequency)
Updates the phase increment based on a new frequency.
Definition Sine.cpp:51
void clear_modulators()
Removes all modulation connections.
Definition Sine.cpp:66
std::shared_ptr< Node > m_frequency_modulator
Node that modulates the frequency.
Definition Sine.hpp:201
void save_state() override
Saves the node's current state for later restoration Recursively cascades through all connected modul...
Definition Sine.cpp:156
void set_frequency(float frequency) override
Sets the oscillator's frequency.
Definition Sine.cpp:45
void reset(float frequency=440, double amplitude=0.5, float offset=0)
Resets the oscillator's phase and parameters.
Definition Sine.cpp:147
Sine(float frequency=440, double amplitude=1, float offset=0)
Basic constructor with fixed parameters.
Definition Sine.cpp:5
std::shared_ptr< Node > m_amplitude_modulator
Node that modulates the amplitude.
Definition Sine.hpp:206
void set_amplitude_modulator(const std::shared_ptr< Node > &modulator)
Sets a node to modulate the oscillator's amplitude.
Definition Sine.cpp:61
double process_sample(double input=0.) override
Processes a single input sample and generates a sine wave sample.
Definition Sine.cpp:73
bool m_state_saved
tracks if the node's state has been saved by a snapshot operation
Definition Node.hpp:457
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:452
double m_last_output
The most recent sample value generated by this oscillator.
Definition Node.hpp:405
bool m_fire_events_during_snapshot
Internal flag controlling whether notify_tick fires during state snapshots Default: false (events don...
Definition Node.hpp:487
uint32_t m_timing_rate
Current timing rate for the node, used for timing calculations (can be sample rate or frame rate)
Definition Node.hpp:463
@ PROCESSED
Node has been processed this cycle.
Definition NodeSpec.hpp:49
@ ACTIVE
Engine is processing this node.
Definition NodeSpec.hpp:45
void atomic_add_flag(std::atomic< NodeState > &state, NodeState flag)
Atomically adds a flag to a node state.
Definition NodeUtils.cpp:60
void try_reset_processed_state(std::shared_ptr< Node > node)
Attempts to reset the processed state of a node.
Definition NodeUtils.cpp:97
void atomic_inc_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically increments the modulator count by a specified amount.
Definition NodeUtils.cpp:87
void atomic_remove_flag(std::atomic< NodeState > &state, NodeState flag)
Atomically removes a flag from a node state.
Definition NodeUtils.cpp:71
void atomic_dec_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically decrements the modulator count by a specified amount.
Definition NodeUtils.cpp:92