MIDITIME.HPP
上传用户:sun1865
上传日期:2008-12-23
资源大小:59k
文件大小:3k
源码类别:

midi

开发平台:

Visual C++

  1. #ifndef __MIDITIMETAB__
  2. #define __MIDITIMETAB__
  3. #include "midiio.hpp"
  4. class MidiTempoChange
  5. {
  6. public:
  7.   MidiTempoChange();
  8.   unsigned long unit;
  9.   unsigned long tempo; // microseconds/beat
  10. };
  11. class MidiTactChange
  12. {
  13. public:
  14.   MidiTactChange();
  15.   unsigned long unit;
  16.   int tactnom, tactdenom;
  17. };
  18. class MidiTimeTable : public MidiRead
  19. {
  20. public:
  21.     MidiTimeTable(const char* filename, FILE* midif = 0);
  22.     virtual ~MidiTimeTable();
  23. // calculations after successful calling run() !!
  24.     unsigned long timeAt(unsigned long unit);   // milliseconds
  25.     unsigned long unitAt(unsigned long millisec);
  26.     unsigned long tempoAt(long unit);  // microseconds/beat
  27.     int tactnomAt(long unit);
  28.     int tactdenomAt(long unit);
  29.     void tactAt(unsigned long unit, int& tactnom, int& tactdenom);
  30.     unsigned int tactLength(int nom, int denom);
  31.     unsigned long totalunits();
  32.     unsigned long totaltime();  // milliseconds
  33. // virtual members (if deriving them then call base member!!)
  34.     virtual void track(int trackno, long length, int channel);
  35.     virtual void endtrack(int trackno); // closing track
  36.     virtual void tempo(unsigned long microsecperbeat);
  37.     virtual void tact(int nom, int denom, int, int);
  38. // options
  39.     int calctempotable_;
  40. // should load tempo table for time calculations  (is default)
  41.     int calctacttable_;
  42.      // should load tact table for tact calculations (is default)
  43.     int calctotaltime_; // requires reading of whole file!
  44.      // read all tracks and calculate total time and total length of midi file
  45.      // (not default because whole file must be read)
  46.     const MidiTempoChange* tempoChange(int changeidx) const;
  47.     const MidiTactChange* tactChange(int changeidx) const;
  48.     unsigned long MeasureInfo(unsigned long unit, int& measurenr, int& tactnom, int& tactdenom);
  49.              // searches measure, its tact and returns measure start unit
  50.     void measureAt(unsigned long unit, int& measureidx, int& nomidx, int& tick);
  51.     int MeasureIndex(unsigned long unit);
  52.     unsigned long MeasureAt(int measureidx);
  53.     unsigned int MeasureLength(int measureidx);
  54.     unsigned long nextMeasure(unsigned long unit);
  55.     virtual void printTempoChanges(FILE* f = 0);
  56.     virtual void printTactChanges(FILE* f = 0);
  57.     virtual void printMeasures(FILE* f = 0);
  58. protected:
  59.     int tempochanges_;
  60.     MidiTempoChange **tempochange_;
  61.     unsigned long totalunits_;
  62.     unsigned long totaltime_;
  63.     void addtempochange(unsigned long unit, unsigned long tempo);
  64.     void resettempochange();
  65. protected:
  66.     int tactchanges_;
  67.     MidiTactChange** tactchange_;
  68.     void addtactchange(unsigned long unit, int tactnom, int tactdenom);
  69.     void resettactchange();
  70. };
  71. #endif