31DISABLE_WARNING_DEPRECATED_DECLARATIONS
52class QWrk::QWrkPrivate {
67 m_StopTime(4294967295U),
80 m_PunchEnabled(false),
103 quint32 m_RewindTime;
110 quint8 m_CurTempoOfs;
115 quint32 m_PunchInTime;
116 quint32 m_PunchOutTime;
117 quint32 m_EndAllTime;
121 QDataStream *m_IOStream;
122 QByteArray m_lastChunkData;
123 QList<RecTempo> m_tempos;
125 qint64 m_lastChunkPos;
126 qint64 internalFilePos();
174 return d->m_lastChunkData;
180void QWrk::readRawData(
int size)
183 d->m_lastChunkData = d->m_IOStream->device()->read(size);
185 d->m_lastChunkData.clear();
241 return d->m_AutoSave;
250 return d->m_PlayDelay;
259 return d->m_ZeroCtrls;
277 return d->m_SendCont;
286 return d->m_PatchSearch;
295 return d->m_AutoStop;
304 return d->m_StopTime;
313 return d->m_AutoRewind;
322 return d->m_RewindTime;
331 return d->m_MetroPlay;
340 return d->m_MetroRecord;
349 return d->m_MetroAccent;
376 return d->m_AutoRestart;
385 return d->m_CurTempoOfs;
404 return d->m_TempoOfs1;
423 return d->m_TempoOfs2;
442 return d->m_TempoOfs3;
451 return d->m_PunchEnabled;
460 return d->m_PunchInTime;
469 return d->m_PunchOutTime;
478 return d->m_EndAllTime;
485quint8 QWrk::readByte()
488 if (!d->m_IOStream->atEnd())
499quint16 QWrk::to16bit(quint8 c1, quint8 c2)
501 quint16 value = (c1 << 8);
514quint32 QWrk::to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4)
516 quint32 value = (c1 << 24);
527quint16 QWrk::read16bit()
532 return to16bit(c2, c1);
539quint32 QWrk::read24bit()
545 return to32bit(0, c3, c2, c1);
552quint32 QWrk::read32bit()
554 quint8 c1, c2, c3, c4;
559 return to32bit(c4, c3, c2, c1);
566QString QWrk::readString(
int len)
570 QByteArray data = readByteArray(len);
571 if (d->m_codec ==
nullptr) {
572 s = QString::fromLatin1(data);
574 s = d->m_codec->toUnicode(data);
584QByteArray QWrk::readByteArray(
int len)
589 for (
int i = 0; i < len && c != 0 && !atEnd(); ++i ) {
603QString QWrk::readVarString()
606 QByteArray data = readVarByteArray();
607 if (d->m_codec ==
nullptr) {
608 s = QString::fromLatin1(data);
610 s = d->m_codec->toUnicode(data);
619QByteArray QWrk::readVarByteArray()
627 }
while (b != 0 && !atEnd());
631void QWrk::processMarkers()
633 int num = read32bit();
634 for (
int i = 0; (i < num) && (d->internalFilePos() < d->m_lastChunkPos) && !atEnd(); ++i) {
635 int smpte = readByte();
637 long time = read24bit();
639 int len = readByte();
640 if (d->m_codec ==
nullptr) {
641 QByteArray data = readByteArray(len);
644 QString name = readString(len);
656 return d->internalFilePos();
663void QWrk::seek(qint64 pos)
665 if (!d->m_IOStream->device()->seek(pos)) {
676 return d->m_IOStream->atEnd();
683void QWrk::readGap(
int size)
686 seek( d->internalFilePos() + size );
695 d->m_IOStream = stream;
705 QFile file(fileName);
706 auto ok = file.open(QIODevice::ReadOnly);
708 QDataStream ds(&file);
712 qCritical() <<
"cannot open file" << fileName;
716void QWrk::processTrackChunk()
730 trackno = read16bit();
731 for(
int i=0; i<2; ++i) {
732 namelen = readByte();
733 if (d->m_codec ==
nullptr) {
734 data[i] = readByteArray(namelen);
736 name[i] = readString(namelen);
739 channel = readByte() & 0x0f;
741 velocity = readByte();
743 quint8 flags = readByte();
744 selected = ((flags & 1) != 0);
745 muted = ((flags & 2) != 0);
746 loop = ((flags & 4) != 0);
747 if (d->m_codec ==
nullptr) {
749 trackno, channel, pitch,
750 velocity, port, selected,
754 trackno, channel, pitch,
755 velocity, port, selected,
760void QWrk::processVarsChunk()
762 d->m_Now = read32bit();
763 d->m_From = read32bit();
764 d->m_Thru = read32bit();
765 d->m_KeySig = readByte();
766 d->m_Clock = readByte();
767 d->m_AutoSave = readByte();
768 d->m_PlayDelay = readByte();
770 d->m_ZeroCtrls = (readByte() != 0);
771 d->m_SendSPP = (readByte() != 0);
772 d->m_SendCont = (readByte() != 0);
773 d->m_PatchSearch = (readByte() != 0);
774 d->m_AutoStop = (readByte() != 0);
775 d->m_StopTime = read32bit();
776 d->m_AutoRewind = (readByte() != 0);
777 d->m_RewindTime = read32bit();
778 d->m_MetroPlay = (readByte() != 0);
779 d->m_MetroRecord = (readByte() != 0);
780 d->m_MetroAccent = (readByte() != 0);
781 d->m_CountIn = readByte();
783 d->m_ThruOn = (readByte() != 0);
785 d->m_AutoRestart = (readByte() != 0);
786 d->m_CurTempoOfs = readByte();
787 d->m_TempoOfs1 = readByte();
788 d->m_TempoOfs2 = readByte();
789 d->m_TempoOfs3 = readByte();
791 d->m_PunchEnabled = (readByte() != 0);
792 d->m_PunchInTime = read32bit();
793 d->m_PunchOutTime = read32bit();
794 d->m_EndAllTime = read32bit();
799void QWrk::processTimebaseChunk()
801 quint16 timebase = read16bit();
802 d->m_division = timebase;
806void QWrk::processNoteArray(
int track,
int events)
809 quint8 status = 0, data1 = 0, data2 = 0, i = 0;
811 int value = 0, type = 0, channel = 0, len = 0;
814 for ( i = 0; (i < events) && (d->internalFilePos() < d->m_lastChunkPos) && !atEnd(); ++i ) {
818 if (status >= 0x90) {
819 type = status & 0xf0;
820 channel = status & 0x0f;
822 if (type == 0x90 || type == 0xA0 || type == 0xB0 || type == 0xE0)
828 Q_EMIT
signalWRKNote(track, time, channel, data1, data2, dur);
843 value = (data2 << 7) + data1 - 8192;
850 }
else if (status == 5) {
851 int code = read16bit();
853 if (d->m_codec ==
nullptr) {
854 data = readByteArray(len);
857 text = readString(len);
860 }
else if (status == 6) {
861 int code = read16bit();
865 }
else if (status == 7) {
867 text = readString(len);
869 for(
int j=0; j<13; ++j) {
870 int byte = readByte();
874 }
else if (status == 8) {
877 for(
int j=0; j<len; ++j) {
878 int byte = readByte();
884 if (d->m_codec ==
nullptr) {
885 data = readByteArray(len);
888 text = readString(len);
893 if ((i < events) && atEnd()) {
899void QWrk::processStreamChunk()
902 int dur = 0, value = 0, type = 0, channel = 0, i = 0;
903 quint8 status = 0, data1 = 0, data2 = 0;
904 quint16 track = read16bit();
905 int events = read16bit();
906 for ( i = 0; (i < events) && (d->internalFilePos() < d->m_lastChunkPos) && !atEnd(); ++i ) {
912 type = status & 0xf0;
913 channel = status & 0x0f;
916 Q_EMIT
signalWRKNote(track, time, channel, data1, data2, dur);
931 value = (data2 << 7) + data1 - 8192;
939 if ((i < events) && atEnd()) {
945void QWrk::processMeterChunk()
947 int count = read16bit();
948 for (
int i = 0; i < count; ++i) {
950 int measure = read16bit();
951 int num = readByte();
952 int den = pow(2.0, readByte());
958void QWrk::processMeterKeyChunk()
960 int count = read16bit();
961 for (
int i = 0; i < count; ++i) {
962 int measure = read16bit();
963 int num = readByte();
964 int den = pow(2.0, readByte());
965 qint8 alt = readByte();
971double QWrk::getRealTime(
long ticks)
const
973 double division = 1.0 * d->m_division;
978 if (!d->m_tempos.isEmpty()) {
979 foreach(
const RecTempo& rec, d->m_tempos) {
980 if (rec.time >= ticks)
985 return last.seconds + (((ticks - last.time) / division) * (60.0 / last.tempo));
988void QWrk::processTempoChunk(
int factor)
990 double division = 1.0 * d->m_division;
991 int count = read16bit();
993 for (
int i = 0; i < count; ++i) {
995 long time = read32bit();
997 long tempo = read16bit() * factor;
1001 next.tempo = tempo / 100.0;
1004 last.tempo = next.tempo;
1006 if (! d->m_tempos.isEmpty()) {
1007 foreach(
const RecTempo& rec, d->m_tempos) {
1008 if (rec.time >= time)
1012 next.seconds = last.seconds +
1013 (((time - last.time) / division) * (60.0 / last.tempo));
1015 d->m_tempos.append(next);
1021void QWrk::processSysexChunk()
1026 int bank = readByte();
1027 int length = read16bit();
1028 bool autosend = (readByte() != 0);
1029 int namelen = readByte();
1030 name = readString(namelen);
1031 for(j=0; j<length; ++j) {
1032 int byte = readByte();
1038void QWrk::processSysex2Chunk()
1043 int bank = read16bit();
1044 int length = read32bit();
1045 quint8 b = readByte();
1046 int port = ( b & 0xf0 ) >> 4;
1047 bool autosend = ( (b & 0x0f) != 0);
1048 int namelen = readByte();
1049 name = readString(namelen);
1050 for(j=0; j<length; ++j) {
1051 int byte = readByte();
1057void QWrk::processNewSysexChunk()
1062 int bank = read16bit();
1063 int length = read32bit();
1064 int port = read16bit();
1065 bool autosend = (readByte() != 0);
1066 int namelen = readByte();
1067 name = readString(namelen);
1068 for(j=0; j<length; ++j) {
1069 int byte = readByte();
1075void QWrk::processThruChunk()
1078 qint8 port = readByte();
1079 qint8 channel = readByte();
1080 qint8 keyPlus = readByte();
1081 qint8 velPlus = readByte();
1082 qint8 localPort = readByte();
1083 qint8 mode = readByte();
1084 Q_EMIT
signalWRKThru(mode, port, channel, keyPlus, velPlus, localPort);
1087void QWrk::processTrackOffset()
1089 quint16 track = read16bit();
1090 qint16 offset = read16bit();
1094void QWrk::processTrackReps()
1096 quint16 track = read16bit();
1097 quint16 reps = read16bit();
1101void QWrk::processTrackPatch()
1103 quint16 track = read16bit();
1104 qint8 patch = readByte();
1108void QWrk::processTimeFormat()
1110 quint16 fmt = read16bit();
1111 quint16 ofs = read16bit();
1115void QWrk::processComments()
1117 int len = read16bit();
1118 if (d->m_codec ==
nullptr) {
1119 QByteArray data = readByteArray(len);
1122 QString text = readString(len);
1127void QWrk::processVariableRecord(
int max)
1129 int datalen = max - 32;
1131 QString name = readVarString();
1132 readGap(31 - name.length());
1133 for (
int i = 0; i < datalen; ++i ) {
1136 while (data.endsWith(
'\0')) {
1142void QWrk::processUnknown(
int id)
1147void QWrk::processNewTrack()
1159 bool selected =
false;
1162 quint16 track = read16bit();
1163 quint8 len = readByte();
1164 if (d->m_codec ==
nullptr) {
1165 data = readByteArray(len);
1167 name = readString(len);
1170 patch = read16bit();
1177 channel = readByte();
1178 muted = (readByte() != 0);
1179 if (d->m_codec ==
nullptr) {
1180 Q_EMIT
signalWRKNewTrack2(data, track, channel, key, vel, port, selected, muted, loop);
1182 Q_EMIT
signalWRKNewTrack(name, track, channel, key, vel, port, selected, muted, loop);
1194void QWrk::processSoftVer()
1196 int len = readByte();
1197 QString vers = readString(len);
1201void QWrk::processTrackName()
1203 int track = read16bit();
1204 int len = readByte();
1205 if (d->m_codec ==
nullptr) {
1206 QByteArray data = readByteArray(len);
1209 QString name = readString(len);
1214void QWrk::processStringTable()
1216 if (d->m_codec ==
nullptr) {
1217 QList<QByteArray> table;
1218 int rows = read16bit();
1219 for (
int i = 0; i < rows; ++i) {
1220 int len = readByte();
1221 QByteArray name = readByteArray(len);
1223 table.insert(i, name);
1228 int rows = read16bit();
1229 for (
int i = 0; i < rows; ++i) {
1230 int len = readByte();
1231 QString name = readString(len);
1233 table.insert(i, name);
1239void QWrk::processLyricsStream()
1241 quint16 track = read16bit();
1242 int events = read32bit();
1243 processNoteArray(track, events);
1246void QWrk::processTrackVol()
1248 quint16 track = read16bit();
1249 int vol = read16bit();
1253void QWrk::processNewTrackOffset()
1255 quint16 track = read16bit();
1256 int offset = read32bit();
1260void QWrk::processTrackBank()
1262 quint16 track = read16bit();
1263 int bank = read16bit();
1267void QWrk::processSegmentChunk()
1271 int track = read16bit();
1272 int offset = read32bit();
1274 int len = readByte();
1275 if (d->m_codec ==
nullptr) {
1276 data = readByteArray(len);
1278 name = readString(len);
1281 if (d->m_codec ==
nullptr) {
1286 int events = read32bit();
1287 processNoteArray(track, events);
1290void QWrk::processNewStream()
1294 int track = read16bit();
1295 int len = readByte();
1296 if (d->m_codec ==
nullptr) {
1297 data = readByteArray(len);
1300 name = readString(len);
1303 int events = read32bit();
1304 processNoteArray(track, events);
1307void QWrk::processEndChunk()
1312int QWrk::readChunk()
1314 qint64 start_pos = d->internalFilePos();
1315 int ck = readByte();
1317 quint32 ck_len = read32bit();
1318 if (ck_len > d->m_IOStream->device()->bytesAvailable()) {
1323 start_pos = d->internalFilePos();
1324 d->m_lastChunkPos = start_pos + ck_len;
1325 readRawData(ck_len);
1329 processTrackChunk();
1335 processTimebaseChunk();
1338 processStreamChunk();
1341 processMeterChunk();
1344 processTempoChunk(100);
1347 processTempoChunk();
1350 processSysexChunk();
1356 processTrackOffset();
1362 processTrackPatch();
1365 processTimeFormat();
1371 processVariableRecord(ck_len);
1383 processStringTable();
1386 processLyricsStream();
1392 processNewTrackOffset();
1398 processMeterKeyChunk();
1401 processSysex2Chunk();
1404 processNewSysexChunk();
1407 processSegmentChunk();
1418 if (d->internalFilePos() != d->m_lastChunkPos) {
1420 seek(d->m_lastChunkPos);
1428 QByteArray hdr(
HEADER.length(),
' ');
1429 d->m_tempos.clear();
1430 d->m_IOStream->device()->read(hdr.data(),
HEADER.length());
1439 ck_id = readChunk();
1440 }
while ((ck_id !=
END_CHUNK) && !atEnd());
1443 readRawData(d->m_IOStream->device()->bytesAvailable());
1444 processUnknown(ck_id);
1451qint64 QWrk::QWrkPrivate::internalFilePos()
1453 return m_IOStream->device()->pos();
1456const QByteArray
QWrk::HEADER = QByteArrayLiteral(
"CAKEWALK");
The QObject class is the base class of all Qt objects.
void signalWRKTrackPatch(int track, int patch)
Emitted after reading a track patch chunk.
bool getMetroRecord() const
Metronome on during recording?
bool getPunchEnabled() const
Auto-Punch enabled?
int getRewindTime() const
Auto-rewind time.
bool getZeroCtrls() const
Zero continuous controllers?
QWrk(QObject *parent=nullptr)
Constructor.
Q_DECL_DEPRECATED void signalWRKSegment(int track, long time, const QString &name)
Emitted after reading a segment 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.
Q_DECL_DEPRECATED void setTextCodec(QTextCodec *codec)
Sets the text codec for text meta-events.
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.
int getAutoSave() const
Auto save (0=disabled, 1..256=minutes).
void signalWRKMarker2(long time, int type, const QByteArray &data)
Emitted after reading a text marker This signal is emitted when getTextCodec() is nullptr.
long getFilePos()
Current position in the data stream.
bool getThruOn() const
MIDI Thru enabled?
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.
int getNow() const
Now marker time.
int getPunchOutTime() const
Punch-out time.
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.
bool getAutoStop() const
Auto-stop?
int getEndAllTime() const
Time of latest event (incl.
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.
int getPlayDelay() const
Play Delay.
bool getSendSPP() const
Send Song Position Pointer?
Q_DECL_DEPRECATED 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 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.
virtual ~QWrk()
Destructor.
void signalWRKTempo(long time, int tempo)
Emitted after reading a Tempo Change message.
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.
int getTempoOfs3() const
Fixed-point ratio value of tempo offset 3.
Q_DECL_DEPRECATED void signalWRKTrackName(int track, const QString &name)
Emitted after reading a track name chunk.
int getThru() const
Thru marker time.
bool getSendCont() const
Send MIDI Continue?
int getTempoOfs2() const
Fixed-point ratio value of tempo offset 2.
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.
bool getPatchSearch() const
Patch/controller search-back?
void readFromStream(QDataStream *stream)
Reads a stream.
void signalWRKThru(int mode, int port, int channel, int keyPlus, int velPlus, int localPort)
Emitted after reading an Extended Thru parameters chunk.
int getPunchInTime() const
Punch-in time.
void signalWRKNote(int track, long time, int chan, int pitch, int vol, int dur)
Emitted after reading a Note message.
Q_DECL_DEPRECATED void signalWRKStringTable(const QStringList &strs)
Emitted after reading a string event types chunk.
unsigned int getStopTime() const
Auto-stop time.
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 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.
QByteArray getLastChunkRawData() const
Gets the last chunk raw data (undecoded).
Q_DECL_DEPRECATED void signalWRKExpression(int track, long time, int code, const QString &text)
Emitted after reading an expression indication (notation) chunk.
bool getAutoRewind() const
Auto-rewind?
bool getMetroPlay() const
Metronome on during playback?
Q_DECL_DEPRECATED QTextCodec * getTextCodec()
Gets the text codec used for text meta-events I/O.
int getFrom() const
From marker time.
Q_DECL_DEPRECATED void signalWRKText(int track, long time, int type, const QString &data)
Emitted after reading a text message.
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 readFromFile(const QString &fileName)
Reads a stream from a disk file.
int getCountIn() const
Measures of count-in (0=no count-in).
int getCurTempoOfs() const
Which of the 3 tempo offsets is used: 0..2.
Q_DECL_DEPRECATED void signalWRKComments(const QString &data)
Emitted after reading a comments chunk.
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 signalWRKKeySig(int bar, int alt)
Emitted after reading a WRK Key Signature.
bool getAutoRestart() const
Auto-restart?
Q_DECL_DEPRECATED 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.
int getClock() const
Clock Source (0=Int, 1=MIDI, 2=FSK, 3=SMPTE).
Q_DECL_DEPRECATED void signalWRKMarker(long time, int type, const QString &data)
Emitted after reading a text marker This is deprecated because the class QTextCodec was removed from ...
int getKeySig() const
Key signature (0=C, 1=C#, ... 11=B).
void signalWRKStringTable2(const QList< QByteArray > &strs)
Emitted after reading a string event types chunk.
bool getMetroAccent() const
Metronome accents primary beats?
int getTempoOfs1() const
Fixed-point ratio value of tempo offset 1.
@ NTRKOFS_CHUNK
Track offset.
@ NTRACK_CHUNK
Track prefix.
@ TRKPATCH_CHUNK
Track patch.
@ STRTAB_CHUNK
Table of text event types.
@ NTEMPO_CHUNK
New Tempo map.
@ VARS_CHUNK
Global variables.
@ TRKBANK_CHUNK
Track bank.
@ COMMENTS_CHUNK
Comments.
@ SGMNT_CHUNK
Segment prefix.
@ SOFTVER_CHUNK
Software version which saved the file.
@ TRKNAME_CHUNK
Track name.
@ TIMEFMT_CHUNK
SMPTE time format.
@ END_CHUNK
Last chunk, end of file.
@ STREAM_CHUNK
Events stream.
@ TRACK_CHUNK
Track prefix.
@ TIMEBASE_CHUNK
Timebase. If present is the first chunk in the file.
@ TRKOFFS_CHUNK
Track offset.
@ NSYSEX_CHUNK
System exclusive bank.
@ THRU_CHUNK
Extended thru parameters.
@ SYSEX2_CHUNK
System exclusive bank.
@ NSTREAM_CHUNK
Events stream.
@ VARIABLE_CHUNK
Variable record chunk.
@ METERKEY_CHUNK
Meter/Key map.
@ TRKREPS_CHUNK
Track repetitions.
@ TRKVOL_CHUNK
Track volume.
@ SYSEX_CHUNK
System exclusive bank.
@ LYRICS_CHUNK
Events stream with lyrics.
Cakewalk WRK Files Input.