49 friend class ArrangerObjectFactory;
53 : dependencies_ (std::move (dependencies))
57 Builder &with_clip (dsp::FileAudioSourceUuidReference clip_id)
58 requires (std::is_same_v<ObjT, AudioRegion>)
60 clip_id_.emplace (std::move (clip_id));
65 Builder &with_start_ticks (units::precise_tick_t start_ticks)
67 start_ticks_ = start_ticks;
72 Builder &with_end_ticks (units::precise_tick_t end_ticks)
75 end_ticks_ = end_ticks;
79 Builder &with_name (
const QString &name)
86 Builder &with_pitch (
const int pitch)
87 requires (std::is_same_v<ObjT, MidiNote>)
93 Builder &with_velocity (
const int vel)
94 requires (std::is_same_v<ObjT, MidiNote>)
100 Builder &with_midi_channel (
const int channel)
102 std::is_same_v<ObjT, MidiNote> || std::is_same_v<ObjT, MidiControlEvent>)
104 midi_channel_ = channel;
108 Builder &with_automatable_value (
const double automatable_val)
109 requires (std::is_same_v<ObjT, AutomationPoint>)
111 automatable_value_ = automatable_val;
115 Builder &with_chord_descriptor (
const int chord_descriptor_index)
116 requires (std::is_same_v<ObjT, ChordObject>)
118 chord_descriptor_index_ = chord_descriptor_index;
123 requires (std::is_same_v<ObjT, ScaleObject>)
125 scale_ = std::move (scale);
130 requires (std::is_same_v<ObjT, Marker>)
132 marker_type_ = marker_type;
141 std::unique_ptr<ObjT> ret;
142 if constexpr (std::is_same_v<ObjT, AudioRegion>)
144 ret = std::make_unique<ObjT> (
145 dependencies_.tempo_map_, dependencies_.registry_,
146 dependencies_.musical_mode_getter_);
150 ret = std::make_unique<ObjT> (
151 dependencies_.tempo_map_, dependencies_.registry_);
153 else if constexpr (std::is_same_v<ObjT, Marker>)
155 ret = std::make_unique<ObjT> (
156 dependencies_.tempo_map_,
159 else if constexpr (std::is_same_v<ObjT, AudioSourceObject>)
163 auto file_audio_source = utils::create_object<dsp::FileAudioSource> (
164 dependencies_.registry_, dummy_buf,
165 utils::audio::BitDepth::BIT_DEPTH_32, units::sample_rate (44100),
167 ret = std::make_unique<ObjT> (
168 dependencies_.tempo_map_, dependencies_.registry_,
173 ret = std::make_unique<ObjT> (dependencies_.tempo_map_);
178 auto build_in_registry ()
180 auto obj_ref = [&] () {
182 dependencies_.registry_.register_object (*obj_unique_ptr);
183 structure::arrangement::ArrangerObjectUuidReference ret_ref{
184 obj_unique_ptr->get_uuid (), dependencies_.registry_
186 obj_unique_ptr.release ();
190 auto * obj = obj_ref.template get_object_as<ObjT> ();
192 if constexpr (RegionObject<ObjT>)
194 obj->loopRange ()->setTrackBounds (
true);
199 if (!end_ticks_ && !clip_id_)
201 if constexpr (BoundedObject<ObjT>)
204 if constexpr (TimelineObject<ObjT>)
207 dependencies_.last_timeline_obj_len_provider_ ();
211 len_ticks = dependencies_.last_editor_obj_len_provider_ ();
213 get_object_bounds (*obj)->length ()->setTicks (len_ticks);
216 obj->position ()->setTicks ((*start_ticks_).in (units::ticks));
221 if constexpr (std::is_same_v<ObjT, AudioRegion>)
223 auto source_object = utils::create_object<AudioSourceObject> (
224 dependencies_.registry_, dependencies_.tempo_map_,
225 dependencies_.registry_, clip_id_.value ());
226 obj->set_source (source_object);
227 obj->bounds ()->length ()->setSamples (
229 .template get_object_as<dsp::FileAudioSource> ()
230 ->get_num_frames ());
236 if constexpr (BoundedObject<ObjT>)
238 get_object_bounds (*obj)->length ()->setTicks (
239 (*end_ticks_).in (units::ticks) -obj->position ()->ticks ());
245 if constexpr (NamedObject<ObjT>)
247 if constexpr (RegionObject<ObjT>)
249 obj->name ()->setName (*name_);
253 obj->name ()->setName (*name_);
260 if constexpr (std::is_same_v<ObjT, MidiNote>)
262 obj->setPitch (*pitch_);
268 if constexpr (std::is_same_v<ObjT, MidiNote>)
270 obj->setVelocity (*velocity_);
276 if constexpr (std::is_same_v<ObjT, MidiNote>)
278 obj->setMidiChannel (*midi_channel_);
280 else if constexpr (std::is_same_v<ObjT, MidiControlEvent>)
282 obj->setChannel (*midi_channel_);
286 if (automatable_value_)
288 if constexpr (std::is_same_v<ObjT, AutomationPoint>)
290 obj->setValue (
static_cast<float> (*automatable_value_));
296 if constexpr (std::is_same_v<ObjT, ScaleObject>)
298 obj->setScale (scale_.release ());
302 if constexpr (std::is_same_v<ObjT, AutomationPoint>)
304 obj->curveOpts ()->setAlgorithm (
305 dependencies_.automation_curve_algorithm_provider_ ());
308 if (chord_descriptor_index_)
310 if constexpr (std::is_same_v<ObjT, ChordObject>)
312 obj->setChordDescriptorIndex (*chord_descriptor_index_);
320 Dependencies dependencies_;
321 std::optional<dsp::FileAudioSourceUuidReference> clip_id_;
322 std::optional<units::precise_tick_t> start_ticks_;
323 std::optional<units::precise_tick_t> end_ticks_;
324 std::optional<QString> name_;
325 std::optional<int> pitch_;
326 std::optional<double> automatable_value_;
327 std::optional<int> chord_descriptor_index_;
328 utils::QObjectUniquePtr<dsp::MusicalScale> scale_;
329 std::optional<int> velocity_;
330 std::optional<int> midi_channel_;
331 std::optional<Marker::MarkerType> marker_type_;
392 units::precise_tick_t startTicks,
393 std::variant<int, double> value)
396 std::move (get_builder<ChildT> ().with_start_ticks (startTicks));
397 if constexpr (std::is_same_v<ChildT, MidiNote>)
399 const auto ival = std::get<int> (value);
400 assert (ival >= 0 && ival < 128);
401 builder.with_pitch (ival);
403 else if constexpr (std::is_same_v<ChildT, AutomationPoint>)
405 builder.with_automatable_value (std::get<double> (value));
407 else if constexpr (std::is_same_v<ChildT, ChordObject>)
409 builder.with_chord_descriptor (std::get<int> (value));
411 return builder.build_in_registry ();