38 juce::MidiMessageSequence &events,
39 std::optional<std::pair<double, double>> timeline_range_ticks = std::nullopt);
56 juce::MidiMessageSequence &events,
57 std::optional<std::pair<double, double>> timeline_range_ticks = std::nullopt);
74 juce::AudioSampleBuffer &buffer,
75 std::optional<std::pair<double, double>> timeline_range_ticks = std::nullopt);
109 std::vector<float> &values,
110 std::optional<std::pair<double, double>> timeline_range_ticks = std::nullopt)
117 struct LoopParameters
119 units::precise_tick_t loop_start;
120 units::precise_tick_t loop_end;
121 units::precise_tick_t clip_start;
122 units::precise_tick_t loop_length;
123 units::precise_tick_t region_length;
129 template <RegionObject RegionT,
typename EventsT>
130 static void serialize_region (
131 const RegionT ®ion,
134 std::optional<std::pair<double, double>> timeline_range_ticks = std::nullopt)
136 const auto * loop_range = region.loopRange ();
137 const auto loop_length = loop_range->get_loop_length_in_ticks ();
138 const auto region_length =
139 units::ticks (region.bounds ()->length ()->ticks ());
141 auto loop_segment_virtual_start =
142 units::ticks (loop_range->clipStartPosition ()->ticks ());
143 auto loop_segment_virtual_end =
144 units::ticks (loop_range->loopEndPosition ()->ticks ());
145 auto loop_segment_absolute_start = units::ticks (0.0);
146 auto loop_segment_absolute_end =
147 loop_segment_virtual_end - loop_segment_virtual_start;
148 if (loop_segment_absolute_end > region_length)
150 const auto delta = loop_segment_absolute_end - region_length;
151 loop_segment_virtual_end -= delta;
152 loop_segment_absolute_end -= delta;
155 while (loop_segment_absolute_start < region_length)
157 if constexpr (std::is_same_v<RegionT, MidiRegion>)
159 handle_midi_region_range (
162 loop_segment_virtual_start, loop_segment_virtual_end),
163 loop_segment_absolute_start);
165 else if constexpr (std::is_same_v<RegionT, ChordRegion>)
167 handle_chord_region_range (
170 loop_segment_virtual_start, loop_segment_virtual_end),
171 loop_segment_absolute_start);
173 else if constexpr (std::is_same_v<RegionT, AudioRegion>)
175 handle_audio_region_range (
178 loop_segment_virtual_start, loop_segment_virtual_end),
179 loop_segment_absolute_start);
181 else if constexpr (std::is_same_v<RegionT, AutomationRegion>)
183 handle_automation_region_range (
186 loop_segment_virtual_start, loop_segment_virtual_end),
187 loop_segment_absolute_start);
191 const auto currentLen =
192 loop_segment_absolute_end - loop_segment_absolute_start;
193 loop_segment_virtual_start =
194 units::ticks (loop_range->loopStartPosition ()->ticks ());
195 loop_segment_virtual_end =
196 units::ticks (loop_range->loopEndPosition ()->ticks ());
197 loop_segment_absolute_start += currentLen;
198 loop_segment_absolute_end += loop_length;
201 if (loop_segment_absolute_end > region_length)
203 const auto delta = loop_segment_absolute_end - region_length;
204 loop_segment_virtual_end -= delta;
205 loop_segment_absolute_end -= delta;
210 static void handle_midi_region_range (
211 const MidiRegion ®ion,
212 juce::MidiMessageSequence &events,
213 std::pair<units::precise_tick_t, units::precise_tick_t> virtual_range,
214 units::precise_tick_t absolute_start);
216 static void handle_chord_region_range (
217 const ChordRegion ®ion,
218 juce::MidiMessageSequence &events,
219 std::pair<units::precise_tick_t, units::precise_tick_t> virtual_range,
220 units::precise_tick_t absolute_start);
222 static void handle_audio_region_range (
223 const AudioRegion ®ion,
224 juce::AudioSampleBuffer &buffer,
225 std::pair<units::precise_tick_t, units::precise_tick_t> virtual_range,
226 units::precise_tick_t absolute_start);
228 static void handle_automation_region_range (
229 const AutomationRegion ®ion,
230 std::vector<float> &values,
231 std::pair<units::precise_tick_t, units::precise_tick_t> virtual_range,
232 units::precise_tick_t absolute_start);
238 apply_gain_pass (
const AudioRegion ®ion, juce::AudioSampleBuffer &buffer);
243 static void apply_region_fades_pass (
244 const AudioRegion ®ion,
245 juce::AudioSampleBuffer &buffer);
250 static void apply_builtin_fades_pass (
251 const AudioRegion ®ion,
252 juce::AudioSampleBuffer &buffer,
253 int builtin_fade_frames);