51class TimeSignatureEventWrapper :
public QObject
54 Q_PROPERTY (qint64 tick READ tick CONSTANT)
55 Q_PROPERTY (
int numerator READ numerator CONSTANT)
56 Q_PROPERTY (
int denominator READ denominator CONSTANT)
61 explicit TimeSignatureEventWrapper (
62 const TempoMap::TimeSignatureEvent &event,
63 QObject * parent =
nullptr)
64 : QObject (parent), event_ (event)
68 qint64 tick ()
const {
return event_.tick.in (units::ticks); }
69 int numerator ()
const {
return event_.numerator; }
70 int denominator ()
const {
return event_.denominator; }
73 TempoMap::TimeSignatureEvent event_;
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 QML_NAMED_ELEMENT (TempoMap)
119 explicit TempoMapWrapper (TempoMap &tempo_map, QObject * parent =
nullptr)
120 : QObject (parent), tempo_map_ (tempo_map)
125 QQmlListProperty<TempoEventWrapper> tempoEvents ()
127 return {
this, &tempoEventWrappers_ };
130 QQmlListProperty<TimeSignatureEventWrapper> timeSignatureEvents ()
132 return {
this, &timeSigEventWrappers_ };
139 Q_INVOKABLE
int timeSignatureDenominatorAtTick (int64_t tick)
const;
141 Q_INVOKABLE
double tempoAtTick (int64_t tick)
const;
147 void setSampleRate (
double sampleRate)
149 if (qFuzzyCompare (sampleRate, tempo_map_.get_sample_rate ()))
151 tempo_map_.set_sample_rate (units::sample_rate (sampleRate));
152 Q_EMIT sampleRateChanged ();
158 tempo_map_.add_tempo_event (
160 rebuildTempoWrappers ();
161 Q_EMIT tempoEventsChanged ();
165 addTimeSignatureEvent (qint64 tick,
int numerator,
int denominator)
167 tempo_map_.add_time_signature_event (
168 units::ticks (tick), numerator, denominator);
169 rebuildTimeSigWrappers ();
170 Q_EMIT timeSignatureEventsChanged ();
173 Q_INVOKABLE
void clearTempoEvents ()
175 tempo_map_.clear_tempo_events ();
176 rebuildTempoWrappers ();
177 Q_EMIT tempoEventsChanged ();
180 Q_INVOKABLE
void clearTimeSignatureEvents ()
182 tempo_map_.clear_time_signature_events ();
183 rebuildTimeSigWrappers ();
184 Q_EMIT timeSignatureEventsChanged ();
187 Q_INVOKABLE MusicalPositionWrapper * getMusicalPosition (int64_t tick)
const
189 return new MusicalPositionWrapper (
190 tempo_map_.tick_to_musical_position (units::ticks (tick)));
193 Q_INVOKABLE QString getMusicalPositionString (int64_t tick)
const;
196 getTickFromMusicalPosition (
int bar,
int beat,
int sixteenth,
int tick)
const
199 .musical_position_to_tick (
200 TempoMap::MusicalPosition{
201 .bar = bar, .beat = beat, .sixteenth = sixteenth, .tick = tick })
207 Q_INVOKABLE
int getMusicalPositionBar (int64_t tick)
const
209 return tempo_map_.tick_to_musical_position (units::ticks (tick)).bar;
211 Q_INVOKABLE
int getMusicalPositionBeat (int64_t tick)
const
213 return tempo_map_.tick_to_musical_position (units::ticks (tick)).beat;
215 Q_INVOKABLE
int getMusicalPositionSixteenth (int64_t tick)
const
217 return tempo_map_.tick_to_musical_position (units::ticks (tick)).sixteenth;
219 Q_INVOKABLE
int getMusicalPositionTick (int64_t tick)
const
221 return tempo_map_.tick_to_musical_position (units::ticks (tick)).tick;
229 rebuildTempoWrappers ();
230 rebuildTimeSigWrappers ();
234 const TempoMap &
get_tempo_map ()
const {
return tempo_map_; }
237 void tempoEventsChanged ();
238 void timeSignatureEventsChanged ();
239 void sampleRateChanged ();
242 void rebuildTempoWrappers ()
244 qDeleteAll (tempoEventWrappers_);
245 tempoEventWrappers_.clear ();
246 for (
const auto &event : tempo_map_.get_tempo_events ())
248 tempoEventWrappers_.append (
new TempoEventWrapper (event,
this));
252 void rebuildTimeSigWrappers ()
254 qDeleteAll (timeSigEventWrappers_);
255 timeSigEventWrappers_.clear ();
256 for (
const auto &event : tempo_map_.get_time_signature_events ())
258 timeSigEventWrappers_.append (
259 new TimeSignatureEventWrapper (event,
this));
264 TempoMap &tempo_map_;
265 QList<TempoEventWrapper *> tempoEventWrappers_;
266 QList<TimeSignatureEventWrapper *> timeSigEventWrappers_;