diff --git a/include/MidiTime.h b/include/MidiTime.h index 0204075ee..ce5ead739 100644 --- a/include/MidiTime.h +++ b/include/MidiTime.h @@ -60,135 +60,43 @@ private: class EXPORT MidiTime { public: - MidiTime( const tact_t tact, const tick_t ticks ) : - m_ticks( tact * s_ticksPerTact + ticks ) - { - } + MidiTime( const tact_t tact, const tick_t ticks ); + MidiTime( const tick_t ticks = 0 ); + MidiTime( const MidiTime& time ); - MidiTime( const tick_t ticks = 0 ) : - m_ticks( ticks ) - { - } + MidiTime toNearestTact() const; + MidiTime toAbsoluteTact() const; - MidiTime( const MidiTime& time ) : - m_ticks( time.m_ticks ) - { - } - - MidiTime toNearestTact() const - { - if( m_ticks % s_ticksPerTact >= s_ticksPerTact/2 ) - { - return ( getTact() + 1 ) * s_ticksPerTact; - } - return getTact() * s_ticksPerTact; - } - - MidiTime toAbsoluteTact() const - { - return getTact() * s_ticksPerTact; - } - - MidiTime& operator=( const MidiTime& time ) - { - m_ticks = time.m_ticks; - return *this; - } - - MidiTime& operator+=( const MidiTime& time ) - { - m_ticks += time.m_ticks; - return *this; - } - - MidiTime& operator-=( const MidiTime& time ) - { - m_ticks -= time.m_ticks; - return *this; - } + MidiTime& operator=( const MidiTime& time ); + MidiTime& operator+=( const MidiTime& time ); + MidiTime& operator-=( const MidiTime& time ); // return the tact, rounded down and 0-based - tact_t getTact() const - { - return m_ticks / s_ticksPerTact; - } + tact_t getTact() const; + // return the tact, rounded up and 0-based + tact_t nextFullTact() const; - tact_t nextFullTact() const - { - return (m_ticks + (s_ticksPerTact-1)) / s_ticksPerTact; - } + void setTicks( tick_t ticks ); + tick_t getTicks() const; - void setTicks( tick_t ticks ) - { - m_ticks = ticks; - } + operator int() const; - tick_t getTicks() const - { - return m_ticks; - } - - operator int() const - { - return m_ticks; - } - - tick_t ticksPerBeat( const TimeSig &sig ) const - { - return ticksPerTact(sig) / sig.numerator(); - } + tick_t ticksPerBeat( const TimeSig &sig ) const; // Remainder ticks after bar is removed - tick_t getTickWithinBar( const TimeSig &sig ) const - { - return m_ticks % ticksPerTact(sig); - } + tick_t getTickWithinBar( const TimeSig &sig ) const; // Returns the beat position inside the bar, 0-based - tick_t getBeatWithinBar( const TimeSig &sig ) const - { - return getTickWithinBar(sig) / ticksPerBeat(sig); - } + tick_t getBeatWithinBar( const TimeSig &sig ) const; // Remainder ticks after bar and beat are removed - tick_t getTickWithinBeat( const TimeSig &sig ) const - { - return getTickWithinBar(sig) % ticksPerBeat(sig); - } + tick_t getTickWithinBeat( const TimeSig &sig ) const; // calculate number of frame that are needed this time - f_cnt_t frames( const float framesPerTick ) const - { - if( m_ticks >= 0 ) - { - return static_cast( m_ticks * framesPerTick ); - } - return 0; - } - - static MidiTime fromFrames( const f_cnt_t frames, const float framesPerTick ) - { - return MidiTime( static_cast( frames / framesPerTick ) ); - } - - - static tick_t ticksPerTact() - { - return s_ticksPerTact; - } - static tick_t ticksPerTact( const TimeSig &sig ) const - { - return DefaultTicksPerTact * sig.numerator() / sig.denominator(); - } - - static int stepsPerTact() - { - int steps = ticksPerTact() / DefaultBeatsPerTact; - return qMax( 1, steps ); - } - - static void setTicksPerTact( tick_t _tpt ) - { - s_ticksPerTact = _tpt; - } + f_cnt_t frames( const float framesPerTick ) const; + static MidiTime fromFrames( const f_cnt_t frames, const float framesPerTick ); + static tick_t ticksPerTact(); + static tick_t ticksPerTact( const TimeSig &sig ); + static int stepsPerTact(); + static void setTicksPerTact( tick_t tpt ); private: tick_t m_ticks; diff --git a/src/core/midi/MidiTime.cpp b/src/core/midi/MidiTime.cpp index f93136144..b80c31b85 100644 --- a/src/core/midi/MidiTime.cpp +++ b/src/core/midi/MidiTime.cpp @@ -39,11 +39,162 @@ TimeSig::TimeSig( const MeterModel &model ) : { } + int TimeSig::numerator() const { return m_num; } + int TimeSig::denominator() const { return m_denom; } + + + + +MidiTime::MidiTime( const tact_t tact, const tick_t ticks ) : + m_ticks( tact * s_ticksPerTact + ticks ) +{ +} + +MidiTime::MidiTime( const tick_t ticks ) : + m_ticks( ticks ) +{ +} + +MidiTime::MidiTime( const MidiTime& time ) : + m_ticks( time.m_ticks ) +{ +} + + +MidiTime MidiTime::toNearestTact() const +{ + if( m_ticks % s_ticksPerTact >= s_ticksPerTact/2 ) + { + return ( getTact() + 1 ) * s_ticksPerTact; + } + return getTact() * s_ticksPerTact; +} + + +MidiTime MidiTime::toAbsoluteTact() const +{ + return getTact() * s_ticksPerTact; +} + + +MidiTime& MidiTime::operator=( const MidiTime& time ) +{ + m_ticks = time.m_ticks; + return *this; +} + + +MidiTime& MidiTime::operator+=( const MidiTime& time ) +{ + m_ticks += time.m_ticks; + return *this; +} + + +MidiTime& MidiTime::operator-=( const MidiTime& time ) +{ + m_ticks -= time.m_ticks; + return *this; +} + + +tact_t MidiTime::getTact() const +{ + return m_ticks / s_ticksPerTact; +} + + +tact_t MidiTime::nextFullTact() const +{ + return (m_ticks + (s_ticksPerTact-1)) / s_ticksPerTact; +} + + +void MidiTime::setTicks( tick_t ticks ) +{ + m_ticks = ticks; +} + + +tick_t MidiTime::getTicks() const +{ + return m_ticks; +} + + +MidiTime::operator int() const +{ + return m_ticks; +} + + +tick_t MidiTime::ticksPerBeat( const TimeSig &sig ) const +{ + // (number of ticks per bar) divided by (number of beats per bar) + return ticksPerTact(sig) / sig.numerator(); +} + + +tick_t MidiTime::getTickWithinBar( const TimeSig &sig ) const +{ + return m_ticks % ticksPerTact(sig); +} + +tick_t MidiTime::getBeatWithinBar( const TimeSig &sig ) const +{ + return getTickWithinBar(sig) / ticksPerBeat(sig); +} + +tick_t MidiTime::getTickWithinBeat( const TimeSig &sig ) const +{ + return getTickWithinBar(sig) % ticksPerBeat(sig); +} + + +f_cnt_t MidiTime::frames( const float framesPerTick ) const +{ + if( m_ticks >= 0 ) + { + return static_cast( m_ticks * framesPerTick ); + } + return 0; +} + + +MidiTime MidiTime::fromFrames( const f_cnt_t frames, const float framesPerTick ) +{ + return MidiTime( static_cast( frames / framesPerTick ) ); +} + + +tick_t MidiTime::ticksPerTact() +{ + return s_ticksPerTact; +} + + +tick_t MidiTime::ticksPerTact( const TimeSig &sig ) +{ + return DefaultTicksPerTact * sig.numerator() / sig.denominator(); +} + + +int MidiTime::stepsPerTact() +{ + int steps = ticksPerTact() / DefaultBeatsPerTact; + return qMax( 1, steps ); +} + + +void MidiTime::setTicksPerTact( tick_t tpt ) +{ + s_ticksPerTact = tpt; +}