00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef DRUMSTICK_QSMF_H
00023 #define DRUMSTICK_QSMF_H
00024
00025 #include "macros.h"
00026 #include <QObject>
00027
00028 class QDataStream;
00029
00037 namespace drumstick {
00038
00039 #define MThd 0x4d546864
00040 #define MTrk 0x4d54726b
00042
00043 #define meta_event 0xff
00044 #define sequence_number 0x00
00045 #define text_event 0x01
00046 #define copyright_notice 0x02
00047 #define sequence_name 0x03
00048 #define instrument_name 0x04
00049 #define lyric 0x05
00050 #define marker 0x06
00051 #define cue_point 0x07
00052 #define forced_channel 0x20
00053 #define forced_port 0x21
00054 #define end_of_track 0x2f
00055 #define set_tempo 0x51
00056 #define smpte_offset 0x54
00057 #define time_signature 0x58
00058 #define key_signature 0x59
00059 #define sequencer_specific 0x7f
00061
00062 #define note_off 0x80
00063 #define note_on 0x90
00064 #define poly_aftertouch 0xa0
00065 #define control_change 0xb0
00066 #define program_chng 0xc0
00067 #define channel_aftertouch 0xd0
00068 #define pitch_wheel 0xe0
00069 #define system_exclusive 0xf0
00070 #define end_of_sysex 0xf7
00072 #define midi_command_mask 0xf0
00073 #define midi_channel_mask 0x0f
00075 #define major_mode 0
00076 #define minor_mode 1
00083 class DRUMSTICK_EXPORT QSmf : public QObject
00084 {
00085 Q_OBJECT
00086
00087 public:
00088 QSmf(QObject * parent = 0);
00089 virtual ~QSmf();
00090
00091 void readFromStream(QDataStream *stream);
00092 void readFromFile(const QString& fileName);
00093 void writeToStream(QDataStream *stream);
00094 void writeToFile(const QString& fileName);
00095
00096 void writeMetaEvent(long deltaTime, int type, const QByteArray& data);
00097 void writeMetaEvent(long deltaTime, int type, const QString& data);
00098 void writeMetaEvent(long deltaTime, int type, int data);
00099 void writeMetaEvent(long deltaTime, int type);
00100
00101 void writeMidiEvent(long deltaTime, int type, int chan, int b1);
00102 void writeMidiEvent(long deltaTime, int type, int chan, int b1, int b2);
00103 void writeMidiEvent(long deltaTime, int type, int chan, const QByteArray& data);
00104 void writeMidiEvent(long deltaTime, int type, long len, char* data);
00105
00106 void writeTempo(long deltaTime, long tempo);
00107 void writeBpmTempo(long deltaTime, int tempo);
00108 void writeTimeSignature(long deltaTime, int num, int den, int cc, int bb);
00109 void writeKeySignature(long deltaTime, int tone, int mode);
00110 void writeSequenceNumber(long deltaTime, int seqnum);
00111
00112 long getCurrentTime();
00113 long getCurrentTempo();
00114 long getRealTime();
00115 long getFilePos();
00116 int getDivision();
00117 void setDivision(int division);
00118 int getTracks();
00119 void setTracks(int tracks);
00120 int getFileFormat();
00121 void setFileFormat(int fileFormat);
00122 QTextCodec* getTextCodec();
00123 void setTextCodec(QTextCodec *codec);
00124
00125 signals:
00130 void signalSMFError(const QString& errorStr);
00137 void signalSMFHeader(int format, int ntrks, int division);
00144 void signalSMFNoteOn(int chan, int pitch, int vol);
00151 void signalSMFNoteOff(int chan, int pitch, int vol);
00158 void signalSMFKeyPress(int chan, int pitch, int press);
00165 void signalSMFCtlChange(int chan, int ctl, int value);
00171 void signalSMFPitchBend(int chan, int value);
00177 void signalSMFProgram(int chan, int patch);
00183 void signalSMFChanPress(int chan, int press);
00188 void signalSMFSysex(const QByteArray& data);
00193 void signalSMFSeqSpecific(const QByteArray& data);
00200 void signalSMFMetaUnregistered(int typ, const QByteArray& data);
00206 void signalSMFMetaMisc(int typ, const QByteArray& data);
00211 void signalSMFSequenceNum(int seq);
00216 void signalSMFforcedChannel(int channel);
00221 void signalSMFforcedPort(int port);
00227 void signalSMFText(int typ, const QString& data);
00236 void signalSMFSmpte(int b0, int b1, int b2, int b3, int b4);
00244 void signalSMFTimeSig(int b0, int b1, int b2, int b3);
00250 void signalSMFKeySig(int b0, int b1);
00255 void signalSMFTempo(int tempo);
00259 void signalSMFendOfTrack();
00263 void signalSMFTrackStart();
00267 void signalSMFTrackEnd();
00272 void signalSMFWriteTempoTrack();
00277 void signalSMFWriteTrack(int track);
00278
00279 private:
00283 struct QSmfRecTempo
00284 {
00285 quint64 tempo;
00286 quint64 time;
00287 };
00288
00289 class QSmfPrivate;
00290 QSmfPrivate *d;
00291
00292 void SMFRead();
00293 void SMFWrite();
00294 quint8 getByte();
00295 void putByte(quint8 value);
00296 void readHeader();
00297 void readTrack();
00298 quint16 to16bit(quint8 c1, quint8 c2);
00299 quint32 to32bit(quint8 c1, quint8 c2, quint8 c3, quint8 c4);
00300 quint16 read16bit();
00301 quint32 read32bit();
00302 void write16bit(quint16 data);
00303 void write32bit(quint32 data);
00304 void writeVarLen(quint64 value);
00305 double ticksToSecs(quint64 ticks, quint16 division, quint64 tempo);
00306 long readVarLen();
00307 void readExpected(const QString& s);
00308 void addTempo(quint64 tempo, quint64 time);
00309 quint64 findTempo();
00310 void SMFError(const QString& s);
00311 void channelMessage(quint8 status, quint8 c1, quint8 c2);
00312 void msgInit();
00313 void msgAdd(quint8 b);
00314 void metaEvent(quint8 b);
00315 void sysEx();
00316 void badByte(quint8 b, int p);
00317 quint8 lowerByte(quint16 x);
00318 quint8 upperByte(quint16 x);
00319 bool endOfSmf();
00320 void writeHeaderChunk(int format, int ntracks, int division);
00321 void writeTrackChunk(int track);
00322 };
00323
00324 }
00325
00328 #endif