drumstick  0.5.0
qsmf.h
Go to the documentation of this file.
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 */