Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
clip_renderer.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/tick_types.h"
7#include "structure/arrangement/arranger_object_all.h"
8#include "structure/arrangement/loop_segment_iterator.h"
9#include "utils/audio.h"
10#include "utils/units.h"
11
12#include <juce_audio_basics/juce_audio_basics.h>
13
14namespace zrythm::structure::arrangement
15{
16
23class ClipRenderer final
24{
25public:
26 using TimelineRange = std::pair<dsp::TimelineTick, dsp::TimelineTick>;
27
41 const MidiClip &clip,
42 juce::MidiMessageSequence &events,
43 std::optional<TimelineRange> timeline_range_ticks = std::nullopt);
44
56 const ChordClip &clip,
57 juce::MidiMessageSequence &events,
58 std::optional<TimelineRange> timeline_range_ticks = std::nullopt);
59
70 static void serialize_to_buffer (
71 const AudioClip &clip,
72 juce::AudioSampleBuffer &buffer,
73 std::optional<TimelineRange> timeline_range_ticks = std::nullopt);
74
89 {
90 dsp::TimelineTick position;
91 float value;
93 float curve_curviness;
94
98 dsp::TimelineTick curve_origin_start;
99 dsp::TimelineTick curve_origin_end;
100 float curve_origin_value_a;
101 float curve_origin_value_b;
102 };
103
121 const AutomationClip &clip,
122 std::vector<RenderedAutomationPoint> &points,
123 std::optional<TimelineRange> timeline_range_ticks = std::nullopt)
124 [[clang::blocking]];
125
126private:
130 struct LoopParameters
131 {
132 dsp::ContentTick loop_start;
133 dsp::ContentTick loop_end;
134 dsp::ContentTick clip_start;
135 dsp::ContentTick loop_length;
136 dsp::ContentTick clip_length;
137 int num_loops;
138
139 LoopParameters (const Clip &clip);
140 };
141
142 template <ClipObject ClipT, typename EventsT>
143 static void serialize_clip (
144 const ClipT &clip,
145 EventsT &events,
146 // currently unused
147 std::optional<TimelineRange> timeline_range_ticks = std::nullopt)
148 {
149 const auto clip_length = clip.length ()->asTick ();
150
151 for_each_loop_segment (
152 clip.clipStartPosition ()->asTick (),
153 clip.loopStartPosition ()->asTick (), clip.loopEndPosition ()->asTick (),
154 clip_length, [&] (const LoopSegment &segment) {
155 if constexpr (std::is_same_v<ClipT, MidiClip>)
156 handle_midi_clip_range (clip, events, segment);
157 else if constexpr (std::is_same_v<ClipT, ChordClip>)
158 handle_chord_clip_range (clip, events, segment);
159 else if constexpr (std::is_same_v<ClipT, AutomationClip>)
160 handle_automation_clip_range (clip, events, segment);
161 });
162 }
163
164 static void handle_midi_clip_range (
165 const MidiClip &clip,
166 juce::MidiMessageSequence &events,
167 const LoopSegment &segment);
168
169 static void handle_chord_clip_range (
170 const ChordClip &clip,
171 juce::MidiMessageSequence &events,
172 const LoopSegment &segment);
173
174 static void handle_automation_clip_range (
175 const AutomationClip &clip,
176 std::vector<RenderedAutomationPoint> &points,
177 const LoopSegment &segment);
178
190 static utils::audio::AudioBuffer build_native_looped_buffer (
191 const AudioClip &clip,
192 units::sample_t out_start,
193 units::sample_t out_end);
194
198 static void
199 apply_gain_pass (const AudioClip &clip, juce::AudioSampleBuffer &buffer);
200
204 static void
205 apply_clip_fades_pass (const AudioClip &clip, juce::AudioSampleBuffer &buffer);
206
210 static void apply_builtin_fades_pass (
211 const AudioClip &clip,
212 juce::AudioSampleBuffer &buffer,
213 int builtin_fade_frames);
214};
215
216} // namespace zrythm::structure::arrangement
Algorithm
The algorithm to use for curves.
Definition curve.h:33
A clip for playing back audio samples.
Definition audio_clip.h:24
Represents an automation clip, which contains a collection of automation points.
A class that converts clip data to serialized formats.
static void serialize_to_buffer(const AudioClip &clip, juce::AudioSampleBuffer &buffer, std::optional< TimelineRange > timeline_range_ticks=std::nullopt)
Serializes an Audio clip to an audio sample buffer.
static void serialize_to_sequence(const ChordClip &clip, juce::MidiMessageSequence &events, std::optional< TimelineRange > timeline_range_ticks=std::nullopt)
Serializes a Chord clip to a MIDI message sequence.
static void serialize_to_points(const AutomationClip &clip, std::vector< RenderedAutomationPoint > &points, std::optional< TimelineRange > timeline_range_ticks=std::nullopt)
Serializes an AutomationClip to a list of control points in timeline-tick space (relative to clip sta...
static void serialize_to_sequence(const MidiClip &clip, juce::MidiMessageSequence &events, std::optional< TimelineRange > timeline_range_ticks=std::nullopt)
Serializes a MIDI clip to a MIDI message sequence.
Intermediate base class for all clip types.
Definition clip.h:37
A Clip containing MIDI events.
Definition midi_clip.h:26
A single control point in a rendered automation curve.
dsp::TimelineTick curve_origin_start
The AP pair that drives the curve starting at this point.
One iteration of the loop-expanded clip content.