10#include "utils/units.h"
12#include <nlohmann/json_fwd.hpp>
38 friend class TempoMapWrapper;
55 friend void to_json (nlohmann::json &j,
const TempoEvent &e);
56 friend void from_json (
const nlohmann::json &j,
TempoEvent &e);
66 constexpr auto quarters_per_bar ()
const
71 constexpr auto ticks_per_bar ()
const
76 constexpr auto ticks_per_beat ()
const
82 is_different_time_signature (
const TimeSignatureEvent &other)
const
87 friend void to_json (nlohmann::json &j,
const TimeSignatureEvent &e);
88 friend void from_json (
const nlohmann::json &j, TimeSignatureEvent &e);
109 : sample_rate_ (sampleRate)
116 sample_rate_ = sampleRate;
165 units::sample_t tick_to_samples_rounded (units::precise_tick_t tick)
const
176 const auto seconds = samples / sample_rate_;
201 MusicalPosition samples_to_musical_position (units::sample_t samples)
const;
213 static consteval int get_ppq () {
return from_nttp (PPQ).in (units::ticks); }
218 return sample_rate_.in (units::sample_rate);
221 void set_default_bpm (
double bpm) { default_tempo_.
bpm = bpm; }
222 void set_default_time_signature (
int numerator,
int denominator)
230 const std::vector<TempoEvent> &get_tempo_events ()
const {
return events_; }
233 const std::vector<TimeSignatureEvent> &get_time_signature_events ()
const
235 return time_sig_events_;
239 void rebuild_cumulative_times ();
242 units::precise_second_t compute_segment_time (
245 units::tick_t segmentTicks)
const;
247 auto get_events_or_default ()
const;
248 auto get_time_signature_events_or_default ()
const;
251 void clear_tempo_events ()
254 cumulative_seconds_.clear ();
258 void clear_time_signature_events () { time_sig_events_.clear (); }
260 static constexpr std::string_view kTempoChangesKey =
"tempoChanges";
261 static constexpr std::string_view kTimeSignaturesKey =
"timeSignatures";
263 friend void from_json (
const nlohmann::json &j,
FixedPpqTempoMap &tempo_map);
266 units::precise_sample_rate_t sample_rate_;
267 static constexpr auto ticks_per_sixteenth_ =
270 static constexpr auto DEFAULT_BPM_EVENT =
TempoEvent{
273 static constexpr auto DEFAULT_TIME_SIG_EVENT =
275 static constexpr auto DEFAULT_CUMULATIVE_SECONDS = units::seconds (0.0);
278 TempoEvent default_tempo_{ DEFAULT_BPM_EVENT };
281 std::vector<TempoEvent> events_;
282 std::vector<TimeSignatureEvent> time_sig_events_;
283 std::vector<units::precise_second_t>
Manages tempo and time signature events for a DAW timeline.
void remove_tempo_event(units::tick_t tick)
Remove a tempo event at the specified tick.
TimeSignatureEvent time_signature_at_tick(units::tick_t tick) const
Get the time signature event active at the given tick.
void add_time_signature_event(units::tick_t tick, int numerator, int denominator)
Add a time signature event.
CurveType
Tempo curve type (constant or linear ramp).
@ Linear
Linear tempo ramp.
@ Constant
Constant tempo.
void add_tempo_event(units::tick_t tick, double bpm, CurveType curve)
Add a tempo event.
FixedPpqTempoMap(units::precise_sample_rate_t sampleRate)
Construct a new FixedPpqTempoMap object.
auto tick_to_seconds(units::precise_tick_t tick) const -> units::precise_second_t
Convert fractional ticks to seconds.
double tempo_at_tick(units::tick_t tick) const
Get the tempo event active at the given tick.
units::precise_tick_t samples_to_tick(units::precise_sample_t samples) const
Convert samples to fractional ticks.
MusicalPosition tick_to_musical_position(units::tick_t tick) const
Convert ticks to musical position (bar:beat:sixteenth:tick).
void remove_time_signature_event(units::tick_t tick)
Remove a time signature event at the specified tick.
units::precise_tick_t seconds_to_tick(units::precise_second_t seconds) const
Convert seconds to fractional ticks.
static consteval int get_ppq()
Get pulses per quarter note.
units::tick_t musical_position_to_tick(const MusicalPosition &pos) const
Convert musical position to ticks.
units::precise_sample_t tick_to_samples(units::precise_tick_t tick) const
Convert fractional ticks to samples.
double get_sample_rate() const
Get current sample rate.
void set_sample_rate(units::precise_sample_rate_t sampleRate)
Set the sample rate.
Musical position representation.
int tick
Ticks in sixteenth (0-indexed).
int bar
Bar number (1-indexed).
int sixteenth
Sixteenth in beat (1-indexed).
int beat
Beat in bar (1-indexed).
CurveType curve
Curve type from this event to the next.
units::tick_t tick
Position in ticks.
Time signature event definition.
units::tick_t tick
Position in ticks.
int numerator
Beats per bar.
int denominator
Beat unit (2,4,8,16).