drumstick 0.5.0
|
00001 /* 00002 Standard MIDI File component 00003 Copyright (C) 2006-2010, Pedro Lopez-Cabanillas <plcl@users.sf.net> 00004 00005 Based on midifile.c by Tim Thompson, M.Czeiszperger and Greg Lee 00006 00007 This library is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU General Public License as published by 00009 the Free Software Foundation; either version 2 of the License, or 00010 (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License along 00018 with this program; if not, write to the Free Software Foundation, Inc., 00019 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 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 /* Standard MIDI Files meta event definitions */ 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 /* MIDI status commands most significant bit is 1 */ 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 } /* namespace drumstick */ 00325 00328 #endif /* DRUMSTICK_QSMF_H */