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);
254 void set_exciter_duration(
double seconds);
260 void set_exciter_filter(
const std::shared_ptr<Filters::Filter>& filter) { m_exciter_filter = filter; }
266 void set_exciter_sample(
const std::vector<double>& sample);
284 void set_fundamental(
double freq);
297 void set_loss_factor(
double loss);
302 [[nodiscard]]
double get_loss_factor()
const;
311 void set_loop_filter(
const std::shared_ptr<Filters::Filter>& filter);
320 void set_pickup_position(
double position);
325 [[nodiscard]]
double get_pickup_position()
const;
335 [[nodiscard]]
const std::vector<WaveguideSegment>&
get_segments()
const {
return m_segments; }
344 void set_loop_filter_closed(
const std::shared_ptr<Filters::Filter>& filter);
353 void set_loop_filter_open(
const std::shared_ptr<Filters::Filter>& filter);
376 size_t m_delay_length_integer { 0 };
377 double m_delay_length_fraction { 0.0 };
378 size_t m_pickup_sample { 0 };
386 double m_exciter_duration { 0.005 };
391 size_t m_exciter_sample_position {};
392 bool m_exciter_active {};
393 size_t m_exciter_samples_remaining {};
399 mutable double m_last_output {};
407 void compute_delay_length();
408 void create_default_loop_filter();
417 [[nodiscard]]
double read_with_interpolation(
420 double fraction)
const;
422 double generate_exciter_sample();
423 void initialize_exciter();
425 void update_mapped_parameters();
426 void apply_broadcast_parameter(
const std::string& param,
double value);
427 void apply_one_to_one_parameter(
const std::string& param,
const std::shared_ptr<NodeNetwork>& source);
429 void process_unidirectional(
WaveguideSegment& seg,
unsigned int num_samples);
430 void process_bidirectional(
WaveguideSegment& seg,
unsigned int num_samples);
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_type(ExciterType type)
Set exciter type.
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.
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