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

◆ process_batch()

void MayaFlux::Nodes::Network::ModalNetwork::process_batch ( unsigned int  num_samples)
overridevirtual

Process the network for the given number of samples.

Parameters
num_samplesNumber of samples/frames to process

Subclasses implement their specific processing logic:

  1. Update internal state (physics, relationships, etc.)
  2. Process individual nodes
  3. Apply inter-node interactions
  4. Aggregate outputs if needed

Called by NodeGraphManager during token processing.

Implements MayaFlux::Nodes::Network::NodeNetwork.

Definition at line 296 of file ModalNetwork.cpp.

297{
299
300 if (!is_enabled()) {
301 while (m_audio_buffer_lock.test_and_set(std::memory_order_acquire))
302 std::this_thread::yield();
303
304 m_last_audio_buffer.assign(num_samples, 0.0);
305 m_audio_buffer_lock.clear(std::memory_order_release);
306 return;
307 }
308
309 thread_local std::vector<double> scratch;
310 scratch.assign(num_samples, 0.0);
311
313
314 m_node_buffers.assign(m_modes.size(), {});
315 for (auto& nb : m_node_buffers)
316 nb.reserve(num_samples);
317
318 for (size_t i = 0; i < num_samples; ++i) {
319 double exciter_signal = generate_exciter_sample();
320
321 if (m_coupling_enabled && !m_couplings.empty())
323
324 for (size_t m = 0; m < m_modes.size(); ++m) {
325 auto& mode = m_modes[m];
326
327 if (mode.amplitude > 0.0001) {
328 mode.amplitude *= mode.decay_coefficient;
329 } else {
330 mode.amplitude = 0.0;
331 }
332
333 double sample = mode.oscillator->process_sample(0.0) * mode.amplitude;
334 m_node_buffers[m].push_back(sample);
335 scratch[i] += sample;
336 }
337 }
338
339 while (m_audio_buffer_lock.test_and_set(std::memory_order_acquire))
340 std::this_thread::yield();
341
342 m_last_audio_buffer.assign(scratch.begin(), scratch.end());
344 m_audio_buffer_lock.clear(std::memory_order_release);
345}
std::vector< std::vector< double > > m_node_buffers
Per-mode sample buffers populated each process_batch()
std::vector< ModeCoupling > m_couplings
void compute_mode_coupling()
Apply modal coupling energy transfer.
double generate_exciter_sample()
Generate exciter signal for current sample.
void update_mapped_parameters()
Update mapped parameters before processing.
void apply_output_scale()
Apply m_output_scale to m_last_audio_buffer.
bool is_enabled() const
Check if network is enabled.
std::atomic_flag m_audio_buffer_lock
Spinlock guarding m_last_audio_buffer.
void ensure_initialized()
Ensure initialize() is called exactly once.
std::vector< double > m_last_audio_buffer
std::vector< double > mode(std::span< const double > data, size_t n_windows, uint32_t hop_size, uint32_t window_size)
Mode per window via tolerance-bucketed frequency count.
Definition Analysis.cpp:559

References MayaFlux::Nodes::Network::NodeNetwork::apply_output_scale(), compute_mode_coupling(), MayaFlux::Nodes::Network::NodeNetwork::ensure_initialized(), generate_exciter_sample(), MayaFlux::Nodes::Network::NodeNetwork::is_enabled(), MayaFlux::Nodes::Network::NodeNetwork::m_audio_buffer_lock, m_coupling_enabled, m_couplings, MayaFlux::Nodes::Network::NodeNetwork::m_last_audio_buffer, m_modes, m_node_buffers, and update_mapped_parameters().

+ Here is the call graph for this function: