29DISABLE_WARNING_DEPRECATED_DECLARATIONS
50class QWrk::QWrkPrivate {
65 m_StopTime(4294967295U),
78 m_PunchEnabled(false),
101 quint32 m_RewindTime;
108 quint8 m_CurTempoOfs;
113 quint32 m_PunchInTime;
114 quint32 m_PunchOutTime;
115 quint32 m_EndAllTime;
119 QDataStream *m_IOStream;
120 QByteArray m_lastChunkData;
121 QList<RecTempo> m_tempos;
123 qint64 m_lastChunkPos;
124 qint64 internalFilePos();
172 return d->m_lastChunkData;
178void QWrk::readRawData(
int size)
181 d->m_lastChunkData = d->m_IOStream->device()->read(size);
183 d->m_lastChunkData.clear();
239 return d->m_AutoSave;
248 return d->m_PlayDelay;
257 return d->m_ZeroCtrls;
275 return d->m_SendCont;
284 return d->m_PatchSearch;
293 return d->m_AutoStop;
302 return d->m_StopTime;
311 return d->m_AutoRewind;
320 return d->m_RewindTime;
329 return d->m_MetroPlay;
338 return d->m_MetroRecord;
347 return d->m_MetroAccent;
374 return d->m_AutoRestart;
383 return d->m_CurTempoOfs;
402 return d->m_TempoOfs1;
421 return d->m_TempoOfs2;
440 return d->m_TempoOfs3;
449 return d->m_PunchEnabled;
458 return d->m_PunchInTime;
467 return d->m_PunchOutTime;
476 return d->m_EndAllTime;
483quint8 QWrk::readByte()
486 if (!d->m_IOStream->atEnd())
497quint16 QWrk::to16bit(quint8 c1, quint8 c2)
499 quint16 value = (c1 << 8);
512quint32 QWrk::to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4)
514 quint32 value = (c1 << 24);
525quint16 QWrk::read16bit()
530 return to16bit(c2, c1);
537quint32 QWrk::read24bit()
543 return to32bit(0, c3, c2, c1);
550quint32 QWrk::read32bit()
552 quint8 c1, c2, c3, c4;
557 return to32bit(c4, c3, c2, c1);
564QString QWrk::readString(
int len)
568 QByteArray data = readByteArray(len);
569 if (d->m_codec ==
nullptr) {
570 s = QString::fromLatin1(data);
572 s = d->m_codec->toUnicode(data);
582QByteArray QWrk::readByteArray(
int len)
587 for (
int i = 0; i < len && c != 0 && !atEnd(); ++i ) {
601QString QWrk::readVarString()
604 QByteArray data = readVarByteArray();
605 if (d->m_codec ==
nullptr) {
606 s = QString::fromLatin1(data);
608 s = d->m_codec->toUnicode(data);
617QByteArray QWrk::readVarByteArray()
625 }
while (b != 0 && !atEnd());
629void QWrk::processMarkers()
631 int num = read32bit();
632 for (
int i = 0; (i < num) && (d->internalFilePos() < d->m_lastChunkPos) && !atEnd(); ++i) {
633 int smpte = readByte();
635 long time = read24bit();
637 int len = readByte();
638 if (d->m_codec ==
nullptr) {
639 QByteArray data = readByteArray(len);
642 QString name = readString(len);
654 return d->internalFilePos();
661void QWrk::seek(qint64 pos)
663 if (!d->m_IOStream->device()->seek(pos)) {
674 return d->m_IOStream->atEnd();
681void QWrk::readGap(
int size)
684 seek( d->internalFilePos() + size );
693 d->m_IOStream = stream;
703 QFile file(fileName);
704 file.open(QIODevice::ReadOnly);
705 QDataStream ds(&file);
710void QWrk::processTrackChunk()
724 trackno = read16bit();
725 for(
int i=0; i<2; ++i) {
726 namelen = readByte();
727 if (d->m_codec ==
nullptr) {
728 data[i] = readByteArray(namelen);
730 name[i] = readString(namelen);
733 channel = readByte() & 0x0f;
735 velocity = readByte();
737 quint8 flags = readByte();
738 selected = ((flags & 1) != 0);
739 muted = ((flags & 2) != 0);
740 loop = ((flags & 4) != 0);
741 if (d->m_codec ==
nullptr) {
743 trackno, channel, pitch,
744 velocity, port, selected,
748 trackno, channel, pitch,
749 velocity, port, selected,
754void QWrk::processVarsChunk()
756 d->m_Now = read32bit();
757 d->m_From = read32bit();
758 d->m_Thru = read32bit();
759 d->m_KeySig = readByte();
760 d->m_Clock = readByte();
761 d->m_AutoSave = readByte();
762 d->m_PlayDelay = readByte();
764 d->m_ZeroCtrls = (readByte() != 0);
765 d->m_SendSPP = (readByte() != 0);
766 d->m_SendCont = (readByte() != 0);
767 d->m_PatchSearch = (readByte() != 0);
768 d->m_AutoStop = (readByte() != 0);
769 d->m_StopTime = read32bit();
770 d->m_AutoRewind = (readByte() != 0);
771 d->m_RewindTime = read32bit();
772 d->m_MetroPlay = (readByte() != 0);
773 d->m_MetroRecord = (readByte() != 0);
774 d->m_MetroAccent = (readByte() != 0);
775 d->m_CountIn = readByte();
777 d->m_ThruOn = (readByte() != 0);
779 d->m_AutoRestart = (readByte() != 0);
780 d->m_CurTempoOfs = readByte();
781 d->m_TempoOfs1 = readByte();
782 d->m_TempoOfs2 = readByte();
783 d->m_TempoOfs3 = readByte();
785 d->m_PunchEnabled = (readByte() != 0);
786 d->m_PunchInTime = read32bit();
787 d->m_PunchOutTime = read32bit();
788 d->m_EndAllTime = read32bit();
793void QWrk::processTimebaseChunk()
795 quint16 timebase = read16bit();
796 d->m_division = timebase;
800void QWrk::processNoteArray(
int track,
int events)
803 quint8 status = 0, data1 = 0, data2 = 0, i = 0;
805 int value = 0, type = 0, channel = 0, len = 0;
808 for ( i = 0; (i < events) && (d->internalFilePos() < d->m_lastChunkPos) && !atEnd(); ++i ) {
812 if (status >= 0x90) {
813 type = status & 0xf0;
814 channel = status & 0x0f;
816 if (type == 0x90 || type == 0xA0 || type == 0xB0 || type == 0xE0)
822 Q_EMIT
signalWRKNote(track, time, channel, data1, data2, dur);
837 value = (data2 << 7) + data1 - 8192;
844 }
else if (status == 5) {
845 int code = read16bit();
847 if (d->m_codec ==
nullptr) {
848 data = readByteArray(len);
851 text = readString(len);
854 }
else if (status == 6) {
855 int code = read16bit();
859 }
else if (status == 7) {
861 text = readString(len);
863 for(
int j=0; j<13; ++j) {
864 int byte = readByte();
868 }
else if (status == 8) {
871 for(
int j=0; j<len; ++j) {
872 int byte = readByte();
878 if (d->m_codec ==
nullptr) {
879 data = readByteArray(len);
882 text = readString(len);
887 if ((i < events) && atEnd()) {
893void QWrk::processStreamChunk()
896 int dur = 0, value = 0, type = 0, channel = 0, i = 0;
897 quint8 status = 0, data1 = 0, data2 = 0;
898 quint16 track = read16bit();
899 int events = read16bit();
900 for ( i = 0; (i < events) && (d->internalFilePos() < d->m_lastChunkPos) && !atEnd(); ++i ) {
906 type = status & 0xf0;
907 channel = status & 0x0f;
910 Q_EMIT
signalWRKNote(track, time, channel, data1, data2, dur);
925 value = (data2 << 7) + data1 - 8192;
933 if ((i < events) && atEnd()) {
939void QWrk::processMeterChunk()
941 int count = read16bit();
942 for (
int i = 0; i < count; ++i) {
944 int measure = read16bit();
945 int num = readByte();
946 int den = pow(2.0, readByte());
952void QWrk::processMeterKeyChunk()
954 int count = read16bit();
955 for (
int i = 0; i < count; ++i) {
956 int measure = read16bit();
957 int num = readByte();
958 int den = pow(2.0, readByte());
959 qint8 alt = readByte();
965double QWrk::getRealTime(
long ticks)
const
967 double division = 1.0 * d->m_division;
972 if (!d->m_tempos.isEmpty()) {
973 foreach(
const RecTempo& rec, d->m_tempos) {
974 if (rec.time >= ticks)
979 return last.seconds + (((ticks - last.time) / division) * (60.0 / last.tempo));
982void QWrk::processTempoChunk(
int factor)
984 double division = 1.0 * d->m_division;
985 int count = read16bit();
987 for (
int i = 0; i < count; ++i) {
989 long time = read32bit();
991 long tempo = read16bit() * factor;
995 next.tempo = tempo / 100.0;
998 last.tempo = next.tempo;
1000 if (! d->m_tempos.isEmpty()) {
1001 foreach(
const RecTempo& rec, d->m_tempos) {
1002 if (rec.time >= time)
1006 next.seconds = last.seconds +
1007 (((time - last.time) / division) * (60.0 / last.tempo));
1009 d->m_tempos.append(next);
1015void QWrk::processSysexChunk()
1020 int bank = readByte();
1021 int length = read16bit();
1022 bool autosend = (readByte() != 0);
1023 int namelen = readByte();
1024 name = readString(namelen);
1025 for(j=0; j<length; ++j) {
1026 int byte = readByte();
1032void QWrk::processSysex2Chunk()
1037 int bank = read16bit();
1038 int length = read32bit();
1039 quint8 b = readByte();
1040 int port = ( b & 0xf0 ) >> 4;
1041 bool autosend = ( (b & 0x0f) != 0);
1042 int namelen = readByte();
1043 name = readString(namelen);
1044 for(j=0; j<length; ++j) {
1045 int byte = readByte();
1051void QWrk::processNewSysexChunk()
1056 int bank = read16bit();
1057 int length = read32bit();
1058 int port = read16bit();
1059 bool autosend = (readByte() != 0);
1060 int namelen = readByte();
1061 name = readString(namelen);
1062 for(j=0; j<length; ++j) {
1063 int byte = readByte();
1069void QWrk::processThruChunk()
1072 qint8 port = readByte();
1073 qint8 channel = readByte();
1074 qint8 keyPlus = readByte();
1075 qint8 velPlus = readByte();
1076 qint8 localPort = readByte();
1077 qint8 mode = readByte();
1078 Q_EMIT
signalWRKThru(mode, port, channel, keyPlus, velPlus, localPort);
1081void QWrk::processTrackOffset()
1083 quint16 track = read16bit();
1084 qint16 offset = read16bit();
1088void QWrk::processTrackReps()
1090 quint16 track = read16bit();
1091 quint16 reps = read16bit();
1095void QWrk::processTrackPatch()
1097 quint16 track = read16bit();
1098 qint8 patch = readByte();
1102void QWrk::processTimeFormat()
1104 quint16 fmt = read16bit();
1105 quint16 ofs = read16bit();
1109void QWrk::processComments()
1111 int len = read16bit();
1112 if (d->m_codec ==
nullptr) {
1113 QByteArray data = readByteArray(len);
1116 QString text = readString(len);
1121void QWrk::processVariableRecord(
int max)
1123 int datalen = max - 32;
1125 QString name = readVarString();
1126 readGap(31 - name.length());
1127 for (
int i = 0; i < datalen; ++i ) {
1130 while (data.endsWith(
'\0')) {
1136void QWrk::processUnknown(
int id)
1141void QWrk::processNewTrack()
1153 bool selected =
false;
1156 quint16 track = read16bit();
1157 quint8 len = readByte();
1158 if (d->m_codec ==
nullptr) {
1159 data = readByteArray(len);
1161 name = readString(len);
1164 patch = read16bit();
1171 channel = readByte();
1172 muted = (readByte() != 0);
1173 if (d->m_codec ==
nullptr) {
1174 Q_EMIT
signalWRKNewTrack2(data, track, channel, key, vel, port, selected, muted, loop);
1176 Q_EMIT
signalWRKNewTrack(name, track, channel, key, vel, port, selected, muted, loop);
1188void QWrk::processSoftVer()
1190 int len = readByte();
1191 QString vers = readString(len);
1195void QWrk::processTrackName()
1197 int track = read16bit();
1198 int len = readByte();
1199 if (d->m_codec ==
nullptr) {
1200 QByteArray data = readByteArray(len);
1203 QString name = readString(len);
1208void QWrk::processStringTable()
1210 if (d->m_codec ==
nullptr) {
1211 QList<QByteArray> table;
1212 int rows = read16bit();
1213 for (
int i = 0; i < rows; ++i) {
1214 int len = readByte();
1215 QByteArray name = readByteArray(len);
1217 table.insert(i, name);
1222 int rows = read16bit();
1223 for (
int i = 0; i < rows; ++i) {
1224 int len = readByte();
1225 QString name = readString(len);
1227 table.insert(i, name);
1233void QWrk::processLyricsStream()
1235 quint16 track = read16bit();
1236 int events = read32bit();
1237 processNoteArray(track, events);
1240void QWrk::processTrackVol()
1242 quint16 track = read16bit();
1243 int vol = read16bit();
1247void QWrk::processNewTrackOffset()
1249 quint16 track = read16bit();
1250 int offset = read32bit();
1254void QWrk::processTrackBank()
1256 quint16 track = read16bit();
1257 int bank = read16bit();
1261void QWrk::processSegmentChunk()
1265 int track = read16bit();
1266 int offset = read32bit();
1268 int len = readByte();
1269 if (d->m_codec ==
nullptr) {
1270 data = readByteArray(len);
1272 name = readString(len);
1275 if (d->m_codec ==
nullptr) {
1280 int events = read32bit();
1281 processNoteArray(track, events);
1284void QWrk::processNewStream()
1288 int track = read16bit();
1289 int len = readByte();
1290 if (d->m_codec ==
nullptr) {
1291 data = readByteArray(len);
1294 name = readString(len);
1297 int events = read32bit();
1298 processNoteArray(track, events);
1301void QWrk::processEndChunk()
1306int QWrk::readChunk()
1308 qint64 start_pos = d->internalFilePos();
1309 int ck = readByte();
1311 quint32 ck_len = read32bit();
1312 if (ck_len > d->m_IOStream->device()->bytesAvailable()) {
1317 start_pos = d->internalFilePos();
1318 d->m_lastChunkPos = start_pos + ck_len;
1319 readRawData(ck_len);
1323 processTrackChunk();
1329 processTimebaseChunk();
1332 processStreamChunk();
1335 processMeterChunk();
1338 processTempoChunk(100);
1341 processTempoChunk();
1344 processSysexChunk();
1350 processTrackOffset();
1356 processTrackPatch();
1359 processTimeFormat();
1365 processVariableRecord(ck_len);
1377 processStringTable();
1380 processLyricsStream();
1386 processNewTrackOffset();
1392 processMeterKeyChunk();
1395 processSysex2Chunk();
1398 processNewSysexChunk();
1401 processSegmentChunk();
1412 if (d->internalFilePos() != d->m_lastChunkPos) {
1414 seek(d->m_lastChunkPos);
1422 QByteArray hdr(
HEADER.length(),
' ');
1423 d->m_tempos.clear();
1424 d->m_IOStream->device()->read(hdr.data(),
HEADER.length());
1433 ck_id = readChunk();
1434 }
while ((ck_id !=
END_CHUNK) && !atEnd());
1437 readRawData(d->m_IOStream->device()->bytesAvailable());
1438 processUnknown(ck_id);
1445qint64 QWrk::QWrkPrivate::internalFilePos()
1447 return m_IOStream->device()->pos();
1450const 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? (only used if no THRU rec)
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.