00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef DRUMSTICK_QWRK_H
00021 #define DRUMSTICK_QWRK_H
00022
00023 #include "macros.h"
00024 #include <QObject>
00025
00026 class QDataStream;
00027
00035 namespace drumstick {
00036
00040 enum WrkChunkType {
00041 TRACK_CHUNK = 1,
00042 STREAM_CHUNK = 2,
00043 VARS_CHUNK = 3,
00044 TEMPO_CHUNK = 4,
00045 METER_CHUNK = 5,
00046 SYSEX_CHUNK = 6,
00047 MEMRGN_CHUNK = 7,
00048 COMMENTS_CHUNK = 8,
00049 TRKOFFS_CHUNK = 9,
00050 TIMEBASE_CHUNK = 10,
00051 TIMEFMT_CHUNK = 11,
00052 TRKREPS_CHUNK = 12,
00053 TRKPATCH_CHUNK = 14,
00054 NTEMPO_CHUNK = 15,
00055 THRU_CHUNK = 16,
00056 LYRICS_CHUNK = 18,
00057 TRKVOL_CHUNK = 19,
00058 SYSEX2_CHUNK = 20,
00059 STRTAB_CHUNK = 22,
00060 METERKEY_CHUNK = 23,
00061 TRKNAME_CHUNK = 24,
00062 VARIABLE_CHUNK = 26,
00063 NTRKOFS_CHUNK = 27,
00064 TRKBANK_CHUNK = 30,
00065 NTRACK_CHUNK = 36,
00066 NSYSEX_CHUNK = 44,
00067 NSTREAM_CHUNK = 45,
00068 SGMNT_CHUNK = 49,
00069 SOFTVER_CHUNK = 74,
00070 END_CHUNK = 255
00071 };
00072
00073 const QByteArray HEADER("CAKEWALK");
00074
00080 class DRUMSTICK_EXPORT QWrk : public QObject
00081 {
00082 Q_OBJECT
00083
00084 public:
00085 QWrk(QObject * parent = 0);
00086 virtual ~QWrk();
00087
00088 void readFromStream(QDataStream *stream);
00089 void readFromFile(const QString& fileName);
00090 QTextCodec* getTextCodec();
00091 void setTextCodec(QTextCodec *codec);
00092 long getFilePos();
00093
00094 int getNow() const;
00095 int getFrom() const;
00096 int getThru() const;
00097 int getKeySig() const;
00098 int getClock() const;
00099 int getAutoSave() const;
00100 int getPlayDelay() const;
00101 bool getZeroCtrls() const;
00102 bool getSendSPP() const;
00103 bool getSendCont() const;
00104 bool getPatchSearch() const;
00105 bool getAutoStop() const;
00106 unsigned int getStopTime() const;
00107 bool getAutoRewind() const;
00108 int getRewindTime() const;
00109 bool getMetroPlay() const;
00110 bool getMetroRecord() const;
00111 bool getMetroAccent() const;
00112 int getCountIn() const;
00113 bool getThruOn() const;
00114 bool getAutoRestart() const;
00115 int getCurTempoOfs() const;
00116 int getTempoOfs1() const;
00117 int getTempoOfs2() const;
00118 int getTempoOfs3() const;
00119 bool getPunchEnabled() const;
00120 int getPunchInTime() const;
00121 int getPunchOutTime() const;
00122 int getEndAllTime() const;
00123
00124 QByteArray getLastChunkRawData() const;
00125 double getRealTime(long ticks) const;
00126
00127 Q_SIGNALS:
00128
00134 void signalWRKError(const QString& errorStr);
00135
00142 void signalWRKUnknownChunk(int type, const QByteArray& data);
00143
00150 void signalWRKHeader(int verh, int verl);
00151
00155 void signalWRKEnd();
00156
00160 void signalWRKStreamEnd(long time);
00161
00172 void signalWRKNote(int track, long time, int chan, int pitch, int vol, int dur);
00173
00183 void signalWRKKeyPress(int track, long time, int chan, int pitch, int press);
00184
00194 void signalWRKCtlChange(int track, long time, int chan, int ctl, int value);
00195
00204 void signalWRKPitchBend(int track, long time, int chan, int value);
00205
00214 void signalWRKProgram(int track, long time, int chan, int patch);
00215
00224 void signalWRKChanPress(int track, long time, int chan, int press);
00225
00233 void signalWRKSysexEvent(int track, long time, int bank);
00234
00244 void signalWRKSysex(int bank, const QString& name, bool autosend, int port, const QByteArray& data);
00245
00254 void signalWRKText(int track, long time, int type, const QString& data);
00255
00263 void signalWRKTimeSig(int bar, int num, int den);
00264
00271 void signalWRKKeySig(int bar, int alt);
00272
00282 void signalWRKTempo(long time, int tempo);
00283
00298 void signalWRKTrack(const QString& name1,
00299 const QString& name2,
00300 int trackno, int channel, int pitch,
00301 int velocity, int port,
00302 bool selected, bool muted, bool loop );
00303
00309 void signalWRKTimeBase(int timebase);
00310
00319 void signalWRKGlobalVars();
00320
00335 void signalWRKThru(int mode, int port, int channel, int keyPlus, int velPlus, int localPort);
00336
00343 void signalWRKTrackOffset(int track, int offset);
00344
00351 void signalWRKTrackReps(int track, int reps);
00352
00359 void signalWRKTrackPatch(int track, int patch);
00360
00367 void signalWRKTrackBank(int track, int bank);
00368
00375 void signalWRKTimeFormat(int frames, int offset);
00376
00382 void signalWRKComments(const QString& data);
00383
00391 void signalWRKVariableRecord(const QString& name, const QByteArray& data);
00392
00399 void signalWRKTrackVol(int track, int vol);
00400
00414 void signalWRKNewTrack( const QString& name,
00415 int trackno, int channel, int pitch,
00416 int velocity, int port,
00417 bool selected, bool muted, bool loop );
00418
00424 void signalWRKSoftVer(const QString& version);
00425
00432 void signalWRKTrackName(int track, const QString& name);
00433
00439 void signalWRKStringTable(const QStringList& strs);
00440
00448 void signalWRKSegment(int track, long time, const QString& name);
00449
00458 void signalWRKChord(int track, long time, const QString& name, const QByteArray& data);
00459
00468 void signalWRKExpression(int track, long time, int code, const QString& text);
00469
00478 void signalWRKHairpin(int track, long time, int code, int dur);
00479
00480 private:
00481 quint8 readByte();
00482 quint16 to16bit(quint8 c1, quint8 c2);
00483 quint32 to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4);
00484 quint16 read16bit();
00485 quint32 read24bit();
00486 quint32 read32bit();
00487 QString readString(int len);
00488 QString readVarString();
00489 void readRawData(int size);
00490 void readGap(int size);
00491 bool atEnd();
00492 void seek(qint64 pos);
00493
00494 int readChunk();
00495 void processTrackChunk();
00496 void processVarsChunk();
00497 void processTimebaseChunk();
00498 void processNoteArray(int track, int events);
00499 void processStreamChunk();
00500 void processMeterChunk();
00501 void processTempoChunk(int factor = 1);
00502 void processSysexChunk();
00503 void processSysex2Chunk();
00504 void processNewSysexChunk();
00505 void processThruChunk();
00506 void processTrackOffset();
00507 void processTrackReps();
00508 void processTrackPatch();
00509 void processTrackBank();
00510 void processTimeFormat();
00511 void processComments();
00512 void processVariableRecord(int max);
00513 void processNewTrack();
00514 void processSoftVer();
00515 void processTrackName();
00516 void processStringTable();
00517 void processLyricsStream();
00518 void processTrackVol();
00519 void processNewTrackOffset();
00520 void processMeterKeyChunk();
00521 void processSegmentChunk();
00522 void processNewStream();
00523 void processUnknown(int id);
00524 void processEndChunk();
00525 void wrkRead();
00526
00527 struct RecTempo {
00528 long time;
00529 double tempo;
00530 double seconds;
00531 };
00532
00533 class QWrkPrivate;
00534 QWrkPrivate *d;
00535 };
00536
00537 }
00538
00541 #endif // DRUMSTICK_QWRK_H