bool AutomationTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num ) { if( isMuted() ) { return false; } tcoVector tcos; if( _tco_num >= 0 ) { TrackContentObject * tco = getTCO( _tco_num ); tcos.push_back( tco ); } else { getTCOsInRange( tcos, _start, _start + static_cast<int>( _frames / Engine::framesPerTick()) ); } for( tcoVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { AutomationPattern * p = dynamic_cast<AutomationPattern *>( *it ); if( p == NULL || ( *it )->isMuted() ) { continue; } MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); } p->processMidiTime( cur_start ); } return false; }