Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions include/Song.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,17 +104,36 @@ class EXPORT Song : public TrackContainer

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
Expand Down Expand Up @@ -376,7 +395,7 @@ private slots:
const Pattern* m_patternToPlay;
bool m_loopPattern;

double m_elapsedMilliSeconds;
double m_elapsedMilliSeconds[Mode_Count];
tick_t m_elapsedTicks;
tact_t m_elapsedTacts;

Expand Down
5 changes: 3 additions & 2 deletions include/TimeLineWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ class TimeLineWidget : public QWidget, public JournallingObject
} ;


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; }
Expand Down Expand Up @@ -217,6 +217,7 @@ public slots:
float m_ppt;
Song::PlayPos & m_pos;
const MidiTime & m_begin;
const Song::PlayModes m_mode;
MidiTime m_loopPos[2];

MidiTime m_savedPos;
Expand Down
17 changes: 10 additions & 7 deletions src/core/Song.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() ),
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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 );

Expand Down Expand Up @@ -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 ) )
{
Expand All @@ -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() &&
Expand All @@ -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 );
Expand Down
12 changes: 9 additions & 3 deletions src/gui/TimeLineWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ),
Expand All @@ -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 ),
Expand Down Expand Up @@ -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();
Expand Down
3 changes: 2 additions & 1 deletion src/gui/editors/AutomationEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 & ) ),
Expand Down
3 changes: 2 additions & 1 deletion src/gui/editors/PianoRoll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 & ) ),
Expand Down
3 changes: 2 additions & 1 deletion src/gui/editors/SongEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 & ) ) );
Expand Down
20 changes: 11 additions & 9 deletions src/gui/widgets/TimeDisplayWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down