154 double loss_factor { 0.996 };
155 double reflection_closed { -1.0 };
156 double reflection_open { 1.0 };
188 double fundamental_freq,
189 double sample_rate = 48000.0);
195 void process_batch(
unsigned int num_samples)
override;
197 [[nodiscard]]
size_t get_node_count()
const override {
return m_segments.size(); }
200 void reset()
override;
202 [[nodiscard]] std::optional<double> get_node_output(
size_t index)
const override;
203 [[nodiscard]] std::unordered_map<std::string, std::string> get_metadata()
const override;
204 [[nodiscard]] std::optional<std::span<const double>> get_node_audio_buffer(
size_t index)
const override;
210 void map_parameter(
const std::string& param_name,
211 const std::shared_ptr<Node>& source,
212 MappingMode mode = MappingMode::BROADCAST)
override;
214 void map_parameter(
const std::string& param_name,
215 const std::shared_ptr<NodeNetwork>& source)
override;
217 void unmap_parameter(
const std::string& param_name)
override;
231 void pluck(
double position = 0.5,
double strength = 1.0);
238 void strike(
double position = 0.5,
double strength = 1.0);
243 void set_exciter_type(ExciterType type);
256 void set_exciter_duration(
double seconds);
262 void set_exciter_filter(
const std::shared_ptr<Filters::Filter>& filter) { m_exciter_filter = filter; }
268 void set_exciter_sample(
const std::vector<double>& sample);
286 void set_fundamental(
double freq);
299 void set_loss_factor(
double loss);
304 [[nodiscard]]
double get_loss_factor()
const;
313 void set_loop_filter(
const std::shared_ptr<Filters::Filter>& filter);
322 void set_pickup_position(
double position);
327 [[nodiscard]]
double get_pickup_position()
const;
337 [[nodiscard]]
const std::vector<WaveguideSegment>&
get_segments()
const {
return m_segments; }
346 void set_loop_filter_closed(
const std::shared_ptr<Filters::Filter>& filter);
355 void set_loop_filter_open(
const std::shared_ptr<Filters::Filter>& filter);
378 size_t m_delay_length_integer { 0 };
379 double m_delay_length_fraction { 0.0 };
380 size_t m_pickup_sample { 0 };
388 double m_exciter_duration { 0.005 };
393 size_t m_exciter_sample_position {};
394 bool m_exciter_active {};
395 size_t m_exciter_samples_remaining {};
397 double m_exciter_strength { 1.0 };
399 size_t m_exciter_node_buffer_pos {};
405 mutable double m_last_output {};
413 void compute_delay_length();
414 void create_default_loop_filter();
423 [[nodiscard]]
double read_with_interpolation(
426 double fraction)
const;
428 double generate_exciter_sample();
429 void initialize_exciter();
431 void update_mapped_parameters();
432 void apply_broadcast_parameter(
const std::string& param,
double value);
433 void apply_one_to_one_parameter(
const std::string& param,
const std::shared_ptr<NodeNetwork>& source);
435 void process_unidirectional(
WaveguideSegment& seg,
unsigned int num_samples, std::vector<double>& out);
436 void process_bidirectional(
WaveguideSegment& seg,
unsigned int num_samples, std::vector<double>& out);
Unified generative infrastructure for stochastic and procedural algorithms.
History buffer for difference equations and recursive relations.
Abstract base class for structured collections of nodes with defined relationships.
Kinesis::Stochastic::Stochastic m_random_generator
MeasurementMode get_measurement_mode() const
Get current measurement mode.
WaveguideType get_type() const
Get waveguide type.
std::shared_ptr< Node > m_exciter_node
void set_exciter_filter(const std::shared_ptr< Filters::Filter > &filter)
Set filter for shaped noise excitation.
void set_exciter_node(const std::shared_ptr< Node > &node)
Set continuous exciter node (for bowing/blowing)
size_t get_node_count() const override
Get the number of nodes in the network.
WaveguideType
Physical structure being modeled.
ExciterType get_exciter_type() const
Get current exciter type.
std::vector< double > m_exciter_node_buffer
const std::vector< WaveguideSegment > & get_segments() const
Get read-only access to segments.
std::vector< double > m_exciter_sample
std::shared_ptr< Filters::Filter > m_exciter_filter
ExciterType
Excitation signal types for waveguide synthesis.
MeasurementMode
Whether node outputs represent pressure or velocity (for future use) Pressure: output is physical pre...
void set_measurement_mode(MeasurementMode mode)
Set measurement mode for output.
std::vector< WaveguideSegment > m_segments
double get_fundamental() const
Get current fundamental frequency.
Digital waveguide synthesis via uni- and bidirectional delay-line architectures.
MappingMode
Defines how nodes map to external entities (e.g., audio channels, graphics objects)
Memory::HistoryBuffer< double > p_minus
Backward-traveling wave rail (BIDIRECTIONAL only)
std::shared_ptr< Filters::Filter > loop_filter_open
BIDIRECTIONAL: open-end filter (bell/bridge)
PropagationMode
Whether this segment uses one or two traveling-wave rails.
std::shared_ptr< Filters::Filter > loop_filter_closed
BIDIRECTIONAL: closed-end filter (mouthpiece/nut)
WaveguideSegment(size_t length, PropagationMode prop_mode=PropagationMode::UNIDIRECTIONAL)
Construct segment with both rails at the specified length.
std::shared_ptr< Filters::Filter > loop_filter
UNIDIRECTIONAL: single termination filter.
Memory::HistoryBuffer< double > p_plus
Forward-traveling wave rail.
1D delay-line segment supporting both uni- and bidirectional propagation