Fix time display (#3711)

Make Bar:Beat:Tick / Min:Sec:Msec agree with playhead
This commit is contained in:
Hyunjin Song
2017-11-15 13:42:26 +09:00
committed by Tres Finocchiaro
parent c9e5d3aef5
commit 57de274fe8
8 changed files with 63 additions and 29 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 );

View File

@@ -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();

View File

@@ -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 & ) ),

View File

@@ -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 & ) ),

View File

@@ -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 & ) ) );

View File

@@ -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;