makepad_audio_graph/
instrument.rs1use {
2 crate::{
3 makepad_platform::*,
4 register_audio_component,
5 audio_traits::*
6 },
7};
8
9live_design!{
10 pub Instrument= {{Instrument}} {
11 }
12}
13
14enum FromUI {}
16
17#[derive(Live)]
18struct Instrument {
19 #[rust] step_order: Vec<LiveId>,
20 #[rust] steps: ComponentMap<LiveId, AudioComponentRef>,
21
22 #[rust] from_ui: FromUISender<FromUI>,
23}
24
25
26struct Step {
27 graph_node: Box<dyn AudioGraphNode + Send >,
28 input_buffer: AudioBuffer,
29}
30
31struct Node {
32 _from_ui: FromUIReceiver<FromUI>,
33 steps: Vec<Step>
34}
35
36impl AudioGraphNode for Node {
37 fn all_notes_off(&mut self){
38 for step in &mut self.steps {
39 step.graph_node.all_notes_off();
40 }
41 }
42 fn handle_midi_data(&mut self, data: MidiData) {
43 for step in &mut self.steps {
44 step.graph_node.handle_midi_data(data);
45 }
46 }
47
48 fn render_to_audio_buffer(&mut self, info: AudioInfo, outputs: &mut [&mut AudioBuffer], inputs: &[&AudioBuffer], display:&mut DisplayAudioGraph) {
49 let steps = &mut self.steps;
51 let num_steps = steps.len();
52 for i in (0..num_steps).rev() {
53 if i == 0 { let step = &mut steps[0];
55 if i == num_steps - 1 { step.graph_node.render_to_audio_buffer(info, outputs, inputs, display);
57 }
58 else{
59 step.graph_node.render_to_audio_buffer(info, outputs, &[&step.input_buffer], display);
60 }
61 }
62 else {
63 let (step0, step1) = steps.split_at_mut(i);
64 let output_buffer = &mut step0[i - 1].input_buffer;
65 output_buffer.resize_like(outputs[0]);
66 if i == num_steps - 1 { step1[0].graph_node.render_to_audio_buffer(info, &mut[output_buffer], inputs, display);
68 }
69 else {
70 let step = &mut step1[0];
71 step.graph_node.render_to_audio_buffer(info, &mut[output_buffer], &[&step.input_buffer], display);
72 }
73 };
74 }
75 }
76}
77
78impl LiveRegister for Instrument{
79 fn live_register(cx: &mut Cx){
80 register_audio_component!(cx, Instrument)
81 }
82}
83
84impl LiveHook for Instrument {
85 fn apply_value_instance(&mut self, cx: &mut Cx, apply: &mut Apply, index: usize, nodes: &[LiveNode]) -> usize {
86 if apply.from.is_from_doc() {
87 self.step_order.push(nodes[index].id);
88 }
89 self.steps.get_or_insert(cx, nodes[index].id, | cx | {AudioComponentRef::new(cx)})
90 .apply(cx, apply, index, nodes)
91 }
92
93 fn after_apply(&mut self, _cx: &mut Cx, apply: &mut Apply, _index: usize, _nodes: &[LiveNode]) {
94 if apply.from.is_from_doc() {
96 self.steps.retain_visible();
97 }
98 }
99}
100
101impl AudioComponent for Instrument {
102 fn get_graph_node(&mut self, cx:&mut Cx) -> Box<dyn AudioGraphNode + Send> {
103 self.from_ui.new_channel();
104 let mut steps = Vec::new();
105 for step_id in &self.step_order {
106 if let Some(input) = self.steps.get_mut(step_id).unwrap().as_mut() {
107 steps.push(Step {
108 graph_node: input.get_graph_node(cx),
109 input_buffer: AudioBuffer::default()
110 });
111 }
112 }
113 Box::new(Node {
114 steps,
115 _from_ui: self.from_ui.receiver()
116 })
117 }
118
119 fn handle_event_with(&mut self, cx: &mut Cx, event: &Event, dispatch_action: &mut dyn FnMut(&mut Cx, AudioComponentAction)) {
120 for step in self.steps.values_mut(){
121 if let Some(step) = step.as_mut(){
122 step.handle_event_with(cx, event, dispatch_action)
123 }
124 }
125 }
126
127 fn audio_query(&mut self, query: &AudioQuery, callback: &mut Option<AudioQueryCb>) -> AudioResult {
128 for input in self.steps.values_mut(){
129 input.audio_query(query, callback)?;
130 }
131 AudioResult::not_found()
132 }
133}