drumstick  2.2.0
qwrk.h
Go to the documentation of this file.
1 /*
2  WRK File component
3  Copyright (C) 2010-2021, Pedro Lopez-Cabanillas <plcl@users.sf.net>
4 
5  This library is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 3 of the License, or
8  (at your option) any later version.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef DRUMSTICK_QWRK_H
20 #define DRUMSTICK_QWRK_H
21 
22 #include "macros.h"
23 #include <QObject>
24 #include <QScopedPointer>
25 
26 class QDataStream;
27 
33 namespace drumstick { namespace File {
34 
45  VARS_CHUNK = 3,
56  NTEMPO_CHUNK = 15,
57  THRU_CHUNK = 16,
58  LYRICS_CHUNK = 18,
59  TRKVOL_CHUNK = 19,
60  SYSEX2_CHUNK = 20,
61  STRTAB_CHUNK = 22,
67  NTRACK_CHUNK = 36,
68  NSYSEX_CHUNK = 44,
70  SGMNT_CHUNK = 49,
72  END_CHUNK = 255
73 };
74 
81 class DRUMSTICK_EXPORT QWrk : public QObject
82 {
83  Q_OBJECT
84  Q_ENUM(WrkChunkType)
85 public:
86  explicit QWrk(QObject * parent = nullptr);
87  virtual ~QWrk();
88 
89  void readFromStream(QDataStream *stream);
90  void readFromFile(const QString& fileName);
91  QTextCodec* getTextCodec();
92  void setTextCodec(QTextCodec *codec);
93  long getFilePos();
94 
95  int getNow() const;
96  int getFrom() const;
97  int getThru() const;
98  int getKeySig() const;
99  int getClock() const;
100  int getAutoSave() const;
101  int getPlayDelay() const;
102  bool getZeroCtrls() const;
103  bool getSendSPP() const;
104  bool getSendCont() const;
105  bool getPatchSearch() const;
106  bool getAutoStop() const;
107  unsigned int getStopTime() const;
108  bool getAutoRewind() const;
109  int getRewindTime() const;
110  bool getMetroPlay() const;
111  bool getMetroRecord() const;
112  bool getMetroAccent() const;
113  int getCountIn() const;
114  bool getThruOn() const;
115  bool getAutoRestart() const;
116  int getCurTempoOfs() const;
117  int getTempoOfs1() const;
118  int getTempoOfs2() const;
119  int getTempoOfs3() const;
120  bool getPunchEnabled() const;
121  int getPunchInTime() const;
122  int getPunchOutTime() const;
123  int getEndAllTime() const;
124 
125  QByteArray getLastChunkRawData() const;
126  double getRealTime(long ticks) const;
127 
131  static const QByteArray HEADER;
132 
133 Q_SIGNALS:
134 
140  void signalWRKError(const QString& errorStr);
141 
148  void signalWRKUnknownChunk(int type, const QByteArray& data);
149 
156  void signalWRKHeader(int verh, int verl);
157 
161  void signalWRKEnd();
162 
167  void signalWRKStreamEnd(long time);
168 
179  void signalWRKNote(int track, long time, int chan, int pitch, int vol, int dur);
180 
190  void signalWRKKeyPress(int track, long time, int chan, int pitch, int press);
191 
201  void signalWRKCtlChange(int track, long time, int chan, int ctl, int value);
202 
211  void signalWRKPitchBend(int track, long time, int chan, int value);
212 
221  void signalWRKProgram(int track, long time, int chan, int patch);
222 
231  void signalWRKChanPress(int track, long time, int chan, int press);
232 
240  void signalWRKSysexEvent(int track, long time, int bank);
241 
251  void signalWRKSysex(int bank, const QString& name, bool autosend, int port, const QByteArray& data);
252 
261  void signalWRKText(int track, long time, int type, const QString& data);
262 
270  void signalWRKTimeSig(int bar, int num, int den);
271 
278  void signalWRKKeySig(int bar, int alt);
279 
289  void signalWRKTempo(long time, int tempo);
290 
305  void signalWRKTrack(const QString& name1,
306  const QString& name2,
307  int trackno, int channel, int pitch,
308  int velocity, int port,
309  bool selected, bool muted, bool loop );
310 
316  void signalWRKTimeBase(int timebase);
317 
327 
342  void signalWRKThru(int mode, int port, int channel, int keyPlus, int velPlus, int localPort);
343 
350  void signalWRKTrackOffset(int track, int offset);
351 
358  void signalWRKTrackReps(int track, int reps);
359 
366  void signalWRKTrackPatch(int track, int patch);
367 
374  void signalWRKTrackBank(int track, int bank);
375 
382  void signalWRKTimeFormat(int frames, int offset);
383 
389  void signalWRKComments(const QString& data);
390 
398  void signalWRKVariableRecord(const QString& name, const QByteArray& data);
399 
406  void signalWRKTrackVol(int track, int vol);
407 
421  void signalWRKNewTrack( const QString& name,
422  int trackno, int channel, int pitch,
423  int velocity, int port,
424  bool selected, bool muted, bool loop );
425 
431  void signalWRKSoftVer(const QString& version);
432 
439  void signalWRKTrackName(int track, const QString& name);
440 
446  void signalWRKStringTable(const QStringList& strs);
447 
455  void signalWRKSegment(int track, long time, const QString& name);
456 
465  void signalWRKChord(int track, long time, const QString& name, const QByteArray& data);
466 
475  void signalWRKExpression(int track, long time, int code, const QString& text);
476 
485  void signalWRKHairpin(int track, long time, int code, int dur);
486 
496  void signalWRKText2(int track, long time, int type, const QByteArray& data);
497 
513  void signalWRKTrack2(const QByteArray& name1,
514  const QByteArray& name2,
515  int trackno, int channel, int pitch,
516  int velocity, int port,
517  bool selected, bool muted, bool loop );
518 
525  void signalWRKComments2(const QByteArray& data);
526 
541  void signalWRKNewTrack2(const QByteArray& name,
542  int trackno, int channel, int pitch,
543  int velocity, int port,
544  bool selected, bool muted, bool loop );
552  void signalWRKTrackName2(int track, const QByteArray& name);
553 
560  void signalWRKStringTable2(const QList<QByteArray>& strs);
561 
570  void signalWRKSegment2(int track, long time, const QByteArray& name);
571 
581  void signalWRKExpression2(int track, long time, int code, const QByteArray& text);
582 
583 private:
584  quint8 readByte();
585  quint16 to16bit(quint8 c1, quint8 c2);
586  quint32 to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4);
587  quint16 read16bit();
588  quint32 read24bit();
589  quint32 read32bit();
590  QString readString(int len);
591  QString readVarString();
592  void readRawData(int size);
593  void readGap(int size);
594  bool atEnd();
595  void seek(qint64 pos);
596 
597  int readChunk();
598  void processTrackChunk();
599  void processVarsChunk();
600  void processTimebaseChunk();
601  void processNoteArray(int track, int events);
602  void processStreamChunk();
603  void processMeterChunk();
604  void processTempoChunk(int factor = 1);
605  void processSysexChunk();
606  void processSysex2Chunk();
607  void processNewSysexChunk();
608  void processThruChunk();
609  void processTrackOffset();
610  void processTrackReps();
611  void processTrackPatch();
612  void processTrackBank();
613  void processTimeFormat();
614  void processComments();
615  void processVariableRecord(int max);
616  void processNewTrack();
617  void processSoftVer();
618  void processTrackName();
619  void processStringTable();
620  void processLyricsStream();
621  void processTrackVol();
622  void processNewTrackOffset();
623  void processMeterKeyChunk();
624  void processSegmentChunk();
625  void processNewStream();
626  void processUnknown(int id);
627  void processEndChunk();
628  void wrkRead();
629  QByteArray readByteArray(int len);
630  QByteArray readVarByteArray();
631 
632  struct RecTempo {
633  long time;
634  double tempo;
635  double seconds;
636  };
637 
638  class QWrkPrivate;
639  QScopedPointer<QWrkPrivate> d;
640 };
641 
644 }} // namespace drumstick::File
645 
646 #endif // DRUMSTICK_QWRK_H
The QObject class is the base class of all Qt objects.
Cakewalk WRK file format (input only)
Definition: qwrk.h:82
void signalWRKTrackPatch(int track, int patch)
Emitted after reading a track patch chunk.
void signalWRKText(int track, long time, int type, const QString &data)
Emitted after reading a text message.
void signalWRKTrack(const QString &name1, const QString &name2, int trackno, int channel, int pitch, int velocity, int port, bool selected, bool muted, bool loop)
Emitted after reading a track prefix chunk.
void signalWRKProgram(int track, long time, int chan, int patch)
Emitted after reading a Program change message.
void signalWRKChord(int track, long time, const QString &name, const QByteArray &data)
Emitted after reading a chord diagram chunk.
static const QByteArray HEADER
Cakewalk WRK file format header string id.
Definition: qwrk.h:131
void signalWRKHeader(int verh, int verl)
Emitted after reading a WRK header.
void signalWRKSysexEvent(int track, long time, int bank)
Emitted after reading a System Exclusive event.
void signalWRKGlobalVars()
Emitted after reading the global variables chunk.
void signalWRKSoftVer(const QString &version)
Emitted after reading a software version chunk.
void signalWRKSegment2(int track, long time, const QByteArray &name)
Emitted after reading a segment prefix chunk.
void signalWRKComments(const QString &data)
Emitted after reading a comments chunk.
void signalWRKTrackOffset(int track, int offset)
Emitted after reading a track offset chunk.
void signalWRKChanPress(int track, long time, int chan, int press)
Emitted after reading a Channel Aftertouch message.
void signalWRKStreamEnd(long time)
Emitted after reading the last event of a event stream.
void signalWRKText2(int track, long time, int type, const QByteArray &data)
Emitted after reading a text message This signal is emitted when getTextCodec() is nullptr.
void signalWRKKeyPress(int track, long time, int chan, int pitch, int press)
Emitted after reading a Polyphonic Aftertouch message.
void signalWRKVariableRecord(const QString &name, const QByteArray &data)
Emitted after reading a variable chunk.
void signalWRKTrackVol(int track, int vol)
Emitted after reading a track volume chunk.
void signalWRKExpression2(int track, long time, int code, const QByteArray &text)
Emitted after reading an expression indication (notation) chunk.
void signalWRKTrackName2(int track, const QByteArray &name)
Emitted after reading a track name chunk.
void signalWRKStringTable(const QStringList &strs)
Emitted after reading a string event types chunk.
void signalWRKTrack2(const QByteArray &name1, const QByteArray &name2, int trackno, int channel, int pitch, int velocity, int port, bool selected, bool muted, bool loop)
Emitted after reading a track prefix chunk This signal is emitted when getTextCodec() is nullptr.
void signalWRKError(const QString &errorStr)
Emitted for a WRK file read error.
void signalWRKSegment(int track, long time, const QString &name)
Emitted after reading a segment prefix chunk.
void signalWRKTempo(long time, int tempo)
Emitted after reading a Tempo Change message.
void signalWRKExpression(int track, long time, int code, const QString &text)
Emitted after reading an expression indication (notation) chunk.
void signalWRKTimeSig(int bar, int num, int den)
Emitted after reading a WRK Time signature.
void signalWRKHairpin(int track, long time, int code, int dur)
Emitted after reading a hairpin symbol (notation) chunk.
void signalWRKPitchBend(int track, long time, int chan, int value)
Emitted after reading a Bender message.
void signalWRKEnd()
Emitted after reading the last chunk of a WRK file.
void signalWRKNewTrack2(const QByteArray &name, int trackno, int channel, int pitch, int velocity, int port, bool selected, bool muted, bool loop)
Emitted after reading a new track prefix This signal is emitted when getTextCodec() is nullptr.
void signalWRKThru(int mode, int port, int channel, int keyPlus, int velPlus, int localPort)
Emitted after reading an Extended Thru parameters chunk.
void signalWRKNote(int track, long time, int chan, int pitch, int vol, int dur)
Emitted after reading a Note message.
void signalWRKUnknownChunk(int type, const QByteArray &data)
Emitted after reading an unknown chunk.
void signalWRKTrackBank(int track, int bank)
Emitted after reading a track bank chunk.
void signalWRKTrackName(int track, const QString &name)
Emitted after reading a track name chunk.
void signalWRKComments2(const QByteArray &data)
Emitted after reading a comments chunk This signal is emitted when getTextCodec() is nullptr.
void signalWRKTimeBase(int timebase)
Emitted after reading the timebase chunk.
void signalWRKTimeFormat(int frames, int offset)
Emitted after reading a SMPTE time format chunk.
void signalWRKSysex(int bank, const QString &name, bool autosend, int port, const QByteArray &data)
Emitted after reading a System Exclusive Bank.
void signalWRKCtlChange(int track, long time, int chan, int ctl, int value)
Emitted after reading a Control Change message.
void signalWRKTrackReps(int track, int reps)
Emitted after reading a track offset chunk.
void signalWRKNewTrack(const QString &name, int trackno, int channel, int pitch, int velocity, int port, bool selected, bool muted, bool loop)
Emitted after reading a new track prefix.
void signalWRKKeySig(int bar, int alt)
Emitted after reading a WRK Key Signature.
void signalWRKStringTable2(const QList< QByteArray > &strs)
Emitted after reading a string event types chunk.
WrkChunkType
Record types within a WRK file.
Definition: qwrk.h:42
@ NTRKOFS_CHUNK
Track offset.
Definition: qwrk.h:65
@ NTRACK_CHUNK
Track prefix.
Definition: qwrk.h:67
@ TRKPATCH_CHUNK
Track patch.
Definition: qwrk.h:55
@ STRTAB_CHUNK
Table of text event types.
Definition: qwrk.h:61
@ NTEMPO_CHUNK
New Tempo map.
Definition: qwrk.h:56
@ VARS_CHUNK
Global variables.
Definition: qwrk.h:45
@ TRKBANK_CHUNK
Track bank.
Definition: qwrk.h:66
@ COMMENTS_CHUNK
Comments.
Definition: qwrk.h:50
@ SGMNT_CHUNK
Segment prefix.
Definition: qwrk.h:70
@ SOFTVER_CHUNK
Software version which saved the file.
Definition: qwrk.h:71
@ TRKNAME_CHUNK
Track name.
Definition: qwrk.h:63
@ TIMEFMT_CHUNK
SMPTE time format.
Definition: qwrk.h:53
@ END_CHUNK
Last chunk, end of file.
Definition: qwrk.h:72
@ STREAM_CHUNK
Events stream.
Definition: qwrk.h:44
@ TRACK_CHUNK
Track prefix.
Definition: qwrk.h:43
@ TIMEBASE_CHUNK
Timebase. If present is the first chunk in the file.
Definition: qwrk.h:52
@ TRKOFFS_CHUNK
Track offset.
Definition: qwrk.h:51
@ NSYSEX_CHUNK
System exclusive bank.
Definition: qwrk.h:68
@ THRU_CHUNK
Extended thru parameters.
Definition: qwrk.h:57
@ SYSEX2_CHUNK
System exclusive bank.
Definition: qwrk.h:60
@ NSTREAM_CHUNK
Events stream.
Definition: qwrk.h:69
@ TEMPO_CHUNK
Tempo map.
Definition: qwrk.h:46
@ VARIABLE_CHUNK
Variable record chunk.
Definition: qwrk.h:64
@ METER_CHUNK
Meter map.
Definition: qwrk.h:47
@ METERKEY_CHUNK
Meter/Key map.
Definition: qwrk.h:62
@ MEMRGN_CHUNK
Memory region.
Definition: qwrk.h:49
@ TRKREPS_CHUNK
Track repetitions.
Definition: qwrk.h:54
@ TRKVOL_CHUNK
Track volume.
Definition: qwrk.h:59
@ SYSEX_CHUNK
System exclusive bank.
Definition: qwrk.h:48
@ LYRICS_CHUNK
Events stream with lyrics.
Definition: qwrk.h:58
Drumstick visibility macros.
Drumstick common.
Definition: alsaclient.cpp:68