48class QWrk::QWrkPrivate {
63 m_StopTime(4294967295U),
76 m_PunchEnabled(false),
106 quint8 m_CurTempoOfs;
111 quint32 m_PunchInTime;
112 quint32 m_PunchOutTime;
113 quint32 m_EndAllTime;
117 QDataStream *m_IOStream;
118 QByteArray m_lastChunkData;
119 QList<RecTempo> m_tempos;
165 return d->m_lastChunkData;
171void QWrk::readRawData(
int size)
173 d->m_lastChunkData = d->m_IOStream->device()->read(size);
227 return d->m_AutoSave;
236 return d->m_PlayDelay;
245 return d->m_ZeroCtrls;
263 return d->m_SendCont;
272 return d->m_PatchSearch;
281 return d->m_AutoStop;
290 return d->m_StopTime;
299 return d->m_AutoRewind;
308 return d->m_RewindTime;
317 return d->m_MetroPlay;
326 return d->m_MetroRecord;
335 return d->m_MetroAccent;
362 return d->m_AutoRestart;
371 return d->m_CurTempoOfs;
390 return d->m_TempoOfs1;
409 return d->m_TempoOfs2;
428 return d->m_TempoOfs3;
437 return d->m_PunchEnabled;
446 return d->m_PunchInTime;
455 return d->m_PunchOutTime;
464 return d->m_EndAllTime;
471quint8 QWrk::readByte()
474 if (!d->m_IOStream->atEnd())
485quint16 QWrk::to16bit(quint8 c1, quint8 c2)
487 quint16 value = (c1 << 8);
500quint32 QWrk::to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4)
502 quint32 value = (c1 << 24);
513quint16 QWrk::read16bit()
518 return to16bit(c2, c1);
525quint32 QWrk::read24bit()
531 return to32bit(0, c3, c2, c1);
538quint32 QWrk::read32bit()
540 quint8 c1, c2, c3, c4;
545 return to32bit(c4, c3, c2, c1);
552QString QWrk::readString(
int len)
558 for (
int i = 0; i < len && c != 0; ++i ) {
563 if (d->m_codec == NULL)
566 s = d->m_codec->toUnicode(data);
575QString QWrk::readVarString()
585 if (d->m_codec == NULL)
588 s = d->m_codec->toUnicode(data);
598 return d->m_IOStream->device()->pos();
605void QWrk::seek(qint64 pos)
607 d->m_IOStream->device()->seek(pos);
616 return d->m_IOStream->atEnd();
623void QWrk::readGap(
int size)
635 d->m_IOStream = stream;
645 QFile file(fileName);
646 file.open(QIODevice::ReadOnly);
647 QDataStream ds(&file);
652void QWrk::processTrackChunk()
665 trackno = read16bit();
666 for(
int i=0; i<2; ++i) {
667 namelen = readByte();
668 name[i] = readString(namelen);
670 channel = (qint8) readByte();
672 velocity = readByte();
674 quint8 flags = readByte();
675 selected = ((flags & 1) != 0);
676 muted = ((flags & 2) != 0);
677 loop = ((flags & 4) != 0);
679 trackno, channel, pitch,
680 velocity, port, selected,
684void QWrk::processVarsChunk()
686 d->m_Now = read32bit();
687 d->m_From = read32bit();
688 d->m_Thru = read32bit();
689 d->m_KeySig = readByte();
690 d->m_Clock = readByte();
691 d->m_AutoSave = readByte();
692 d->m_PlayDelay = readByte();
694 d->m_ZeroCtrls = (readByte() != 0);
695 d->m_SendSPP = (readByte() != 0);
696 d->m_SendCont = (readByte() != 0);
697 d->m_PatchSearch = (readByte() != 0);
698 d->m_AutoStop = (readByte() != 0);
699 d->m_StopTime = read32bit();
700 d->m_AutoRewind = (readByte() != 0);
701 d->m_RewindTime = read32bit();
702 d->m_MetroPlay = (readByte() != 0);
703 d->m_MetroRecord = (readByte() != 0);
704 d->m_MetroAccent = (readByte() != 0);
705 d->m_CountIn = readByte();
707 d->m_ThruOn = (readByte() != 0);
709 d->m_AutoRestart = (readByte() != 0);
710 d->m_CurTempoOfs = readByte();
711 d->m_TempoOfs1 = readByte();
712 d->m_TempoOfs2 = readByte();
713 d->m_TempoOfs3 = readByte();
715 d->m_PunchEnabled = (readByte() != 0);
716 d->m_PunchInTime = read32bit();
717 d->m_PunchOutTime = read32bit();
718 d->m_EndAllTime = read32bit();
723void QWrk::processTimebaseChunk()
725 quint16 timebase = read16bit();
726 d->m_division = timebase;
730void QWrk::processNoteArray(
int track,
int events)
733 quint8 status = 0, data1 = 0, data2 = 0;
735 int value = 0, type = 0, channel = 0, len = 0;
738 for (
int i = 0; i < events; ++i ) {
742 if (status >= 0x90) {
743 type = status & 0xf0;
744 channel = status & 0x0f;
746 if (type == 0x90 || type == 0xA0 || type == 0xB0 || type == 0xE0)
752 Q_EMIT
signalWRKNote(track, time, channel, data1, data2, dur);
767 value = (data2 << 7) + data1 - 8192;
774 }
else if (status == 5) {
775 int code = read16bit();
777 text = readString(len);
779 }
else if (status == 6) {
780 int code = read16bit();
784 }
else if (status == 7) {
786 text = readString(len);
788 for(
int j=0; j<13; ++j) {
789 int byte = readByte();
793 }
else if (status == 8) {
796 for(
int j=0; j<len; ++j) {
797 int byte = readByte();
803 text = readString(len);
810void QWrk::processStreamChunk()
813 int dur = 0, value = 0, type = 0, channel = 0;
814 quint8 status = 0, data1 = 0, data2 = 0;
815 quint16 track = read16bit();
816 int events = read16bit();
817 for (
int i = 0; i < events; ++i ) {
823 type = status & 0xf0;
824 channel = status & 0x0f;
827 Q_EMIT
signalWRKNote(track, time, channel, data1, data2, dur);
842 value = (data2 << 7) + data1 - 8192;
853void QWrk::processMeterChunk()
855 int count = read16bit();
856 for (
int i = 0; i < count; ++i) {
858 int measure = read16bit();
859 int num = readByte();
860 int den = pow(2, readByte());
866void QWrk::processMeterKeyChunk()
868 int count = read16bit();
869 for (
int i = 0; i < count; ++i) {
870 int measure = read16bit();
871 int num = readByte();
872 int den = pow(2, readByte());
873 qint8 alt = readByte();
879double QWrk::getRealTime(
long ticks)
const
881 double division = 1.0 * d->m_division;
886 if (!d->m_tempos.isEmpty()) {
887 foreach(
const RecTempo& rec, d->m_tempos) {
888 if (rec.time >= ticks)
893 return last.seconds + (((ticks - last.time) / division) * (60.0 / last.tempo));
896void QWrk::processTempoChunk(
int factor)
898 double division = 1.0 * d->m_division;
899 int count = read16bit();
901 for (
int i = 0; i < count; ++i) {
903 long time = read32bit();
905 long tempo = read16bit() * factor;
909 next.tempo = tempo / 100.0;
912 last.tempo = next.tempo;
914 if (! d->m_tempos.isEmpty()) {
915 foreach(
const RecTempo& rec, d->m_tempos) {
916 if (rec.time >= time)
920 next.seconds = last.seconds +
921 (((time - last.time) / division) * (60.0 / last.tempo));
923 d->m_tempos.append(next);
929void QWrk::processSysexChunk()
934 int bank = readByte();
935 int length = read16bit();
936 bool autosend = (readByte() != 0);
937 int namelen = readByte();
938 name = readString(namelen);
939 for(j=0; j<length; ++j) {
940 int byte = readByte();
946void QWrk::processSysex2Chunk()
951 int bank = read16bit();
952 int length = read32bit();
953 quint8 b = readByte();
954 int port = ( b & 0xf0 ) >> 4;
955 bool autosend = ( (b & 0x0f) != 0);
956 int namelen = readByte();
957 name = readString(namelen);
958 for(j=0; j<length; ++j) {
959 int byte = readByte();
965void QWrk::processNewSysexChunk()
970 int bank = read16bit();
971 int length = read32bit();
972 int port = read16bit();
973 bool autosend = (readByte() != 0);
974 int namelen = readByte();
975 name = readString(namelen);
976 for(j=0; j<length; ++j) {
977 int byte = readByte();
983void QWrk::processThruChunk()
986 qint8 port = readByte();
987 qint8 channel = readByte();
988 qint8 keyPlus = readByte();
989 qint8 velPlus = readByte();
990 qint8 localPort = readByte();
991 qint8 mode = readByte();
992 Q_EMIT
signalWRKThru(mode, port, channel, keyPlus, velPlus, localPort);
995void QWrk::processTrackOffset()
997 quint16 track = read16bit();
998 qint16 offset = read16bit();
1002void QWrk::processTrackReps()
1004 quint16 track = read16bit();
1005 quint16 reps = read16bit();
1009void QWrk::processTrackPatch()
1011 quint16 track = read16bit();
1012 qint8 patch = readByte();
1016void QWrk::processTimeFormat()
1018 quint16 fmt = read16bit();
1019 quint16 ofs = read16bit();
1023void QWrk::processComments()
1025 int len = read16bit();
1026 QString text = readString(len);
1030void QWrk::processVariableRecord(
int max)
1032 int datalen = max - 32;
1034 QString name = readVarString();
1035 readGap(31 - name.length());
1036 for (
int i = 0; i < datalen; ++i )
1041void QWrk::processUnknown(
int id)
1046void QWrk::processNewTrack()
1056 bool selected =
false;
1059 quint16 track = read16bit();
1060 quint8 len = readByte();
1061 QString name = readString(len);
1063 patch = read16bit();
1070 channel = readByte();
1071 muted = (readByte() != 0);
1072 Q_EMIT
signalWRKNewTrack(name, track, channel, key, vel, port, selected, muted, loop);
1083void QWrk::processSoftVer()
1085 int len = readByte();
1086 QString vers = readString(len);
1090void QWrk::processTrackName()
1092 int track = read16bit();
1093 int len = readByte();
1094 QString name = readString(len);
1098void QWrk::processStringTable()
1101 int rows = read16bit();
1102 for (
int i = 0; i < rows; ++i) {
1103 int len = readByte();
1104 QString name = readString(len);
1105 int idx = readByte();
1106 table.insert(idx, name);
1111void QWrk::processLyricsStream()
1113 quint16 track = read16bit();
1114 int events = read32bit();
1115 processNoteArray(track, events);
1118void QWrk::processTrackVol()
1120 quint16 track = read16bit();
1121 int vol = read16bit();
1125void QWrk::processNewTrackOffset()
1127 quint16 track = read16bit();
1128 int offset = read32bit();
1132void QWrk::processTrackBank()
1134 quint16 track = read16bit();
1135 int bank = read16bit();
1139void QWrk::processSegmentChunk()
1142 int track = read16bit();
1143 int offset = read32bit();
1145 int len = readByte();
1146 name = readString(len);
1149 int events = read32bit();
1150 processNoteArray(track, events);
1153void QWrk::processNewStream()
1156 int track = read16bit();
1157 int len = readByte();
1158 name = readString(len);
1160 int events = read32bit();
1161 processNoteArray(track, events);
1164void QWrk::processEndChunk()
1169int QWrk::readChunk()
1171 long start_pos, final_pos;
1172 int ck_len, ck = readByte();
1173 if (ck != END_CHUNK) {
1174 ck_len = read32bit();
1176 final_pos = start_pos + ck_len;
1177 readRawData(ck_len);
1181 processTrackChunk();
1187 processTimebaseChunk();
1190 processStreamChunk();
1193 processMeterChunk();
1196 processTempoChunk(100);
1199 processTempoChunk();
1202 processSysexChunk();
1208 processTrackOffset();
1214 processTrackPatch();
1217 processTimeFormat();
1223 processVariableRecord(ck_len);
1235 processStringTable();
1238 processLyricsStream();
1244 processNewTrackOffset();
1250 processMeterKeyChunk();
1253 processSysex2Chunk();
1256 processNewSysexChunk();
1259 processSegmentChunk();
1276 QByteArray hdr(
HEADER.length(),
' ');
1277 d->m_tempos.clear();
1278 d->m_IOStream->device()->read(hdr.data(),
HEADER.length());
1279 if (hdr == HEADER) {
1285 ck_id = readChunk();
1286 }
while (ck_id != END_CHUNK);
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?
void signalWRKText(int track, long time, int type, const QString &data)
Emitted after reading a text message.
int getRewindTime() const
Auto-rewind time.
bool getZeroCtrls() const
Zero continuous controllers?
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.
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)
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.
int getNow() const
Now marker time.
int getPunchOutTime() const
Punch-out time.
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.
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 signalWRKStringTable(const QStringList &strs)
Emitted after reading a string event types chunk.
int getPlayDelay() const
Play Delay.
bool getSendSPP() const
Send Song Position Pointer?
void signalWRKError(const QString &errorStr)
Emitted for a WRK file read error.
QWrk(QObject *parent=0)
Constructor.
virtual ~QWrk()
Destructor.
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.
int getTempoOfs3() const
Fixed-point ratio value of tempo offset 3.
int getThru() const
Thru marker time.
bool getSendCont() const
Send MIDI Continue?
int getTempoOfs2() const
Fixed-point ratio value of tempo offset 2.
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.
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 signalWRKTrackName(int track, const QString &name)
Emitted after reading a track name chunk.
void signalWRKTimeBase(int timebase)
Emitted after reading the timebase chunk.
QByteArray getLastChunkRawData() const
Gets the last chunk raw data (undecoded)
bool getAutoRewind() const
Auto-rewind?
bool getMetroPlay() const
Metronome on during playback?
QTextCodec * getTextCodec()
Gets the text codec used for text meta-events I/O.
int getFrom() const
From marker time.
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.
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.
bool getAutoRestart() const
Auto-restart?
int getClock() const
Clock Source (0=Int, 1=MIDI, 2=FSK, 3=SMPTE)
int getKeySig() const
Key signature (0=C, 1=C#, ... 11=B)
bool getMetroAccent() const
Metronome accents primary beats?
int getTempoOfs1() const
Fixed-point ratio value of tempo offset 1.
Cakewalk WRK Files Input.
const QByteArray HEADER("CAKEWALK")
Cakewalk WRK File header id.
@ 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.
@ 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.