Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
channel_subgraph_builder.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/graph.h"
7#include "structure/tracks/channel.h"
8
9namespace zrythm::structure::tracks
10{
16{
17public:
18 static void add_nodes (dsp::graph::Graph &graph, Channel &ch);
19
33 static void add_connections (
34 dsp::graph::Graph &graph,
35 Channel &ch,
36 dsp::PortUuidReference track_processor_output);
37
47 template <dsp::FinalPortSubclass T>
49 dsp::graph::Graph &graph,
50 const T &src_port,
51 const T &dest_port)
52 {
53 auto * src = graph.get_nodes ().find_node_for_processable (src_port);
54 auto * dest = graph.get_nodes ().find_node_for_processable (dest_port);
55 assert (src);
56 assert (dest);
57 src->connect_to (*dest);
58 }
59
66 static bool connect_like_ports (
67 dsp::graph::Graph &graph,
68 const RangeOf<dsp::PortUuidReference> auto &src_refs,
69 const RangeOf<dsp::PortUuidReference> auto &dest_refs)
70 {
72 const auto object_getter = [] (auto &&port_ref) {
73 return port_ref.get_object ();
74 };
75 const auto src_output_ports =
76 src_refs | std::views::transform (object_getter);
77 const auto dest_input_ports =
78 dest_refs | std::views::transform (object_getter);
79
80 auto src_midi_out_ports =
81 src_output_ports
82 | std::views::filter (ObjectView::type_projection<dsp::MidiPort>)
83 | std::views::transform (ObjectView::type_transformation<dsp::MidiPort>);
84 auto dest_midi_in_ports =
85 dest_input_ports
86 | std::views::filter (ObjectView::type_projection<dsp::MidiPort>)
87 | std::views::transform (ObjectView::type_transformation<dsp::MidiPort>);
88 auto src_audio_out_ports =
89 src_output_ports
90 | std::views::filter (ObjectView::type_projection<dsp::AudioPort>)
91 | std::views::transform (ObjectView::type_transformation<dsp::AudioPort>);
92 auto dest_audio_in_ports =
93 dest_input_ports
94 | std::views::filter (ObjectView::type_projection<dsp::AudioPort>)
95 | std::views::transform (ObjectView::type_transformation<dsp::AudioPort>);
96 auto src_cv_out_ports =
97 src_output_ports
98 | std::views::filter (ObjectView::type_projection<dsp::CVPort>)
99 | std::views::transform (ObjectView::type_transformation<dsp::CVPort>);
100 auto dest_cv_in_ports =
101 dest_input_ports
102 | std::views::filter (ObjectView::type_projection<dsp::CVPort>)
103 | std::views::transform (ObjectView::type_transformation<dsp::CVPort>);
104
105 bool connections_made{};
106 const auto make_conns = [&connections_made, &graph] (const auto &ports) {
107 const auto &[src_port, dest_port] = ports;
108 add_connection_for_ports (graph, *src_port, *dest_port);
109 connections_made = true;
110 };
111
112 std::ranges::for_each (
113 std::views::zip (src_midi_out_ports, dest_midi_in_ports), make_conns);
114 std::ranges::for_each (
115 std::views::zip (src_audio_out_ports, dest_audio_in_ports), make_conns);
116 std::ranges::for_each (
117 std::views::zip (src_cv_out_ports, dest_cv_in_ports), make_conns);
118
119 return connections_made;
120 }
121};
122} // namespace zrythm::structure::tracks
The Graph class represents a graph of DSP nodes.
Definition graph.h:20
A helper class to add nodes and standard connections for a channel to a DSP graph.
static void add_connection_for_ports(dsp::graph::Graph &graph, const T &src_port, const T &dest_port)
Adds a connection to the graph for the given ports.
static void add_connections(dsp::graph::Graph &graph, Channel &ch, dsp::PortUuidReference track_processor_output)
Adds connections for the nodes already in the graph.
static bool connect_like_ports(dsp::graph::Graph &graph, const RangeOf< dsp::PortUuidReference > auto &src_refs, const RangeOf< dsp::PortUuidReference > auto &dest_refs)
Connects ports of the same type in the given source and destination ranges.
Represents a channel strip on the mixer.
Definition channel.h:57
A unified view over UUID-identified objects that supports: