drumstick  2.3.1
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 #include <QTextCodec>
26 
27 class QDataStream;
28 
34 namespace drumstick { namespace File {
35 
46  VARS_CHUNK = 3,
57  NTEMPO_CHUNK = 15,
58  THRU_CHUNK = 16,
59  LYRICS_CHUNK = 18,
60  TRKVOL_CHUNK = 19,
61  SYSEX2_CHUNK = 20,
62  STRTAB_CHUNK = 22,
68  NTRACK_CHUNK = 36,
69  NSYSEX_CHUNK = 44,
71  SGMNT_CHUNK = 49,
73  END_CHUNK = 255
74 };
75 
82 class DRUMSTICK_EXPORT QWrk : public QObject
83 {
84  Q_OBJECT
85  Q_ENUM(WrkChunkType)
86 public:
87  explicit QWrk(QObject * parent = nullptr);
88  virtual ~QWrk();
89 
90  void readFromStream(QDataStream *stream);
91  void readFromFile(const QString& fileName);
92  QTextCodec* getTextCodec();
93  void setTextCodec(QTextCodec *codec);
94  long getFilePos();
95 
96  int getNow() const;
97  int getFrom() const;
98  int getThru() const;
99  int getKeySig() const;
100  int getClock() const;
101  int getAutoSave() const;
102  int getPlayDelay() const;
103  bool getZeroCtrls() const;
104  bool getSendSPP() const;
105  bool getSendCont() const;
106  bool getPatchSearch() const;
107  bool getAutoStop() const;
108  unsigned int getStopTime() const;
109  bool getAutoRewind() const;
110  int getRewindTime() const;
111  bool getMetroPlay() const;
112  bool getMetroRecord() const;
113  bool getMetroAccent() const;
114  int getCountIn() const;
115  bool getThruOn() const;
116  bool getAutoRestart() const;
117  int getCurTempoOfs() const;
118  int getTempoOfs1() const;
119  int getTempoOfs2() const;
120  int getTempoOfs3() const;
121  bool getPunchEnabled() const;
122  int getPunchInTime() const;
123  int getPunchOutTime() const;
124  int getEndAllTime() const;
125 
126  QByteArray getLastChunkRawData() const;
127  double getRealTime(long ticks) const;
128 
132  static const QByteArray HEADER;
133 
134 Q_SIGNALS:
135 
141  void signalWRKError(const QString& errorStr);
142 
149  void signalWRKUnknownChunk(int type, const QByteArray& data);
150 
157  void signalWRKHeader(int verh, int verl);
158 
162  void signalWRKEnd();
163 
168  void signalWRKStreamEnd(long time);
169 
180  void signalWRKNote(int track, long time, int chan, int pitch, int vol, int dur);
181 
191  void signalWRKKeyPress(int track, long time, int chan, int pitch, int press);
192 
202  void signalWRKCtlChange(int track, long time, int chan, int ctl, int value);
203 
212  void signalWRKPitchBend(int track, long time, int chan, int value);
213 
222  void signalWRKProgram(int track, long time, int chan, int patch);
223 
232  void signalWRKChanPress(int track, long time, int chan, int press);
233 
241  void signalWRKSysexEvent(int track, long time, int bank);
242 
252  void signalWRKSysex(int bank, const QString& name, bool autosend, int port, const QByteArray& data);
253 
262  void signalWRKText(int track, long time, int type, const QString& data);
263 
271  void signalWRKTimeSig(int bar, int num, int den);
272 
279  void signalWRKKeySig(int bar, int alt);
280 
290  void signalWRKTempo(long time, int tempo);
291 
306  void signalWRKTrack(const QString& name1,
307  const QString& name2,
308  int trackno, int channel, int pitch,
309  int velocity, int port,
310  bool selected, bool muted, bool loop );
311 
317  void signalWRKTimeBase(int timebase);
318 
328 
343  void signalWRKThru(int mode, int port, int channel, int keyPlus, int velPlus, int localPort);
344 
351  void signalWRKTrackOffset(int track, int offset);
352 
359  void signalWRKTrackReps(int track, int reps);
360 
367  void signalWRKTrackPatch(int track, int patch);
368 
375  void signalWRKTrackBank(int track, int bank);
376 
383  void signalWRKTimeFormat(int frames, int offset);
384 
390  void signalWRKComments(const QString& data);
391 
399  void signalWRKVariableRecord(const QString& name, const QByteArray& data);
400 
407  void signalWRKTrackVol(int track, int vol);
408 
422  void signalWRKNewTrack( const QString& name,
423  int trackno, int channel, int pitch,
424  int velocity, int port,
425  bool selected, bool muted, bool loop );
426 
432  void signalWRKSoftVer(const QString& version);
433 
440  void signalWRKTrackName(int track, const QString& name);
441 
447  void signalWRKStringTable(const QStringList& strs);
448 
456  void signalWRKSegment(int track, long time, const QString& name);
457 
466  void signalWRKChord(int track, long time, const QString& name, const QByteArray& data);
467 
476  void signalWRKExpression(int track, long time, int code, const QString& text);
477 
486  void signalWRKHairpin(int track, long time, int code, int dur);
487 
497  void signalWRKText2(int track, long time, int type, const QByteArray& data);
498 
514  void signalWRKTrack2(const QByteArray& name1,
515  const QByteArray& name2,
516  int trackno, int channel, int pitch,
517  int velocity, int port,
518  bool selected, bool muted, bool loop );
519 
526  void signalWRKComments2(const QByteArray& data);
527 
542  void signalWRKNewTrack2(const QByteArray& name,
543  int trackno, int channel, int pitch,
544  int velocity, int port,
545  bool selected, bool muted, bool loop );
553  void signalWRKTrackName2(int track, const QByteArray& name);
554 
561  void signalWRKStringTable2(const QList<QByteArray>& strs);
562 
571  void signalWRKSegment2(int track, long time, const QByteArray& name);
572 
582  void signalWRKExpression2(int track, long time, int code, const QByteArray& text);
583 
584 private:
585  quint8 readByte();
586  quint16 to16bit(quint8 c1, quint8 c2);
587  quint32 to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4);
588  quint16 read16bit();
589  quint32 read24bit();
590  quint32 read32bit();
591  QString readString(int len);
592  QString readVarString();
593  void readRawData(int size);
594  void readGap(int size);
595  bool atEnd();
596  void seek(qint64 pos);
597 
598  int readChunk();
599  void processTrackChunk();
600  void processVarsChunk();
601  void processTimebaseChunk();
602  void processNoteArray(int track, int events);
603  void processStreamChunk();
604  void processMeterChunk();
605  void processTempoChunk(int factor = 1);
606  void processSysexChunk();
607  void processSysex2Chunk();
608  void processNewSysexChunk();
609  void processThruChunk();
610  void processTrackOffset();
611  void processTrackReps();
612  void processTrackPatch();
613  void processTrackBank();
614  void processTimeFormat();
615  void processComments();
616  void processVariableRecord(int max);
617  void processNewTrack();
618  void processSoftVer();
619  void processTrackName();
620  void processStringTable();
621  void processLyricsStream();
622  void processTrackVol();
623  void processNewTrackOffset();
624  void processMeterKeyChunk();
625  void processSegmentChunk();
626  void processNewStream();
627  void processUnknown(int id);
628  void processEndChunk();
629  void wrkRead();
630  QByteArray readByteArray(int len);
631  QByteArray readVarByteArray();
632 
633  struct RecTempo {
634  long time;
635  double tempo;
636  double seconds;
637  };
638 
639  class QWrkPrivate;
640  QScopedPointer<QWrkPrivate> d;
641 };
642 
645 }} // namespace drumstick::File
646 
647 #endif // DRUMSTICK_QWRK_H
The QObject class is the base class of all Qt objects.
Cakewalk WRK file format (input only)
Definition: qwrk.h:83
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:132
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:43
@ NTRKOFS_CHUNK
Track offset.
Definition: qwrk.h:66
@ NTRACK_CHUNK
Track prefix.
Definition: qwrk.h:68
@ TRKPATCH_CHUNK
Track patch.
Definition: qwrk.h:56
@ STRTAB_CHUNK
Table of text event types.
Definition: qwrk.h:62
@ NTEMPO_CHUNK
New Tempo map.
Definition: qwrk.h:57
@ VARS_CHUNK
Global variables.
Definition: qwrk.h:46
@ TRKBANK_CHUNK
Track bank.
Definition: qwrk.h:67
@ COMMENTS_CHUNK
Comments.
Definition: qwrk.h:51
@ SGMNT_CHUNK
Segment prefix.
Definition: qwrk.h:71
@ SOFTVER_CHUNK
Software version which saved the file.
Definition: qwrk.h:72
@ TRKNAME_CHUNK
Track name.
Definition: qwrk.h:64
@ TIMEFMT_CHUNK
SMPTE time format.
Definition: qwrk.h:54
@ END_CHUNK
Last chunk, end of file.
Definition: qwrk.h:73
@ STREAM_CHUNK
Events stream.
Definition: qwrk.h:45
@ TRACK_CHUNK
Track prefix.
Definition: qwrk.h:44
@ TIMEBASE_CHUNK
Timebase. If present is the first chunk in the file.
Definition: qwrk.h:53
@ TRKOFFS_CHUNK
Track offset.
Definition: qwrk.h:52
@ NSYSEX_CHUNK
System exclusive bank.
Definition: qwrk.h:69
@ THRU_CHUNK
Extended thru parameters.
Definition: qwrk.h:58
@ SYSEX2_CHUNK
System exclusive bank.
Definition: qwrk.h:61
@ NSTREAM_CHUNK
Events stream.
Definition: qwrk.h:70
@ TEMPO_CHUNK
Tempo map.
Definition: qwrk.h:47
@ VARIABLE_CHUNK
Variable record chunk.
Definition: qwrk.h:65
@ METER_CHUNK
Meter map.
Definition: qwrk.h:48
@ METERKEY_CHUNK
Meter/Key map.
Definition: qwrk.h:63
@ MEMRGN_CHUNK
Memory region.
Definition: qwrk.h:50
@ TRKREPS_CHUNK
Track repetitions.
Definition: qwrk.h:55
@ TRKVOL_CHUNK
Track volume.
Definition: qwrk.h:60
@ SYSEX_CHUNK
System exclusive bank.
Definition: qwrk.h:49
@ LYRICS_CHUNK
Events stream with lyrics.
Definition: qwrk.h:59
Drumstick visibility macros.
Drumstick common.
Definition: alsaclient.cpp:68