Skip to content

Commit

Permalink
Mostly cosmetic changes: moving main sorting functionality to MidiEve…
Browse files Browse the repository at this point in the history
…ntList class.
  • Loading branch information
craigsapp committed Apr 18, 2018
1 parent b92c784 commit 82baf1a
Show file tree
Hide file tree
Showing 6 changed files with 275 additions and 189 deletions.
47 changes: 22 additions & 25 deletions include/MidiEvent.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@

using namespace std;

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned long ulong;

class MidiEvent : public MidiMessage {
public:
Expand All @@ -35,32 +32,32 @@ class MidiEvent : public MidiMessage {

~MidiEvent ();

MidiEvent& operator= (const MidiEvent& mfevent);
MidiEvent& operator= (const MidiMessage& message);
MidiEvent& operator= (const vector<uchar>& bytes);
MidiEvent& operator= (const vector<char>& bytes);
MidiEvent& operator= (const vector<int>& bytes);
void clearVariables(void);
MidiEvent& operator= (const MidiEvent& mfevent);
MidiEvent& operator= (const MidiMessage& message);
MidiEvent& operator= (const vector<uchar>& bytes);
MidiEvent& operator= (const vector<char>& bytes);
MidiEvent& operator= (const vector<int>& bytes);
void clearVariables (void);

// functions related to event linking (note-ons to note-offs).
void unlinkEvent (void);
void unlinkEvents (void);
void linkEvent (MidiEvent* mev);
void linkEvents (MidiEvent* mev);
void linkEvent (MidiEvent& mev);
void linkEvents (MidiEvent& mev);
int isLinked (void);
MidiEvent* getLinkedEvent(void);
int getTickDuration(void);
double getDurationInSeconds(void);

int tick;
int track;
double seconds;
int seq;
void unlinkEvent (void);
void unlinkEvents (void);
void linkEvent (MidiEvent* mev);
void linkEvents (MidiEvent* mev);
void linkEvent (MidiEvent& mev);
void linkEvents (MidiEvent& mev);
int isLinked (void);
MidiEvent* getLinkedEvent (void);
int getTickDuration (void);
double getDurationInSeconds (void);

int tick; // delta or absolute MIDI ticks
int track; // [original] track number of event in MIDI file
double seconds; // calculated time in sec. (doTimeAnalysis())
int seq; // sorting sequence number of event

private:
MidiEvent* eventlink; // used to match note-ons and note-offs
MidiEvent* eventlink; // used to match note-ons and note-offs

};

Expand Down
12 changes: 11 additions & 1 deletion include/MidiEventList.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ class MidiEventList {
int linkEventPairs (void);
void clearLinks (void);
MidiEvent** data (void);
void clearSequence (void);
int markSequence (int sequence = 1);

int push (MidiEvent& event);
int push_back (MidiEvent& event);
Expand All @@ -52,12 +54,20 @@ class MidiEventList {

MidiEventList& operator=(MidiEventList other);

private:
protected:
vector<MidiEvent*> list;

private:
void sort (void);
void sortKeepSequence (void);

friend class MidiFile;

};


int eventcompare(const void* a, const void* b);

#endif /* _MIDIEVENTLIST_H_INCLUDED */


Expand Down
94 changes: 40 additions & 54 deletions include/MidiFile.h
Original file line number Diff line number Diff line change
@@ -1,20 +1,7 @@
//
// Programmer: Craig Stuart Sapp <[email protected]>
// Creation Date: Fri Nov 26 14:12:01 PST 1999
// Last Modified: Fri Dec 2 13:26:44 PST 1999
// Last Modified: Fri Nov 10 12:13:15 PST 2000 Added some more editing cap.
// Last Modified: Thu Jan 10 10:03:39 PST 2002 Added allocateEvents()
// Last Modified: Mon Jun 10 22:43:10 PDT 2002 Added clear()
// Last Modified: Sat Dec 17 23:11:57 PST 2005 Added millisecond ticks
// Last Modified: Tue Feb 5 11:51:43 PST 2008 Read() set to const char*
// Last Modified: Tue Apr 7 09:23:48 PDT 2009 Added addMetaEvent
// Last Modified: Fri Jun 12 22:58:34 PDT 2009 Renamed SigCollection class
// Last Modified: Thu Jul 22 23:28:54 PDT 2010 Added tick to time mapping
// Last Modified: Thu Jul 22 23:28:54 PDT 2010 Changed _MidiEvent to MidiEvent
// Last Modified: Tue Feb 22 13:26:40 PST 2011 Added write(ostream)
// Last Modified: Mon Nov 18 13:10:37 PST 2013 Added .printHex function.
// Last Modified: Mon Feb 9 14:01:31 PST 2015 Removed FileIO dependency.
// Last Modified: Sat Feb 14 22:35:25 PST 2015 Split out subclasses.
// Last Modified: Tue Apr 17 21:27:58 PDT 2018 Rearrange sorting functions.
// Filename: midifile/include/MidiFile.h
// Website: http://midifile.sapp.org
// Syntax: C++11
Expand Down Expand Up @@ -58,6 +45,8 @@ class MidiFile {
MidiFile (MidiFile&& other);
~MidiFile ();

MidiFile& operator= (MidiFile other);

// reading/writing functions:
int read (const char* aFile);
int read (const string& aFile);
Expand All @@ -77,16 +66,22 @@ class MidiFile {
int status (void);

// track-related functions:
MidiEventList& operator[] (int aTrack);
MidiEventList& operator[] (int aTrack);
const MidiEventList& operator[] (int aTrack) const;
int getTrackCount (void) const;
int getNumTracks (void) const;
int size (void) const;
void removeEmpties (void);

// tick-related functions:
void deltaTicks (void);
void absoluteTicks (void);
int getTickState (void);
int isDeltaTicks (void);
int isAbsoluteTicks (void);
int getMaxTick (void);

// join/split track functionality:
void markSequence (void);
void clearSequence (void);
void joinTracks (void);
void splitTracks (void);
void splitTracksByChannel (void);
Expand All @@ -96,29 +91,22 @@ class MidiFile {
int getSplitTrack (int track, int index);
int getSplitTrack (int index);

void sortTrack (MidiEventList& trackData);
// track sorting funcionality:
void sortTrack (int track);
void sortTracks (void);
void markSequence (void);
void markSequence (int track, int sequence = 1);
void clearSequence (void);
void clearSequence (int track);

// track manipulation functionality:
int addTrack (void);
int addTrack (int count);
int addTracks(int count) { return addTrack(count); }
int addTracks (int count);
void deleteTrack (int aTrack);
void mergeTracks (int aTrack1, int aTrack2);
int getTrackCountAsType1 (void);

int getEventCount (int aTrack);
void allocateEvents (int track, int aSize);
int getNumEvents (int aTrack);

// tick-related functions:
void deltaTicks (void);
void absoluteTicks (void);
int getTickState (void);
int isDeltaTicks (void);
int isAbsoluteTicks (void);
int getMaxTick (void);

// ticks-per-quarter related functions:
void setMillisecondTicks (void);
int getTicksPerQuarterNote (void);
Expand Down Expand Up @@ -146,9 +134,17 @@ class MidiFile {
void setFilename (const string& aname);
const char* getFilename (void);

int addEvent (int aTrack, int aTick,
// event functionality:
int addEvent (int aTrack, int aTick,
vector<uchar>& midiData);
int addEvent (MidiEvent& mfevent);
int addEvent (MidiEvent& mfevent);
MidiEvent& getEvent (int aTrack, int anIndex);
int getEventCount (int aTrack);
int getNumEvents (int aTrack);
void allocateEvents (int track, int aSize);
void erase (void);
void clear (void);
void clear_no_deallocate (void);

// MIDI message adding convenience functions:
int addNoteOn (int aTrack, int aTick,
Expand Down Expand Up @@ -189,21 +185,14 @@ class MidiFile {
double aTempo);
int addTimeSignature (int aTrack, int aTick,
int top, int bottom,
int clocksPerClick = 24,
int clocksPerClick = 24,
int num32dsPerQuarter = 8);
int addCompoundTimeSignature (int aTrack, int aTick,
int top, int bottom,
int clocksPerClick = 36,
int clocksPerClick = 36,
int num32dsPerQuarter = 8);

void erase (void);
void clear (void);
void clear_no_deallocate (void);
MidiEvent& getEvent (int aTrack, int anIndex);

MidiFile& operator=(MidiFile other);

uchar readByte (istream& input);
uchar readByte (istream& input);

// static functions:
static ushort readLittleEndian2Bytes (istream& input);
Expand All @@ -222,20 +211,19 @@ class MidiFile {
static ostream& writeBigEndianDouble (ostream& out, double value);

protected:
vector<MidiEventList*> events; // MIDI file events
int ticksPerQuarterNote; // time base of file
int trackCount; // # of tracks in file
int theTrackState; // joined or split
int theTimeState; // absolute or delta
string readFileName; // read file name

vector<MidiEventList*> events; // MIDI file events
int ticksPerQuarterNote; // time base of file
int trackCount; // # of tracks in file
int theTrackState; // joined or split
int theTimeState; // absolute or delta
string readFileName; // read file name
int timemapvalid;
vector<_TickTime> timemap;
int rwstatus; // read/write success flag
int rwstatus; // read/write success flag

private:
int extractMidiData (istream& inputfile, vector<uchar>& array,
uchar& runningCommand);
uchar& runningCommand);
ulong readVLValue (istream& inputfile);
ulong unpackVLV (uchar a = 0, uchar b = 0, uchar c = 0,
uchar d = 0, uchar e = 0);
Expand All @@ -248,8 +236,6 @@ class MidiFile {
double linearSecondInterpolationAtTick (int ticktime);
};


int eventcompare(const void* a, const void* b);
ostream& operator<<(ostream& out, MidiFile& aMidiFile);

#endif /* _MIDIFILE_H_INCLUDED */
Expand Down
5 changes: 4 additions & 1 deletion include/MidiMessage.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,16 @@ class MidiMessage : public vector<uchar> {
MidiMessage (const vector<char>& message);
MidiMessage (const vector<int>& message);

~MidiMessage ();
~MidiMessage ();

MidiMessage& operator= (const MidiMessage& message);
MidiMessage& operator= (const vector<uchar>& bytes);
MidiMessage& operator= (const vector<char>& bytes);
MidiMessage& operator= (const vector<int>& bytes);

void sortTrack (void);
void sortTrackWithSequence(void);

// data access convenience functions (returns -1 if not present):
int getP0 (void) const;
int getP1 (void) const;
Expand Down
Loading

0 comments on commit 82baf1a

Please sign in to comment.