//============================================================================= // AL // Audio Utility Library // $Id:$ // // Copyright (C) 2002-2006 by Werner Schweer and others // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. //============================================================================= #ifndef __TEMPO_H__ #define __TEMPO_H__ namespace AL { #ifndef MAX_TICK #define MAX_TICK (0x7fffffff/100) #endif class Xml; //--------------------------------------------------------- // Tempo Event //--------------------------------------------------------- struct TEvent { int tempo; unsigned tick; // new tempo at tick unsigned frame; // precomputed time for tick in sec int read(QDomNode); void write(Xml&, int) const; TEvent() { } TEvent(unsigned t, unsigned tk) { tempo = t; tick = tk; frame = 0; } }; //--------------------------------------------------------- // TempoList //--------------------------------------------------------- typedef std::map > TEMPOLIST; typedef TEMPOLIST::iterator iTEvent; typedef TEMPOLIST::const_iterator ciTEvent; typedef TEMPOLIST::reverse_iterator riTEvent; typedef TEMPOLIST::const_reverse_iterator criTEvent; class TempoList : public TEMPOLIST { int _tempoSN; // serial no to track tempo changes bool useList; int _tempo; // tempo if not using tempo list int _globalTempo; // %percent 50-200% void normalize(); void add(unsigned tick, int tempo); void change(unsigned tick, int newTempo); void del(iTEvent); void del(unsigned tick); public: TempoList(); void clear(); void read(QDomNode); void write(Xml&) const; void dump() const; int tempo(unsigned tick) const; unsigned tick2frame(unsigned tick, unsigned frame, int* sn) const; unsigned tick2frame(unsigned tick, int* sn = 0) const; unsigned frame2tick(unsigned frame, int* sn = 0) const; unsigned frame2tick(unsigned frame, unsigned tick, int* sn) const; int tempoSN() const { return _tempoSN; } void setTempo(unsigned tick, int newTempo); void addTempo(unsigned t, int tempo); void delTempo(unsigned tick); void changeTempo(unsigned tick, int newTempo); bool setMasterFlag(unsigned tick, bool val); int globalTempo() const { return _globalTempo; } void setGlobalTempo(int val); }; extern TempoList tempomap; } #endif