drumstick 2.0.0
qsmf.h
Go to the documentation of this file.
1/*
2 Standard MIDI File component
3 Copyright (C) 2006-2020, Pedro Lopez-Cabanillas <plcl@users.sf.net>
4
5 Based on midifile.c by Tim Thompson, M.Czeiszperger and Greg Lee
6
7 This library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19*/
20
21#ifndef DRUMSTICK_QSMF_H
22#define DRUMSTICK_QSMF_H
23
24#include "macros.h"
25#include <QObject>
26#include <QScopedPointer>
27
28class QDataStream;
29
34
35namespace drumstick {
40namespace File {
41
46
47const quint32 MThd = 0x4d546864;
48const quint32 MTrk = 0x4d54726b;
49
50/* Standard MIDI Files meta event definitions */
51const quint8 meta_event = 0xff;
52const quint8 sequence_number = 0x00;
53const quint8 text_event = 0x01;
54const quint8 copyright_notice = 0x02;
55const quint8 sequence_name = 0x03;
56const quint8 instrument_name = 0x04;
57const quint8 lyric = 0x05;
58const quint8 marker = 0x06;
59const quint8 cue_point = 0x07;
60const quint8 forced_channel = 0x20;
61const quint8 forced_port = 0x21;
62const quint8 end_of_track = 0x2f;
63const quint8 set_tempo = 0x51;
64const quint8 smpte_offset = 0x54;
65const quint8 time_signature = 0x58;
66const quint8 key_signature = 0x59;
67const quint8 sequencer_specific = 0x7f;
68
69/* MIDI status commands most significant bit is 1 */
70const quint8 note_off = 0x80;
71const quint8 note_on = 0x90;
72const quint8 poly_aftertouch = 0xa0;
73const quint8 control_change = 0xb0;
74const quint8 program_chng = 0xc0;
75const quint8 channel_aftertouch = 0xd0;
76const quint8 pitch_wheel = 0xe0;
77const quint8 system_exclusive = 0xf0;
78const quint8 end_of_sysex = 0xf7;
79
80const quint8 midi_command_mask = 0xf0;
81const quint8 midi_channel_mask = 0x0f;
82
83const quint8 major_mode = 0;
84const quint8 minor_mode = 1;
85
91class DRUMSTICK_EXPORT QSmf : public QObject
92{
93 Q_OBJECT
94
95public:
96 explicit QSmf(QObject * parent = nullptr);
97 virtual ~QSmf();
98
99 void readFromStream(QDataStream *stream);
100 void readFromFile(const QString& fileName);
101 void writeToStream(QDataStream *stream);
102 void writeToFile(const QString& fileName);
103
104 void writeMetaEvent(long deltaTime, int type, const QByteArray& data);
105 void writeMetaEvent(long deltaTime, int type, const QString& data);
106 void writeMetaEvent(long deltaTime, int type, int data);
107 void writeMetaEvent(long deltaTime, int type);
108
109 void writeMidiEvent(long deltaTime, int type, int chan, int b1);
110 void writeMidiEvent(long deltaTime, int type, int chan, int b1, int b2);
111 void writeMidiEvent(long deltaTime, int type, int chan, const QByteArray& data);
112 void writeMidiEvent(long deltaTime, int type, long len, char* data);
113
114 void writeTempo(long deltaTime, long tempo);
115 void writeBpmTempo(long deltaTime, int tempo);
116 void writeTimeSignature(long deltaTime, int num, int den, int cc, int bb);
117 void writeKeySignature(long deltaTime, int tone, int mode);
118 void writeSequenceNumber(long deltaTime, int seqnum);
119
120 long getCurrentTime();
121 long getCurrentTempo();
122 long getRealTime();
123 long getFilePos();
124 int getDivision();
125 void setDivision(int division);
126 int getTracks();
127 void setTracks(int tracks);
128 int getFileFormat();
129 void setFileFormat(int fileFormat);
130 QTextCodec* getTextCodec();
131 void setTextCodec(QTextCodec *codec);
132
133signals:
138 void signalSMFError(const QString& errorStr);
145 void signalSMFHeader(int format, int ntrks, int division);
152 void signalSMFNoteOn(int chan, int pitch, int vol);
159 void signalSMFNoteOff(int chan, int pitch, int vol);
166 void signalSMFKeyPress(int chan, int pitch, int press);
173 void signalSMFCtlChange(int chan, int ctl, int value);
179 void signalSMFPitchBend(int chan, int value);
185 void signalSMFProgram(int chan, int patch);
191 void signalSMFChanPress(int chan, int press);
196 void signalSMFSysex(const QByteArray& data);
201 void signalSMFSeqSpecific(const QByteArray& data);
208 void signalSMFMetaUnregistered(int typ, const QByteArray& data);
214 void signalSMFMetaMisc(int typ, const QByteArray& data);
219 void signalSMFSequenceNum(int seq);
224 void signalSMFforcedChannel(int channel);
229 void signalSMFforcedPort(int port);
235 void signalSMFText(int typ, const QString& data);
244 void signalSMFSmpte(int b0, int b1, int b2, int b3, int b4);
252 void signalSMFTimeSig(int b0, int b1, int b2, int b3);
258 void signalSMFKeySig(int b0, int b1);
263 void signalSMFTempo(int tempo);
285 void signalSMFWriteTrack(int track);
286
287private:
291 struct QSmfRecTempo
292 {
293 quint64 tempo;
294 quint64 time;
295 };
296
297 class QSmfPrivate;
298 QScopedPointer<QSmfPrivate> d;
299
300 void SMFRead();
301 void SMFWrite();
302 quint8 getByte();
303 void putByte(quint8 value);
304 void readHeader();
305 void readTrack();
306 quint16 to16bit(quint8 c1, quint8 c2);
307 quint32 to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4);
308 quint16 read16bit();
309 quint32 read32bit();
310 void write16bit(quint16 data);
311 void write32bit(quint32 data);
312 void writeVarLen(quint64 value);
313 double ticksToSecs(quint64 ticks, quint16 division, quint64 tempo);
314 long readVarLen();
315 void readExpected(const QString& s);
316 void addTempo(quint64 tempo, quint64 time);
317 quint64 findTempo();
318 void SMFError(const QString& s);
319 void channelMessage(quint8 status, quint8 c1, quint8 c2);
320 void msgInit();
321 void msgAdd(quint8 b);
322 void metaEvent(quint8 b);
323 void sysEx();
324 void badByte(quint8 b, int p);
325 quint8 lowerByte(quint16 x);
326 quint8 upperByte(quint16 x);
327 bool endOfSmf();
328 void writeHeaderChunk(int format, int ntracks, int division);
329 void writeTrackChunk(int track);
330};
331
333
334}} /* namespace drumstick::File */
335
336#endif /* DRUMSTICK_QSMF_H */
The QObject class is the base class of all Qt objects.
int getTracks()
Gets the number of tracks.
Definition qsmf.cpp:1168
void signalSMFKeyPress(int chan, int pitch, int press)
Emitted after reading a Polyphonic Aftertouch message.
void setTextCodec(QTextCodec *codec)
Sets the text codec for text meta-events.
Definition qsmf.cpp:1226
long getRealTime()
Gets the real time in seconds.
Definition qsmf.cpp:1141
long getCurrentTempo()
Gets the current tempo.
Definition qsmf.cpp:1132
void signalSMFforcedChannel(int channel)
Emitted after reading a Forced channel message.
void setDivision(int division)
Sets the resolution.
Definition qsmf.cpp:1159
long getFilePos()
Gets the position in the SMF stream.
Definition qsmf.cpp:1204
void signalSMFforcedPort(int port)
Emitted after reading a Forced port message.
void signalSMFTimeSig(int b0, int b1, int b2, int b3)
Emitted after reading a SMF Time signature message.
void signalSMFText(int typ, const QString &data)
Emitted after reading a SMF text message.
void signalSMFKeySig(int b0, int b1)
Emitted after reading a SMF Key Signature smessage.
long getCurrentTime()
Gets the current time in ticks.
Definition qsmf.cpp:1123
void signalSMFChanPress(int chan, int press)
Emitted after reading a Channel Aftertouch message.
void setTracks(int tracks)
Sets the number of tracks.
Definition qsmf.cpp:1177
void writeTimeSignature(long deltaTime, int num, int den, int cc, int bb)
Writes a Time Signature message.
Definition qsmf.cpp:771
void signalSMFTrackEnd()
Emitted after a track has finished.
void signalSMFNoteOn(int chan, int pitch, int vol)
Emitted after reading a Note On message.
void signalSMFTempo(int tempo)
Emitted after reading a Tempo Change message.
void signalSMFWriteTrack(int track)
Emitted to request the user to write a track.
void signalSMFTrackStart()
Emitted after reading a track prefix.
void signalSMFError(const QString &errorStr)
Emitted for a SMF read or write error.
int getDivision()
Gets the resolution.
Definition qsmf.cpp:1150
QSmf(QObject *parent=nullptr)
Constructor.
Definition qsmf.cpp:100
void writeToFile(const QString &fileName)
Writes a SMF stream to a disk file.
Definition qsmf.cpp:466
void signalSMFSeqSpecific(const QByteArray &data)
Emitted after reading a Sequencer specific message.
void signalSMFWriteTempoTrack()
Emitted to request the user to write the tempo track.
void signalSMFendOfTrack()
Emitted after reading a End-Of-Track message.
void writeSequenceNumber(long deltaTime, int seqnum)
Writes a MIDI Sequence number.
Definition qsmf.cpp:725
void signalSMFHeader(int format, int ntrks, int division)
Emitted after reading a SMF header.
void readFromStream(QDataStream *stream)
Reads a SMF stream.
Definition qsmf.cpp:433
void signalSMFProgram(int chan, int patch)
Emitted after reading a Program change message.
void signalSMFNoteOff(int chan, int pitch, int vol)
Emitted after reading a Note Off message.
void writeMetaEvent(long deltaTime, int type, const QByteArray &data)
Writes a variable length Meta Event.
Definition qsmf.cpp:525
void signalSMFSequenceNum(int seq)
Emitted after reading a Sequence number message.
void signalSMFMetaMisc(int typ, const QByteArray &data)
Emitted after reading any SMF Meta message.
QTextCodec * getTextCodec()
Gets the text codec used for text meta-events I/O.
Definition qsmf.cpp:1214
void writeBpmTempo(long deltaTime, int tempo)
Writes a Tempo change message.
Definition qsmf.cpp:757
void readFromFile(const QString &fileName)
Reads a SMF stream from a disk file.
Definition qsmf.cpp:443
void signalSMFSysex(const QByteArray &data)
Emitted after reading a System Exclusive message.
void writeToStream(QDataStream *stream)
Writes a SMF stream.
Definition qsmf.cpp:456
void writeTempo(long deltaTime, long tempo)
Writes a Tempo change message.
Definition qsmf.cpp:741
void signalSMFCtlChange(int chan, int ctl, int value)
Emitted after reading a Control Change message.
void writeKeySignature(long deltaTime, int tone, int mode)
Writes a key Signature message.
Definition qsmf.cpp:789
void setFileFormat(int fileFormat)
Sets the SMF file format.
Definition qsmf.cpp:1195
void signalSMFPitchBend(int chan, int value)
Emitted after reading a Bender message.
int getFileFormat()
Gets the SMF file format.
Definition qsmf.cpp:1186
void writeMidiEvent(long deltaTime, int type, int chan, int b1)
Writes a MIDI message with a single parameter.
Definition qsmf.cpp:638
void signalSMFMetaUnregistered(int typ, const QByteArray &data)
Emitted after reading an unregistered SMF Meta message.
void signalSMFSmpte(int b0, int b1, int b2, int b3, int b4)
Emitted after reading a SMPT offset message.
const quint8 cue_point
SMF Cue point.
Definition qsmf.h:59
const quint8 system_exclusive
MIDI event System Exclusive begin.
Definition qsmf.h:77
const quint8 sequencer_specific
SMF Sequencer specific.
Definition qsmf.h:67
const quint32 MTrk
SMF Track prefix.
Definition qsmf.h:48
const quint8 forced_channel
SMF Forced MIDI channel.
Definition qsmf.h:60
const quint8 midi_channel_mask
Mask to extract the channel from the status byte.
Definition qsmf.h:81
const quint8 note_on
MIDI event Note On.
Definition qsmf.h:71
const quint8 control_change
MIDI event Control change.
Definition qsmf.h:73
const quint8 major_mode
Major mode scale.
Definition qsmf.h:83
const quint8 note_off
MIDI event Note Off.
Definition qsmf.h:70
const quint8 smpte_offset
SMF SMPTE offset.
Definition qsmf.h:64
const quint8 sequence_number
SMF Sequence number.
Definition qsmf.h:52
const quint8 minor_mode
Minor mode scale.
Definition qsmf.h:84
const quint8 sequence_name
SMF Sequence name.
Definition qsmf.h:55
const quint8 pitch_wheel
MIDI event Bender.
Definition qsmf.h:76
const quint8 meta_event
SMF Meta Event prefix.
Definition qsmf.h:51
const quint8 time_signature
SMF Time signature.
Definition qsmf.h:65
const quint8 end_of_track
SMF End of track.
Definition qsmf.h:62
const quint32 MThd
SMF Header prefix.
Definition qsmf.h:47
const quint8 poly_aftertouch
MIDI event Polyphonic pressure.
Definition qsmf.h:72
const quint8 key_signature
SMF Key signature.
Definition qsmf.h:66
const quint8 text_event
SMF Text event.
Definition qsmf.h:53
const quint8 channel_aftertouch
MIDI event Channel after-touch.
Definition qsmf.h:75
const quint8 instrument_name
SMF Instrument name.
Definition qsmf.h:56
const quint8 marker
SMF Marker.
Definition qsmf.h:58
const quint8 forced_port
SMF Forced MIDI port.
Definition qsmf.h:61
const quint8 copyright_notice
SMF Copyright notice.
Definition qsmf.h:54
const quint8 program_chng
MIDI event Program change.
Definition qsmf.h:74
const quint8 midi_command_mask
Mask to extract the command from the status byte.
Definition qsmf.h:80
const quint8 end_of_sysex
MIDI event System Exclusive end.
Definition qsmf.h:78
const quint8 lyric
SMF Lyric.
Definition qsmf.h:57
const quint8 set_tempo
SMF Tempo change.
Definition qsmf.h:63
Drumstick visibility macros.
Drumstick File library.
Definition qsmf.cpp:35
Drumstick common.