56 if (! playStartPosition)
59 const auto s = *playStartPosition;
69 const auto duration1 = s - r.getStart();
70 const auto duration2 = r.getEnd() - s;
73 splitRange.range1 = { loopRange.getStart() + offset - duration1, duration1 };
74 splitRange.playing1 =
false;
75 splitRange.range2 = { loopRange.getStart() + offset, duration2 };
76 splitRange.playing2 =
true;
85 assert (r.getStart () >= s);
86 const auto loopStart = loopRange.getStart();
87 const auto sourceTimelineStart = s - offset;
88 const BeatRange virtualClipTimelineRange (sourceTimelineStart, loopRange.getLength());
90 const auto wrappedTimelineStart = virtualClipTimelineRange.getStart()
91 + BeatDuration::fromBeats (
std::fmod ((r.getStart() - virtualClipTimelineRange.getStart()).inBeats(),
92 virtualClipTimelineRange.getLength().inBeats()));
93 const auto wrappedTimelineEnd = virtualClipTimelineRange.getStart()
94 + BeatDuration::fromBeats (
std::fmod ((r.getEnd() - virtualClipTimelineRange.getStart()).inBeats(),
95 virtualClipTimelineRange.getLength().inBeats()));
96 assert (wrappedTimelineEnd != wrappedTimelineStart);
97 assert (virtualClipTimelineRange.contains (wrappedTimelineStart));
98 assert (virtualClipTimelineRange.contains (wrappedTimelineEnd));
100 if (wrappedTimelineEnd > wrappedTimelineStart)
103 splitRange.range1 = { wrappedTimelineStart + toDuration (loopStart) - offset,
104 wrappedTimelineEnd + toDuration (loopStart) - offset };
105 splitRange.playing1 =
true;
112 assert (wrappedTimelineStart > wrappedTimelineEnd);
114 splitRange.range1 = { wrappedTimelineStart + toDuration (loopStart) - offset,
115 virtualClipTimelineRange.getEnd() + toDuration (loopStart) - offset };
116 splitRange.playing1 =
true;
117 splitRange.range2 = { virtualClipTimelineRange.getStart() + toDuration (loopStart) - offset,
118 wrappedTimelineEnd + toDuration (loopStart) - offset };
119 splitRange.playing2 =
true;
125 if (
const BeatRange validClipRange (s, clipRange.getLength());
126 validClipRange.intersects (r))
128 const auto clipStart = clipRange.getStart();
129 const auto clipEnd = clipRange.getEnd();
135 if (r.getStart() < s)
137 const auto duration1 = s - r.getStart();
138 const auto duration2 = r.getEnd() - s;
141 splitRange.range1 = { clipStart - duration1, clipStart };
142 splitRange.playing1 =
false;
143 splitRange.range2 = { clipStart, duration2 };
144 splitRange.playing2 =
true;
150 if (r.getEnd() > validClipRange.getEnd())
152 const auto duration1 = validClipRange.getEnd() - r.getStart();
153 const auto duration2 = r.getEnd() - validClipRange.getEnd();
156 splitRange.range1 = { clipEnd - duration1, clipEnd };
157 splitRange.playing1 =
true;
158 splitRange.range2 = { clipEnd, duration2 };
159 splitRange.playing2 =
false;
165 assert (validClipRange.contains (r));
166 const auto positionInClip = r.getStart() - toDuration (s);
169 splitRange.range1 = { positionInClip + toDuration (clipStart), r.getLength() };
170 splitRange.playing1 =
true;