154 double loss_factor { 0.996 };
155 double reflection_closed { 1.0 };
156 double reflection_open { 1.0 };
189 double fundamental_freq,
190 double sample_rate = 48000.0);
196 void process_batch(
unsigned int num_samples)
override;
198 [[nodiscard]]
size_t get_node_count()
const override {
return m_segments.size(); }
201 void reset()
override;
203 [[nodiscard]] std::optional<double> get_node_output(
size_t index)
const override;
204 [[nodiscard]] std::unordered_map<std::string, std::string> get_metadata()
const override;
205 [[nodiscard]] std::optional<std::span<const double>> get_node_audio_buffer(
size_t index)
const override;
211 void map_parameter(
const std::string& param_name,
212 const std::shared_ptr<Node>& source,
215 void map_parameter(
const std::string& param_name,
216 const std::shared_ptr<NodeNetwork>& source)
override;
218 void unmap_parameter(
const std::string& param_name)
override;
233 void pluck(
double position = 0.5,
double strength = 1.0);
240 void strike(
double position = 0.5,
double strength = 1.0);
245 void set_exciter_type(ExciterType
type);
258 void set_exciter_duration(
double seconds);
264 void set_exciter_filter(
const std::shared_ptr<Filters::Filter>& filter) { m_exciter_filter = filter; }
270 void set_exciter_sample(
const std::vector<double>& sample);
281 m_exciter_node = node;
282 if (node && m_exciter_type == ExciterType::CONTINUOUS) {
283 initialize_exciter();
297 void set_fundamental(
double freq);
310 void set_loss_factor(
double loss);
315 [[nodiscard]]
double get_loss_factor()
const;
324 void set_loop_filter(
const std::shared_ptr<Filters::Filter>& filter);
333 void set_pickup_position(
double position);
338 [[nodiscard]]
double get_pickup_position()
const;
348 [[nodiscard]]
const std::vector<WaveguideSegment>&
get_segments()
const {
return m_segments; }
357 void set_loop_filter_closed(
const std::shared_ptr<Filters::Filter>& filter);
366 void set_loop_filter_open(
const std::shared_ptr<Filters::Filter>& filter);
389 size_t m_delay_length_integer { 0 };
390 double m_delay_length_fraction { 0.0 };
391 size_t m_pickup_sample { 0 };
392 double m_pickup_position { 0.5 };
400 double m_exciter_duration { 0.005 };
405 size_t m_exciter_sample_position {};
406 bool m_exciter_active {};
407 size_t m_exciter_samples_remaining {};
409 double m_exciter_strength { 1.0 };
411 size_t m_exciter_node_buffer_pos {};
417 mutable double m_last_output {};
425 void compute_delay_length();
426 void create_default_loop_filter();
435 [[nodiscard]]
double read_with_interpolation(
438 double fraction)
const;
440 double generate_exciter_sample();
441 void initialize_exciter();
443 void update_mapped_parameters();
444 void apply_broadcast_parameter(
const std::string& param,
double value);
445 void apply_one_to_one_parameter(
const std::string& param,
const std::shared_ptr<NodeNetwork>& source);
447 void process_unidirectional(
WaveguideSegment& seg,
unsigned int num_samples, std::vector<double>&
out);
448 void process_bidirectional(
WaveguideSegment& seg,
unsigned int num_samples, std::vector<double>&
out);
std::optional< glm::vec3 > position
std::vector< float > * out
vk::PhysicalDeviceType type
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