103class TempoMapWrapper :
public QObject
107 QQmlListProperty<TempoEventWrapper> tempoEvents READ tempoEvents NOTIFY
110 QQmlListProperty<TimeSignatureEventWrapper> timeSignatureEvents READ
111 timeSignatureEvents NOTIFY timeSignatureEventsChanged)
113 double sampleRate READ sampleRate WRITE setSampleRate NOTIFY
115 Q_PROPERTY (
double baseBpm READ baseBpm WRITE setBaseBpm NOTIFY baseBpmChanged)
117 int baseTimeSignatureNumerator READ baseTimeSignatureNumerator WRITE
118 setBaseTimeSignatureNumerator NOTIFY baseTimeSignatureChanged)
120 int baseTimeSignatureDenominator READ baseTimeSignatureDenominator WRITE
121 setBaseTimeSignatureDenominator NOTIFY baseTimeSignatureChanged)
122 QML_NAMED_ELEMENT (TempoMap)
126 explicit TempoMapWrapper (TempoMap &tempo_map, QObject * parent =
nullptr)
127 : QObject (parent), tempo_map_ (tempo_map)
132 QQmlListProperty<TempoEventWrapper> tempoEvents ()
134 return {
this, &tempoEventWrappers_ };
137 QQmlListProperty<TimeSignatureEventWrapper> timeSignatureEvents ()
139 return {
this, &timeSigEventWrappers_ };
146 Q_INVOKABLE
int timeSignatureDenominatorAtTick (int64_t tick)
const;
148 Q_INVOKABLE
double tempoAtTick (int64_t tick)
const;
151 Q_INVOKABLE
int getPpq ()
const
156 double sampleRate ()
const
158 return tempo_map_.get_sample_rate ().in (units::sample_rate);
160 void setSampleRate (
double sampleRate)
164 sampleRate, tempo_map_.get_sample_rate ().in (units::sample_rate)))
166 tempo_map_.set_sample_rate (units::sample_rate (sampleRate));
167 Q_EMIT sampleRateChanged ();
172 double baseBpm ()
const {
return tempo_map_.base_bpm ().in (units::bpm); }
173 void setBaseBpm (
double bpm)
175 if (qFuzzyCompare (bpm, baseBpm ()))
177 tempo_map_.set_base_bpm (units::bpm (bpm));
178 rebuildTempoWrappers ();
179 Q_EMIT baseBpmChanged ();
180 Q_EMIT tempoEventsChanged ();
183 int baseTimeSignatureNumerator ()
const
185 return tempo_map_.base_time_signature ().numerator;
187 int baseTimeSignatureDenominator ()
const
189 return tempo_map_.base_time_signature ().denominator;
191 void setBaseTimeSignatureNumerator (
int numerator)
193 if (numerator == baseTimeSignatureNumerator ())
195 tempo_map_.set_base_time_signature (
196 numerator, baseTimeSignatureDenominator ());
197 rebuildTimeSigWrappers ();
198 Q_EMIT baseTimeSignatureChanged ();
199 Q_EMIT timeSignatureEventsChanged ();
201 void setBaseTimeSignatureDenominator (
int denominator)
203 if (denominator == baseTimeSignatureDenominator ())
205 tempo_map_.set_base_time_signature (
206 baseTimeSignatureNumerator (), denominator);
207 rebuildTimeSigWrappers ();
208 Q_EMIT baseTimeSignatureChanged ();
209 Q_EMIT timeSignatureEventsChanged ();
215 tempo_map_.add_tempo_event (
216 units::ticks (tick), units::bpm (bpm),
218 rebuildTempoWrappers ();
219 Q_EMIT tempoEventsChanged ();
223 addTimeSignatureEvent (qint64 tick,
int numerator,
int denominator)
225 tempo_map_.add_time_signature_event (
226 units::ticks (tick), numerator, denominator);
227 rebuildTimeSigWrappers ();
228 Q_EMIT timeSignatureEventsChanged ();
231 Q_INVOKABLE
void clearTempoEvents ()
233 tempo_map_.clear_tempo_events ();
234 rebuildTempoWrappers ();
235 Q_EMIT tempoEventsChanged ();
238 Q_INVOKABLE
void clearTimeSignatureEvents ()
240 tempo_map_.clear_time_signature_events ();
241 rebuildTimeSigWrappers ();
242 Q_EMIT timeSignatureEventsChanged ();
245 Q_INVOKABLE MusicalPositionWrapper * getMusicalPosition (int64_t tick)
const
247 return new MusicalPositionWrapper (
248 tempo_map_.tick_to_musical_position (units::ticks (tick)));
251 Q_INVOKABLE QString getMusicalPositionString (int64_t tick)
const;
254 getTickFromMusicalPosition (
int bar,
int beat,
int sixteenth,
int tick)
const
257 .musical_position_to_tick (
258 TempoMap::MusicalPosition{
259 .bar = bar, .beat = beat, .sixteenth = sixteenth, .tick = tick })
266 Q_INVOKABLE
int getMusicalPositionBar (int64_t tick)
const
268 return tempo_map_.tick_to_musical_position (units::ticks (tick)).bar;
270 Q_INVOKABLE
int getMusicalPositionBeat (int64_t tick)
const
272 return tempo_map_.tick_to_musical_position (units::ticks (tick)).beat;
274 Q_INVOKABLE
int getMusicalPositionSixteenth (int64_t tick)
const
276 return tempo_map_.tick_to_musical_position (units::ticks (tick)).sixteenth;
278 Q_INVOKABLE
int getMusicalPositionTick (int64_t tick)
const
288 rebuildTempoWrappers ();
289 rebuildTimeSigWrappers ();
293 const TempoMap &
get_tempo_map ()
const {
return tempo_map_; }
296 void tempoEventsChanged ();
297 void timeSignatureEventsChanged ();
298 void sampleRateChanged ();
299 void baseBpmChanged ();
300 void baseTimeSignatureChanged ();
303 void rebuildTempoWrappers ()
305 qDeleteAll (tempoEventWrappers_);
306 tempoEventWrappers_.clear ();
309 tempoEventWrappers_.append (
new TempoEventWrapper (event,
this));
313 void rebuildTimeSigWrappers ()
315 qDeleteAll (timeSigEventWrappers_);
316 timeSigEventWrappers_.clear ();
317 for (
const auto &event : tempo_map_.time_signature_events ())
319 timeSigEventWrappers_.append (
320 new TimeSignatureEventWrapper (event,
this));
325 TempoMap &tempo_map_;
326 QList<TempoEventWrapper *> tempoEventWrappers_;
327 QList<TimeSignatureEventWrapper *> timeSigEventWrappers_;