Fix time display (#3711)
Make Bar:Beat:Tick / Min:Sec:Msec agree with playhead
This commit is contained in:
committed by
Tres Finocchiaro
parent
c9e5d3aef5
commit
57de274fe8
@@ -104,17 +104,36 @@ public:
|
||||
|
||||
inline int getMilliseconds() const
|
||||
{
|
||||
return m_elapsedMilliSeconds;
|
||||
return m_elapsedMilliSeconds[m_playMode];
|
||||
}
|
||||
|
||||
inline void setToTime( MidiTime const & midiTime )
|
||||
inline int getMilliseconds(PlayModes playMode) const
|
||||
{
|
||||
m_elapsedMilliSeconds = midiTime.getTimeInMilliseconds(getTempo());
|
||||
return m_elapsedMilliSeconds[playMode];
|
||||
}
|
||||
|
||||
inline void setToTime(MidiTime const & midiTime)
|
||||
{
|
||||
m_elapsedMilliSeconds[m_playMode] = midiTime.getTimeInMilliseconds(getTempo());
|
||||
m_playPos[m_playMode].setTicks(midiTime.getTicks());
|
||||
}
|
||||
|
||||
inline void setToTime(MidiTime const & midiTime, PlayModes playMode)
|
||||
{
|
||||
m_elapsedMilliSeconds[playMode] = midiTime.getTimeInMilliseconds(getTempo());
|
||||
m_playPos[playMode].setTicks(midiTime.getTicks());
|
||||
}
|
||||
|
||||
inline void setToTimeByTicks(tick_t ticks)
|
||||
{
|
||||
m_elapsedMilliSeconds = MidiTime::ticksToMilliseconds(ticks, getTempo());
|
||||
m_elapsedMilliSeconds[m_playMode] = MidiTime::ticksToMilliseconds(ticks, getTempo());
|
||||
m_playPos[m_playMode].setTicks(ticks);
|
||||
}
|
||||
|
||||
inline void setToTimeByTicks(tick_t ticks, PlayModes playMode)
|
||||
{
|
||||
m_elapsedMilliSeconds[playMode] = MidiTime::ticksToMilliseconds(ticks, getTempo());
|
||||
m_playPos[playMode].setTicks(ticks);
|
||||
}
|
||||
|
||||
inline int getTacts() const
|
||||
@@ -376,7 +395,7 @@ private:
|
||||
const Pattern* m_patternToPlay;
|
||||
bool m_loopPattern;
|
||||
|
||||
double m_elapsedMilliSeconds;
|
||||
double m_elapsedMilliSeconds[Mode_Count];
|
||||
tick_t m_elapsedTicks;
|
||||
tact_t m_elapsedTacts;
|
||||
|
||||
|
||||
@@ -72,8 +72,8 @@ public:
|
||||
} ;
|
||||
|
||||
|
||||
TimeLineWidget( int xoff, int yoff, float ppt, Song::PlayPos & pos,
|
||||
const MidiTime & begin, QWidget * parent );
|
||||
TimeLineWidget(int xoff, int yoff, float ppt, Song::PlayPos & pos,
|
||||
const MidiTime & begin, Song::PlayModes mode, QWidget * parent);
|
||||
virtual ~TimeLineWidget();
|
||||
|
||||
inline QColor const & getBarLineColor() const { return m_barLineColor; }
|
||||
@@ -217,6 +217,7 @@ private:
|
||||
float m_ppt;
|
||||
Song::PlayPos & m_pos;
|
||||
const MidiTime & m_begin;
|
||||
const Song::PlayModes m_mode;
|
||||
MidiTime m_loopPos[2];
|
||||
|
||||
MidiTime m_savedPos;
|
||||
|
||||
@@ -90,10 +90,10 @@ Song::Song() :
|
||||
m_length( 0 ),
|
||||
m_patternToPlay( NULL ),
|
||||
m_loopPattern( false ),
|
||||
m_elapsedMilliSeconds( 0 ),
|
||||
m_elapsedTicks( 0 ),
|
||||
m_elapsedTacts( 0 )
|
||||
{
|
||||
for(int i = 0; i < Mode_Count; ++i) m_elapsedMilliSeconds[i] = 0;
|
||||
connect( &m_tempoModel, SIGNAL( dataChanged() ),
|
||||
this, SLOT( setTempo() ) );
|
||||
connect( &m_tempoModel, SIGNAL( dataUnchanged() ),
|
||||
@@ -387,7 +387,7 @@ void Song::processNextBuffer()
|
||||
framesPlayed += framesToPlay;
|
||||
m_playPos[m_playMode].setCurrentFrame( framesToPlay +
|
||||
currentFrame );
|
||||
m_elapsedMilliSeconds += MidiTime::ticksToMilliseconds( framesToPlay / framesPerTick, getTempo());
|
||||
m_elapsedMilliSeconds[m_playMode] += MidiTime::ticksToMilliseconds(framesToPlay / framesPerTick, getTempo());
|
||||
m_elapsedTacts = m_playPos[Mode_PlaySong].getTact();
|
||||
m_elapsedTicks = ( m_playPos[Mode_PlaySong].getTicks() % ticksPerTact() ) / 48;
|
||||
}
|
||||
@@ -597,7 +597,7 @@ void Song::setPlayPos( tick_t ticks, PlayModes playMode )
|
||||
{
|
||||
tick_t ticksFromPlayMode = m_playPos[playMode].getTicks();
|
||||
m_elapsedTicks += ticksFromPlayMode - ticks;
|
||||
m_elapsedMilliSeconds += MidiTime::ticksToMilliseconds( ticks - ticksFromPlayMode, getTempo() );
|
||||
m_elapsedMilliSeconds[m_playMode] += MidiTime::ticksToMilliseconds( ticks - ticksFromPlayMode, getTempo() );
|
||||
m_playPos[playMode].setTicks( ticks );
|
||||
m_playPos[playMode].setCurrentFrame( 0.0f );
|
||||
|
||||
@@ -651,8 +651,8 @@ void Song::stop()
|
||||
switch( tl->behaviourAtStop() )
|
||||
{
|
||||
case TimeLineWidget::BackToZero:
|
||||
m_playPos[m_playMode].setTicks( 0 );
|
||||
m_elapsedMilliSeconds = 0;
|
||||
m_playPos[m_playMode].setTicks(0);
|
||||
m_elapsedMilliSeconds[m_playMode] = 0;
|
||||
if( gui && gui->songEditor() &&
|
||||
( tl->autoScroll() == TimeLineWidget::AutoScrollEnabled ) )
|
||||
{
|
||||
@@ -663,7 +663,7 @@ void Song::stop()
|
||||
case TimeLineWidget::BackToStart:
|
||||
if( tl->savedPos() >= 0 )
|
||||
{
|
||||
m_playPos[m_playMode].setTicks( tl->savedPos().getTicks() );
|
||||
m_playPos[m_playMode].setTicks(tl->savedPos().getTicks());
|
||||
setToTime(tl->savedPos());
|
||||
|
||||
if( gui && gui->songEditor() &&
|
||||
@@ -683,10 +683,13 @@ void Song::stop()
|
||||
else
|
||||
{
|
||||
m_playPos[m_playMode].setTicks( 0 );
|
||||
m_elapsedMilliSeconds = 0;
|
||||
m_elapsedMilliSeconds[m_playMode] = 0;
|
||||
}
|
||||
m_playing = false;
|
||||
|
||||
m_elapsedMilliSeconds[Mode_None] = m_elapsedMilliSeconds[m_playMode];
|
||||
m_playPos[Mode_None].setTicks(m_playPos[m_playMode].getTicks());
|
||||
|
||||
m_playPos[m_playMode].setCurrentFrame( 0 );
|
||||
|
||||
m_vstSyncController.setPlaybackState( m_exporting );
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
QPixmap * TimeLineWidget::s_posMarkerPixmap = NULL;
|
||||
|
||||
TimeLineWidget::TimeLineWidget( const int xoff, const int yoff, const float ppt,
|
||||
Song::PlayPos & pos, const MidiTime & begin,
|
||||
Song::PlayPos & pos, const MidiTime & begin, Song::PlayModes mode,
|
||||
QWidget * parent ) :
|
||||
QWidget( parent ),
|
||||
m_inactiveLoopColor( 52, 63, 53, 64 ),
|
||||
@@ -69,6 +69,7 @@ TimeLineWidget::TimeLineWidget( const int xoff, const int yoff, const float ppt,
|
||||
m_ppt( ppt ),
|
||||
m_pos( pos ),
|
||||
m_begin( begin ),
|
||||
m_mode( mode ),
|
||||
m_savedPos( -1 ),
|
||||
m_hint( NULL ),
|
||||
m_action( NoAction ),
|
||||
@@ -370,8 +371,13 @@ void TimeLineWidget::mouseMoveEvent( QMouseEvent* event )
|
||||
switch( m_action )
|
||||
{
|
||||
case MovePositionMarker:
|
||||
m_pos.setTicks( t.getTicks() );
|
||||
Engine::getSong()->setToTime(t);
|
||||
m_pos.setTicks(t.getTicks());
|
||||
Engine::getSong()->setToTime(t, m_mode);
|
||||
if (!( Engine::getSong()->isPlaying()))
|
||||
{
|
||||
//Song::Mode_None is used when nothing is being played.
|
||||
Engine::getSong()->setToTime(t, Song::Mode_None);
|
||||
}
|
||||
m_pos.setCurrentFrame( 0 );
|
||||
updatePosition();
|
||||
positionMarkerMoved();
|
||||
|
||||
@@ -152,7 +152,8 @@ AutomationEditor::AutomationEditor() :
|
||||
m_timeLine = new TimeLineWidget( VALUES_WIDTH, 0, m_ppt,
|
||||
Engine::getSong()->getPlayPos(
|
||||
Song::Mode_PlayAutomationPattern ),
|
||||
m_currentPosition, this );
|
||||
m_currentPosition,
|
||||
Song::Mode_PlayAutomationPattern, this );
|
||||
connect( this, SIGNAL( positionChanged( const MidiTime & ) ),
|
||||
m_timeLine, SLOT( updatePosition( const MidiTime & ) ) );
|
||||
connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ),
|
||||
|
||||
@@ -311,7 +311,8 @@ PianoRoll::PianoRoll() :
|
||||
m_timeLine = new TimeLineWidget( WHITE_KEY_WIDTH, 0, m_ppt,
|
||||
Engine::getSong()->getPlayPos(
|
||||
Song::Mode_PlayPattern ),
|
||||
m_currentPosition, this );
|
||||
m_currentPosition,
|
||||
Song::Mode_PlayPattern, this );
|
||||
connect( this, SIGNAL( positionChanged( const MidiTime & ) ),
|
||||
m_timeLine, SLOT( updatePosition( const MidiTime & ) ) );
|
||||
connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ),
|
||||
|
||||
@@ -89,7 +89,8 @@ SongEditor::SongEditor( Song * song ) :
|
||||
m_timeLine = new TimeLineWidget( widgetTotal, 32,
|
||||
pixelsPerTact(),
|
||||
m_song->m_playPos[Song::Mode_PlaySong],
|
||||
m_currentPosition, this );
|
||||
m_currentPosition,
|
||||
Song::Mode_PlaySong, this );
|
||||
connect( this, SIGNAL( positionChanged( const MidiTime & ) ),
|
||||
m_song->m_playPos[Song::Mode_PlaySong].m_timeLine,
|
||||
SLOT( updatePosition( const MidiTime & ) ) );
|
||||
|
||||
@@ -101,19 +101,21 @@ void TimeDisplayWidget::updateTime()
|
||||
switch( m_displayMode )
|
||||
{
|
||||
case MinutesSeconds:
|
||||
m_majorLCD.setValue( s->getMilliseconds() / 60000 );
|
||||
m_minorLCD.setValue( ( s->getMilliseconds() / 1000 ) % 60 );
|
||||
m_milliSecondsLCD.setValue( s->getMilliseconds() % 1000 );
|
||||
int msec;
|
||||
msec = s->getMilliseconds();
|
||||
m_majorLCD.setValue(msec / 60000);
|
||||
m_minorLCD.setValue((msec / 1000) % 60);
|
||||
m_milliSecondsLCD.setValue(msec % 1000);
|
||||
break;
|
||||
|
||||
case BarsTicks:
|
||||
int tick;
|
||||
tick = ( s->getMilliseconds() * s->getTempo() * (DefaultTicksPerTact / 4 ) ) / 60000 ;
|
||||
m_majorLCD.setValue( (int)(tick / s->ticksPerTact() ) + 1);
|
||||
m_minorLCD.setValue( ( tick % s->ticksPerTact() ) /
|
||||
( s->ticksPerTact() / s->getTimeSigModel().getNumerator() ) +1 );
|
||||
m_milliSecondsLCD.setValue( ( tick % s->ticksPerTact() ) %
|
||||
( s->ticksPerTact() / s->getTimeSigModel().getNumerator() ) );
|
||||
tick = s->getPlayPos().getTicks();
|
||||
m_majorLCD.setValue((int)(tick / s->ticksPerTact()) + 1);
|
||||
m_minorLCD.setValue((tick % s->ticksPerTact()) /
|
||||
(s->ticksPerTact() / s->getTimeSigModel().getNumerator() ) +1);
|
||||
m_milliSecondsLCD.setValue((tick % s->ticksPerTact()) %
|
||||
(s->ticksPerTact() / s->getTimeSigModel().getNumerator()));
|
||||
break;
|
||||
|
||||
default: break;
|
||||
|
||||
Reference in New Issue
Block a user