--- events/ChanPres.h	1996-02-18 19:57:20.000000000 -0500
+++ events/ChanPres.h	2012-04-07 14:08:43.000000000 -0400
@@ -44,7 +44,7 @@
 	    {return (new ChannelPressureEvent(*this));}
 
 	virtual EventType GetType(void) const {return (CHANNELPRESSURE);}
-	virtual char *GetTypeStr(void) const {return ("ChannelPressureEvent");}
+	virtual const char *GetTypeStr(void) const {return ("ChannelPressureEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetPressure(void) const {
 		if (GetWildcard(wc_pressure))
--- events/Event.h	1996-07-28 14:51:08.000000000 -0400
+++ events/Event.h	2012-04-11 01:04:43.000000000 -0400
@@ -81,12 +81,13 @@
 		else
 			return (time);
 	}
+	virtual ~Event() {};
 	virtual EventType GetType(void) const {return (NOTYPE);}
-	virtual char *GetTypeStr(void) const {return ("NoType");}
+	virtual const char *GetTypeStr(void) const {return ("NoType");}
 	virtual char *GetEventStr(void) const;
 	Event *GetNextEvent(void) const {return (next_event);}
 	Event *GetPrevEvent(void) const {return (prev_event);}
-	const EventTreeNode *GetEventTreeNode(void) const {return (node);}
+	EventTreeNode *GetEventTreeNode(void) const {return (node);}
 
 	void SetTime(unsigned long t) {
 		if (t == WC_TIME)
@@ -96,7 +97,7 @@
 	}
 	void SetNextEvent(Event *n) {next_event = n;}
 	void SetPrevEvent(Event *p) {prev_event = p;}
-	void SetEventTreeNode(const EventTreeNode *n) {node = n;}
+	void SetEventTreeNode(EventTreeNode *n) {node = n;}
 
 	Event &operator=(const Event &e);
 	int operator==(const Event &e) const;
@@ -120,6 +121,6 @@
 	static const unsigned long wc_time;
 	Event *next_event;
 	Event *prev_event;
-	const EventTreeNode *node;
+	EventTreeNode *node;
 };
 #endif
--- events/KeyPres.h	1996-02-18 19:57:26.000000000 -0500
+++ events/KeyPres.h	2012-04-07 14:08:43.000000000 -0400
@@ -45,7 +45,7 @@
 	virtual Event *Dup(void) const {return (new KeyPressureEvent(*this));}
 
 	virtual EventType GetType(void) const {return (KEYPRESSURE);}
-	virtual char *GetTypeStr(void) const {return ("KeyPressureEvent");}
+	virtual const char *GetTypeStr(void) const {return ("KeyPressureEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetPitch(void) const {
 		if (GetWildcard(wc_pitch))
--- events/MChanPrf.cxx	1996-07-28 15:09:16.000000000 -0400
+++ events/MChanPrf.cxx	2012-04-07 15:41:59.000000000 -0400
@@ -74,7 +74,7 @@
 MetaChannelPrefixEvent::~MetaChannelPrefixEvent()
 {
 
-	delete data;
+	delete[] data;
 }
 
 void
@@ -82,7 +82,7 @@
 {
 
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if (dat == WC_DATA || len == WC_LENGTH) {
 		SetWildcard(wc_data);
 		data = 0;
@@ -101,7 +101,7 @@
 
 	(MetaEvent)*this = (MetaEvent)e;
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if (e.GetWildcard(wc_data)) {
 		data = 0;
 		length = -1;
@@ -129,7 +129,7 @@
 		buf.setf(ios::showbase | ios::internal);
 		for (i = 0; i < length; i++)
 			buf << " " << hex << setw(4) << setfill('0') <<
-			    (int)data[i];
+			    (intptr_t)data[i];
 	}
 	buf << ends;
 	delete tbuf;
@@ -142,7 +142,7 @@
 	const unsigned char *ptr;
 
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if ((length = t.GetVarValue()) == -1)
 		return ("Incomplete MetaChannelPrefixEvent - bad length");
 	data = new unsigned char[length];
--- events/MChanPrf.h	1996-02-18 19:57:29.000000000 -0500
+++ events/MChanPrf.h	2012-04-07 14:36:23.000000000 -0400
@@ -46,7 +46,7 @@
 	    {return (new MetaChannelPrefixEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METACHANNELPREFIX);}
-	virtual char *GetTypeStr(void) const
+	virtual const char *GetTypeStr(void) const
 	    {return ("MetaChannelPrefixEvent");}
 	virtual char *GetEventStr(void) const;
 	const unsigned char *GetData(void) const {
--- events/MCopy.h	1996-02-12 19:25:36.000000000 -0500
+++ events/MCopy.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new MetaCopyrightEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METACOPYRIGHT);}
-	virtual char *GetTypeStr(void) const {return ("MetaCopyrightEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaCopyrightEvent");}
 	virtual char *GetEventStr(void) const;
 
 	MetaCopyrightEvent &operator=(const MetaCopyrightEvent &e);
--- events/MCue.h	1996-02-12 19:25:37.000000000 -0500
+++ events/MCue.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new MetaCueEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METACUE);}
-	virtual char *GetTypeStr(void) const {return ("MetaCueEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaCueEvent");}
 	virtual char *GetEventStr(void) const;
 
 	MetaCueEvent &operator=(const MetaCueEvent &e);
--- events/MEOT.h	1996-02-12 19:25:38.000000000 -0500
+++ events/MEOT.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	    {return (new MetaEndOfTrackEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METAENDOFTRACK);}
-	virtual char *GetTypeStr(void) const {return ("MetaEndOfTrackEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaEndOfTrackEvent");}
 	virtual char *GetEventStr(void) const;
 
 	MetaEndOfTrackEvent &operator=(const MetaEndOfTrackEvent &e);
--- events/MEvent.h	1996-02-12 19:25:39.000000000 -0500
+++ events/MEvent.h	2012-04-07 14:08:43.000000000 -0400
@@ -42,7 +42,7 @@
 	virtual Event *Dup(void) const {return (new MetaEvent(*this));}
 
 	virtual EventType GetType(void) const {return (META);}
-	virtual char *GetTypeStr(void) const {return ("MetaEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaEvent");}
 	virtual char *GetEventStr(void) const;
 
 	MetaEvent &operator=(const MetaEvent &e);
--- events/MInstNam.h	1996-02-12 19:25:39.000000000 -0500
+++ events/MInstNam.h	2012-04-07 14:08:43.000000000 -0400
@@ -45,7 +45,7 @@
 	    {return (new MetaInstrumentNameEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METAINSTRUMENTNAME);}
-	virtual char *GetTypeStr(void) const {return ("MetaInstrumentName");}
+	virtual const char *GetTypeStr(void) const {return ("MetaInstrumentName");}
 	virtual char *GetEventStr(void) const;
 
 	MetaInstrumentNameEvent &operator=(const MetaInstrumentNameEvent &e);
--- events/MKey.cxx	1996-07-28 15:09:19.000000000 -0400
+++ events/MKey.cxx	2012-04-07 15:51:06.000000000 -0400
@@ -396,7 +396,7 @@
 		badkey = 1;
 	}
 
-	delete keystr;
+	delete[] keystr;
 	if (badkey)
 		*match = 0;
 	else
@@ -409,21 +409,13 @@
 StrToMode(const char *str, int *match)
 {
 	Mode mode;
-	char *modestr;
-	int i, modelen;
-
-	modelen = strlen(str);
-	modestr = new char[modelen + 1];
-	for (i = 0; i < modelen; i++)
-		modestr[i] = tolower(str[i]);
-	modestr[i] = '\0';
 
 	*match = 1;
-	if (strcmp(modestr, "minor") == 0)
+	if (strcasecmp(str, "minor") == 0)
 		mode = MODE_MINOR;
-	else if (strcmp(modestr, "major") == 0)
+	else if (strcasecmp(str, "major") == 0)
 		mode = MODE_MAJOR;
-	else if (strcmp(modestr, "*") == 0)
+	else if (strcasecmp(str, "*") == 0)
 		mode = MODE_WC;
 	else {
 		mode = MODE_MAJOR;
--- events/MKey.h	1996-02-18 19:57:33.000000000 -0500
+++ events/MKey.h	2012-04-07 14:08:43.000000000 -0400
@@ -57,7 +57,7 @@
 	virtual Event *Dup(void) const {return (new MetaKeyEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METAKEY);}
-	virtual char *GetTypeStr(void) const {return ("MetaKeyEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaKeyEvent");}
 	virtual char *GetEventStr(void) const;
 	Key GetKey(void) const {
 		if (GetWildcard(wc_key))
--- events/MLyric.h	1996-02-12 19:25:41.000000000 -0500
+++ events/MLyric.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new MetaLyricEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METALYRIC);}
-	virtual char *GetTypeStr(void) const {return ("MetaLyricEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaLyricEvent");}
 	virtual char *GetEventStr(void) const;
 
 	MetaLyricEvent &operator=(const MetaLyricEvent &e);
--- events/MMarker.h	1996-02-12 19:25:42.000000000 -0500
+++ events/MMarker.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new MetaMarkerEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METAMARKER);}
-	virtual char *GetTypeStr(void) const {return ("MetaMarkerEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaMarkerEvent");}
 	virtual char *GetEventStr(void) const;
 
 	MetaMarkerEvent &operator=(const MetaMarkerEvent &e);
--- events/MPortNum.h	1996-02-18 19:57:36.000000000 -0500
+++ events/MPortNum.h	2012-04-07 14:08:43.000000000 -0400
@@ -44,7 +44,7 @@
 	    {return (new MetaPortNumberEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METAPORTNUMBER);}
-	virtual char *GetTypeStr(void) const
+	virtual const char *GetTypeStr(void) const
 	    {return ("MetaPortNumberEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetPort(void) const {
--- events/MSMPTE.h	1996-02-18 19:57:40.000000000 -0500
+++ events/MSMPTE.h	2012-04-07 14:08:43.000000000 -0400
@@ -42,7 +42,7 @@
 	virtual Event *Dup(void) const {return (new MetaSMPTEEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METASMPTE);}
-	virtual char *GetTypeStr(void) const {return ("MetaSMPTEEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaSMPTEEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetHour(void) const {
 		if (GetWildcard(wc_hour))
--- events/MSeqNam.h	1996-02-12 19:25:44.000000000 -0500
+++ events/MSeqNam.h	2012-04-07 14:08:43.000000000 -0400
@@ -44,7 +44,7 @@
 	    {return (new MetaSequenceNameEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METASEQUENCENAME);}
-	virtual char *GetTypeStr(void) const {return ("MetaSequenceNameEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaSequenceNameEvent");}
 	virtual char *GetEventStr(void) const;
 
 	MetaSequenceNameEvent &operator=(const MetaSequenceNameEvent &e);
--- events/MSeqNum.h	1996-02-18 19:57:43.000000000 -0500
+++ events/MSeqNum.h	2012-04-07 14:08:43.000000000 -0400
@@ -44,7 +44,7 @@
 	    {return (new MetaSequenceNumberEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METASEQUENCENUMBER);}
-	virtual char *GetTypeStr(void) const
+	virtual const char *GetTypeStr(void) const
 	    {return ("MetaSequenceNumberEvent");}
 	virtual char *GetEventStr(void) const;
 	long GetNumber(void) const {
--- events/MSeqSpec.cxx	1996-07-28 15:09:24.000000000 -0400
+++ events/MSeqSpec.cxx	2012-04-07 15:47:09.000000000 -0400
@@ -74,7 +74,7 @@
 MetaSequencerSpecificEvent::~MetaSequencerSpecificEvent()
 {
 
-	delete data;
+	delete[] data;
 }
 
 void
@@ -82,7 +82,7 @@
 {
 
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if (dat == WC_DATA || len == WC_LENGTH) {
 		SetWildcard(wc_data);
 		data = 0;
@@ -102,7 +102,7 @@
 
 	(MetaEvent)*this = (MetaEvent)e;
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if (e.GetWildcard(wc_data)) {
 		data = 0;
 		length = -1;
@@ -144,7 +144,7 @@
 	const unsigned char *ptr;
 
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if ((length = t.GetVarValue()) == -1)
 		return ("Incomplete MetaSequenceSpecificEvent - bad length");
 	data = new unsigned char[length];
--- events/MSeqSpec.h	1996-02-18 19:57:45.000000000 -0500
+++ events/MSeqSpec.h	2012-04-07 14:08:43.000000000 -0400
@@ -46,7 +46,7 @@
 	    {return (new MetaSequencerSpecificEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METASEQUENCERSPECIFIC);}
-	virtual char *GetTypeStr(void) const
+	virtual const char *GetTypeStr(void) const
 	    {return ("MetaSequencerSpecificEvent");}
 	virtual char *GetEventStr(void) const;
 	const unsigned char *GetData(void) const {
--- events/MTempo.h	1996-02-18 19:57:49.000000000 -0500
+++ events/MTempo.h	2012-04-07 14:08:43.000000000 -0400
@@ -42,7 +42,7 @@
 	virtual Event *Dup(void) const {return (new MetaTempoEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METATEMPO);}
-	virtual char *GetTypeStr(void) const {return ("MetaTempoEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaTempoEvent");}
 	virtual char *GetEventStr(void) const;
 	short GetTempo(void) const {
 		if (GetWildcard(wc_tempo))
--- events/MText.cxx	1996-07-28 15:09:25.000000000 -0400
+++ events/MText.cxx	2012-04-07 15:46:17.000000000 -0400
@@ -83,14 +83,14 @@
 MetaTextEvent::~MetaTextEvent()
 {
 
-	delete string;
+	delete[] string;
 }
 
 void
 MetaTextEvent::SetString(const char *str)
 {
 
-	delete string;
+	delete[] string;
 	if (str == WC_STRING) {
 		string = 0;
 		length = -1;
@@ -110,7 +110,7 @@
 
 	(MetaEvent)*this = (MetaEvent)e;
 	length = e.length;
-	delete string;
+	delete[] string;
 	if (e.GetWildcard(wc_string)) {
 		string = 0;
 		return (*this);
@@ -144,7 +144,7 @@
 	const unsigned char *ptr;
 
 	if (string != 0)
-		delete string;
+		delete[] string;
 	if ((length = t.GetVarValue()) == -1)
 		return ("Incomplete MetaTextEvent - bad length");
 	string = new char[length + 1];
--- events/MText.h	1996-02-18 19:57:52.000000000 -0500
+++ events/MText.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new MetaTextEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METATEXT);}
-	virtual char *GetTypeStr(void) const {return ("MetaTextEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaTextEvent");}
 	virtual char *GetEventStr(void) const;
 	const char *GetString(void) const {
 		if (GetWildcard(wc_string))
--- events/MTime.h	1996-02-18 19:57:55.000000000 -0500
+++ events/MTime.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new MetaTimeEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METATIME);}
-	virtual char *GetTypeStr(void) const {return ("MetaTimeEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaTimeEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetNumerator(void) const {
 		if (GetWildcard(wc_numerator))
--- events/MUnknown.cxx	1996-07-28 15:09:26.000000000 -0400
+++ events/MUnknown.cxx	2012-04-07 15:48:00.000000000 -0400
@@ -86,14 +86,14 @@
 MetaUnknownEvent::~MetaUnknownEvent()
 {
 
-	delete data;
+	delete[] data;
 }
 
 void
 MetaUnknownEvent::SetData(const unsigned char *dat, long len)
 {
 
-	delete data;
+	delete[] data;
 	if (dat == WC_DATA || len == WC_LENGTH) {
 		SetWildcard(wc_data);
 		data = 0;
@@ -111,7 +111,7 @@
 {
 
 	(MetaEvent)*this = (MetaEvent)e;
-	delete data;
+	delete[] data;
 	type = e.type;
 	if (e.GetWildcard(wc_data)) {
 		data = 0;
@@ -158,7 +158,7 @@
 	const unsigned char *ptr;
 
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if ((length = t.GetVarValue()) == -1)
 		return ("Incomplete MetaUnknownEvent - bad length");
 	data = new unsigned char[length];
--- events/MUnknown.h	1996-02-25 18:09:15.000000000 -0500
+++ events/MUnknown.h	2012-04-07 14:08:43.000000000 -0400
@@ -45,7 +45,7 @@
 	virtual Event *Dup(void) const {return (new MetaUnknownEvent(*this));}
 
 	virtual EventType GetType(void) const {return (METAUNKNOWN);}
-	virtual char *GetTypeStr(void) const {return ("MetaUnknownEvent");}
+	virtual const char *GetTypeStr(void) const {return ("MetaUnknownEvent");}
 	virtual char *GetEventStr(void) const;
 	const unsigned char *GetData(void) const {
 		if (GetWildcard(wc_data))
--- events/NormEvnt.h	1996-02-18 19:58:01.000000000 -0500
+++ events/NormEvnt.h	2012-04-07 14:08:43.000000000 -0400
@@ -42,7 +42,7 @@
 	virtual Event *Dup(void) const {return (new NormalEvent(*this));}
 
 	virtual EventType GetType(void) const {return (NORMAL);}
-	virtual char *GetTypeStr(void) const {return ("NormalEvent");}
+	virtual const char *GetTypeStr(void) const {return ("NormalEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetChannel(void) const {
 		if (GetWildcard(wc_channel))
--- events/Note.h	1996-02-25 18:09:19.000000000 -0500
+++ events/Note.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new NoteEvent(*this));}
 
 	virtual EventType GetType(void) const {return (NOTE);}
-	virtual char *GetTypeStr(void) const {return ("NoteEvent");}
+	virtual const char *GetTypeStr(void) const {return ("NoteEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetPitch(void) const {
 		if (GetWildcard(wc_pitch))
--- events/NoteOff.h	1996-02-18 19:58:07.000000000 -0500
+++ events/NoteOff.h	2012-04-07 14:08:43.000000000 -0400
@@ -43,7 +43,7 @@
 	virtual Event *Dup(void) const {return (new NoteOffEvent(*this));}
 
 	virtual EventType GetType(void) const {return (NOTEOFF);}
-	virtual char *GetTypeStr(void) const {return ("NoteOffEvent");}
+	virtual const char *GetTypeStr(void) const {return ("NoteOffEvent");}
 	virtual char *GetEventStr(void) const;
 
 	NoteOffEvent &operator=(const NoteOffEvent &e);
--- events/NoteOn.h	1996-02-25 18:09:22.000000000 -0500
+++ events/NoteOn.h	2012-04-07 14:08:43.000000000 -0400
@@ -45,7 +45,7 @@
 	virtual Event *Dup(void) const {return (new NoteOnEvent(*this));}
 
 	virtual EventType GetType(void) const {return (NOTEON);}
-	virtual char *GetTypeStr(void) const {return ("NoteOnEvent");}
+	virtual const char *GetTypeStr(void) const {return ("NoteOnEvent");}
 	virtual char *GetEventStr(void) const;
 
 	unsigned long GetDuration(void) const {
--- events/Param.h	1996-02-18 19:58:13.000000000 -0500
+++ events/Param.h	2012-04-07 14:08:43.000000000 -0400
@@ -42,7 +42,7 @@
 	virtual Event *Dup(void) const {return (new ParameterEvent(*this));}
 
 	virtual EventType GetType(void) const {return (PARAMETER);}
-	virtual char *GetTypeStr(void) const {return ("ParameterEvent");}
+	virtual const char *GetTypeStr(void) const {return ("ParameterEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetParameter(void) const {
 		if (GetWildcard(wc_parameter))
--- events/PitchWhl.h	1996-02-18 19:58:16.000000000 -0500
+++ events/PitchWhl.h	2012-04-07 14:08:43.000000000 -0400
@@ -42,7 +42,7 @@
 	virtual Event *Dup(void) const {return (new PitchWheelEvent(*this));}
 
 	virtual EventType GetType(void) const {return (PITCHWHEEL);}
-	virtual char *GetTypeStr(void) const {return ("PitchWheelEvent");}
+	virtual const char *GetTypeStr(void) const {return ("PitchWheelEvent");}
 	virtual char *GetEventStr(void) const;
 	long GetValue(void) const {
 		if (GetWildcard(wc_value))
--- events/Program.h	1996-02-18 19:58:19.000000000 -0500
+++ events/Program.h	2012-04-07 14:08:43.000000000 -0400
@@ -42,7 +42,7 @@
 	virtual Event *Dup(void) const {return (new ProgramEvent(*this));}
 
 	virtual EventType GetType(void) const {return (PROGRAM);}
-	virtual char *GetTypeStr(void) const {return ("ProgramEvent");}
+	virtual const char *GetTypeStr(void) const {return ("ProgramEvent");}
 	virtual char *GetEventStr(void) const;
 	int GetValue(void) const {
 		if (GetWildcard(wc_value))
--- events/SysEx.cxx	1996-07-28 15:09:30.000000000 -0400
+++ events/SysEx.cxx	2012-04-07 15:44:56.000000000 -0400
@@ -81,7 +81,7 @@
 SystemExclusiveEvent::~SystemExclusiveEvent()
 {
 
-	delete data;
+	delete[] data;
 }
 
 void
@@ -89,7 +89,7 @@
 {
 
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if (len == WC_LENGTH || dat == WC_DATA) {
 		SetWildcard(wc_data);
 		data = 0;
@@ -107,7 +107,7 @@
 
 	(Event)*this = (Event)e;
 	if (data != 0)
-		delete data;
+		delete[] data;
 	continued = e.continued;
 	length = e.length;
 	if (e.GetWildcard(wc_data)) {
@@ -148,7 +148,7 @@
 	const unsigned char *ptr;
 
 	if (data != 0)
-		delete data;
+		delete[] data;
 	if ((length = t.GetVarValue()) == -1)
 		return ("Incomplete SystemExclusiveEvent - bad length");
 	data = new unsigned char[length];
--- events/SysEx.h	1996-02-18 19:58:22.000000000 -0500
+++ events/SysEx.h	2012-04-07 14:08:43.000000000 -0400
@@ -46,7 +46,7 @@
 	     {return (new SystemExclusiveEvent(*this));}
 
 	virtual EventType GetType(void) const {return (SYSTEMEXCLUSIVE);}
-	virtual char *GetTypeStr(void) const {return ("SystemExclusiveEvent");}
+	virtual const char *GetTypeStr(void) const {return ("SystemExclusiveEvent");}
 	virtual char *GetEventStr(void) const;
 	const unsigned char *GetData(void) const {
 		if (GetWildcard(wc_data))
--- smf/SMFUtils.cxx	1996-08-04 23:47:36.000000000 -0400
+++ smf/SMFUtils.cxx	2012-04-07 14:08:43.000000000 -0400
@@ -59,7 +59,7 @@
 }
 
 long
-MWrite(int fd, char *data, long len)
+MWrite(int fd, const char *data, long len)
 {
 	int num_written;
 	int total_written;
@@ -96,7 +96,7 @@
 }
 
 long
-MWrite(Tcl_Channel channel, char *data, long len)
+MWrite(Tcl_Channel channel, const char *data, long len)
 {
 	int num_written;
 	int total_written;
@@ -116,7 +116,7 @@
 
 
 long
-VarToFix(unsigned char *var, int *len)
+VarToFix(const unsigned char *var, int *len)
 {
 	long fix;
 
--- smf/SMFUtils.h	1996-08-04 23:47:36.000000000 -0400
+++ smf/SMFUtils.h	2012-04-07 14:08:43.000000000 -0400
@@ -147,9 +147,9 @@
 
 
 extern long MRead(int fd, char *data, long len);
-extern long MWrite(int fd, char *data, long len);
+extern long MWrite(int fd, const char *data, long len);
 extern long MRead(Tcl_Channel channel, char *data, long len);
-extern long MWrite(Tcl_Channel channel, char *data, long len);
-extern long VarToFix(unsigned char *var, int *len);
+extern long MWrite(Tcl_Channel channel, const char *data, long len);
+extern long VarToFix(const unsigned char *var, int *len);
 extern int FixToVar(long fix, unsigned char *var);
 #endif
--- song/Song.cxx	1996-08-04 23:47:39.000000000 -0400
+++ song/Song.cxx	2012-04-11 01:02:09.000000000 -0400
@@ -51,7 +51,7 @@
 	}
 	for (i = 0; i < s.num_tracks; i++) {
 		tracks[i] = new EventTree(*s.tracks[i]);
-		assert(tracks[1] != 0);
+		assert(tracks[i] != 0);
 	}
 }
 
@@ -102,7 +102,7 @@
 
 	for (i = 0; i < num_tracks; i++)
 		delete tracks[i];
-	delete tracks;
+	delete[] tracks;
 }
 
 Event *
--- tclmEvnt.cxx	1996-07-29 20:14:11.000000000 -0400
+++ tclmEvnt.cxx	2012-04-07 15:42:14.000000000 -0400
@@ -44,6 +44,9 @@
 #include "tclmidi.h"
 #include "tclmEvnt.h"
 
+#define SET_CONST_RESULT(string)	\
+	Tcl_SetResult(interp, (char *)(void *)string, TCL_STATIC)
+
 void
 Tclm_PrintEvent(ostream &buf, Event *e)
 {
@@ -148,7 +151,7 @@
 		buf << "* " << str << ends;
 	else
 		buf << e->GetTime() << " " << str << ends;
-	delete str;
+	delete[] str;
 }
 
 char *
@@ -552,13 +555,9 @@
 }
 
 char *
-Tclm_PrintMetaEndOfTrack(MetaEndOfTrackEvent *e)
+Tclm_PrintMetaEndOfTrack(MetaEndOfTrackEvent *)
 {
 	ostrstream buf;
-	MetaEndOfTrackEvent *dummy;
-
-	// shut up a warning
-	dummy = e;
 
 	buf << "MetaEndOfTrack" << ends;
 	return (buf.str());
@@ -722,11 +721,11 @@
 }
 
 Event *
-Tclm_ParseEvent(Tcl_Interp *interp, char *str)
+Tclm_ParseEvent(Tcl_Interp *interp, const char *str)
 {
 	Event *event;
-	Event *(*pfunc)(Tcl_Interp *, long, int, char **);
-	char **argv, **aptr;;
+	Event *(*pfunc)(Tcl_Interp *, long, int, const char **);
+	const char **argv, **aptr;
 	char *name;
 	long time;
 	int argc, i, length;
@@ -852,18 +851,19 @@
 	}
 	event = pfunc(interp, time, argc, argv);
 	Tcl_Ckfree((char *)aptr);
-	delete name;
+	delete[] name;
 	return (event);
 }
 
 Event *
-Tclm_ParseNoteOff(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseNoteOff(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int channel, pitch, velocity;
 
 	if (argc != 3 && argc != 4) {
-		Tcl_SetResult(interp, "bad event: should be \"time NoteOff "
-		    "channel pitch ?velocity?\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time NoteOff "
+		    "channel pitch ?velocity?\"");
 		return (0);
 	}
 
@@ -886,13 +886,14 @@
 }
 
 Event *
-Tclm_ParseNoteOn(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseNoteOn(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int channel, pitch, velocity;
 
 	if (argc != 4) {
-		Tcl_SetResult(interp, "bad event: should be \"time NoteOn "
-		    "channel pitch velocity\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time NoteOn "
+		    "channel pitch velocity\"");
 		return (0);
 	}
 
@@ -913,7 +914,8 @@
 }
 
 Event *
-Tclm_ParseNote(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseNote(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	NoteOnEvent *event;
 	NoteOffEvent *off;
@@ -921,8 +923,8 @@
 	int channel, pitch, velocity;
 
 	if (argc != 5) {
-		Tcl_SetResult(interp, "bad event: should be \"time Note "
-		    "channel pitch velocity duration\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time Note "
+		    "channel pitch velocity duration\"");
 		return (0);
 	}
 
@@ -964,13 +966,14 @@
 }
 
 Event *
-Tclm_ParseKeyPressure(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseKeyPressure(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int channel, pitch, pressure;
 
 	if (argc != 4) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time KeyPressure channel pitch pressure\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time KeyPressure channel pitch pressure\"");
 		return (0);
 	}
 
@@ -991,13 +994,14 @@
 }
 
 Event *
-Tclm_ParseParameter(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseParameter(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int channel, parameter, value;
 
 	if (argc != 4) {
-		Tcl_SetResult(interp, "bad event: should be \"time Parameter "
-		    "channel parameter value\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time Parameter "
+		    "channel parameter value\"");
 		return (0);
 	}
 
@@ -1018,13 +1022,14 @@
 }
 
 Event *
-Tclm_ParseProgram(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseProgram(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int channel, value;
 
 	if (argc != 3) {
-		Tcl_SetResult(interp, "bad event: should be \"time Program "
-		    "channel value\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time Program "
+		    "channel value\"");
 		return (0);
 	}
 
@@ -1041,13 +1046,14 @@
 }
 
 Event *
-Tclm_ParseChannelPressure(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseChannelPressure(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int channel, pressure;
 
 	if (argc != 3) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time ChannelPressure channel pressure\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time ChannelPressure channel pressure\"");
 		return (0);
 	}
 
@@ -1064,14 +1070,15 @@
 }
 
 Event *
-Tclm_ParsePitchWheel(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParsePitchWheel(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int channel;
 	long value;
 
 	if (argc != 3) {
-		Tcl_SetResult(interp, "bad event: should be \"time PitchWheel "
-		    "channel value\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time PitchWheel "
+		    "channel value\"");
 		return (0);
 	}
 
@@ -1088,19 +1095,19 @@
 }
 
 Event *
-Tclm_ParseSystemExclusive(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseSystemExclusive(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
-	char **str;
+	const char **str;
 	SystemExclusiveEvent *event;
 	unsigned char *data;
-	long len;
+	int len;
 	int i, val;
 
 	if ((argc != 2 && argc != 3) || (argc == 3 && strncmp(argv[1], "cont",
 	    4) != 0)) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time SystemExclusive ?continued? {data ?data ...?}\"",
-		    TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time SystemExclusive ?continued? {data ?data ...?}\"");
 		return (0);
 	}
 
@@ -1111,7 +1118,7 @@
 			event = new SystemExclusiveEvent(time, data, len);
 			return (event);
 		}
-		if (Tcl_SplitList(interp, argv[1], (int *)&len, &str) != TCL_OK)
+		if (Tcl_SplitList(interp, argv[1], &len, &str) != TCL_OK)
 			return (0);
 	} else {
 		if (strcmp(argv[2], "*") == 0) {
@@ -1121,7 +1128,7 @@
 			event->SetContinued(1);
 			return (event);
 		}
-		if (Tcl_SplitList(interp, argv[2], (int *)&len, &str) != TCL_OK)
+		if (Tcl_SplitList(interp, argv[2], &len, &str) != TCL_OK)
 			return (0);
 	}
 
@@ -1139,20 +1146,20 @@
 	event = new SystemExclusiveEvent(time, data, len);
 	if (argc == 3)
 		event->SetContinued(1);
-	delete data;
+	delete[] data;
 
 	return (event);
 }
 
 Event *
 Tclm_ParseMetaSequenceNumber(Tcl_Interp *interp, long time, int argc,
-    char **argv)
+    const char **argv)
 {
 	long num;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaSequenceNumber number\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaSequenceNumber number\"");
 		return (0);
 	}
 
@@ -1165,13 +1172,14 @@
 }
 
 Event *
-Tclm_ParseMetaText(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaText(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	const char *t;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaText "
-		    "string\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaText "
+		    "string\"");
 		return (0);
 	}
 	if (strcmp(argv[1], "*") == 0)
@@ -1183,13 +1191,14 @@
 }
 
 Event *
-Tclm_ParseMetaCopyright(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaCopyright(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	const char *t;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaCopyright string\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaCopyright string\"");
 		return (0);
 	}
 
@@ -1203,13 +1212,13 @@
 
 Event *
 Tclm_ParseMetaSequenceName(Tcl_Interp *interp, long time, int argc,
-    char **argv)
+    const char **argv)
 {
 	const char *t;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaSequenceName string\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaSequenceName string\"");
 		return (0);
 	}
 
@@ -1223,13 +1232,13 @@
 
 Event *
 Tclm_ParseMetaInstrumentName(Tcl_Interp *interp, long time, int argc,
-    char **argv)
+    const char **argv)
 {
 	const char *t;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaInstrumentName string\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaInstrumentName string\"");
 		return (0);
 	}
 
@@ -1242,13 +1251,14 @@
 }
 
 Event *
-Tclm_ParseMetaLyric(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaLyric(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	const char *t;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaLyric "
-		    "string\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaLyric "
+		    "string\"");
 		return (0);
 	}
 
@@ -1261,13 +1271,14 @@
 }
 
 Event *
-Tclm_ParseMetaMarker(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaMarker(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	const char *t;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaMarker "
-		    "string\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaMarker "
+		    "string\"");
 		return (0);
 	}
 
@@ -1280,13 +1291,14 @@
 }
 
 Event *
-Tclm_ParseMetaCue(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaCue(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	const char *t;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaCue "
-		    "string\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaCue "
+		    "string\"");
 		return (0);
 	}
 
@@ -1300,17 +1312,17 @@
 
 Event *
 Tclm_ParseMetaChannelPrefix(Tcl_Interp *interp, long time, int argc,
-    char **argv)
+    const char **argv)
 {
-	char **str;
+	const char **str;
 	MetaChannelPrefixEvent *event;
 	unsigned char *data;
-	long len;
+	int len;
 	int i, val;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaChannelPrefix {data ?data ...?}\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaChannelPrefix {data ?data ...?}\"");
 		return (0);
 	}
 
@@ -1319,7 +1331,7 @@
 		len = MetaChannelPrefixEvent::WC_LENGTH;
 		return (new MetaChannelPrefixEvent(time, data, len));
 	}
-	if (Tcl_SplitList(interp, argv[1], (int *)&len, &str) != TCL_OK)
+	if (Tcl_SplitList(interp, argv[1], &len, &str) != TCL_OK)
 		return (0);
 
 	data = new unsigned char[len];
@@ -1334,19 +1346,20 @@
 
 	Tcl_Ckfree((char *)str);
 	event = new MetaChannelPrefixEvent(time, data, len);
-	delete data;
+	delete[] data;
 
 	return (event);
 }
 
 Event *
-Tclm_ParseMetaPortNumber(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaPortNumber(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int port;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaPortNumber port\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaPortNumber port\"");
 		return (0);
 	}
 
@@ -1359,16 +1372,13 @@
 }
 
 Event *
-Tclm_ParseMetaEndOfTrack(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaEndOfTrack(Tcl_Interp *interp, long time, int argc,
+    const char **)
 {
-	char *dummy;
-
-	// shut up a warning
-	dummy = argv[0];
 
 	if (argc != 1) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaEndOfTrack\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaEndOfTrack\"");
 		return (0);
 	}
 
@@ -1376,13 +1386,14 @@
 }
 
 Event *
-Tclm_ParseMetaTempo(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaTempo(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int tempo;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaTempo "
-		    "tempo\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaTempo "
+		    "tempo\"");
 		return (0);
 	}
 
@@ -1395,13 +1406,14 @@
 }
 
 Event *
-Tclm_ParseMetaSMPTE(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaSMPTE(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int hour, minute, second, frame, fractional_frame;
 
 	if (argc != 6) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaSMPTE "
-		    "hour minute second frame fractional_frame\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaSMPTE "
+		    "hour minute second frame fractional_frame\"");
 		return (0);
 	}
 
@@ -1431,14 +1443,14 @@
 }
 
 Event *
-Tclm_ParseMetaTime(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaTime(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	int numerator, denominator, clocks, thirty_seconds;
 
 	if (argc != 5) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaTime "
-		    "numerator denominator clocks/beat 32nds/quarter\"",
-		    TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaTime "
+		    "numerator denominator clocks/beat 32nds/quarter\"");
 		return (0);
 	}
 
@@ -1464,15 +1476,16 @@
 }
 
 Event *
-Tclm_ParseMetaKey(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaKey(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
 	Key key;
 	Mode mode;
 	int match;
 
 	if (argc != 3) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaKey "
-		    "key mode\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaKey "
+		    "key mode\"");
 		return (0);
 	}
 
@@ -1500,18 +1513,17 @@
 
 Event *
 Tclm_ParseMetaSequencerSpecific(Tcl_Interp *interp, long time, int argc,
-    char **argv)
+    const char **argv)
 {
-	char **str;
+	const char **str;
 	MetaSequencerSpecificEvent *event;
 	unsigned char *data;
-	long len;
+	int len;
 	int i, val;
 
 	if (argc != 2) {
-		Tcl_SetResult(interp, "bad event: should be "
-		    "\"time MetaSequencerSpecific {data ?data ...?}\"",
-		    TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be "
+		    "\"time MetaSequencerSpecific {data ?data ...?}\"");
 		return (0);
 	}
 
@@ -1520,7 +1532,7 @@
 		len = MetaSequencerSpecificEvent::WC_LENGTH;
 		return (new MetaSequencerSpecificEvent(time, data, len));
 	}
-	if (Tcl_SplitList(interp, argv[1], (int *)&len, &str) != TCL_OK)
+	if (Tcl_SplitList(interp, argv[1], &len, &str) != TCL_OK)
 		return (0);
 
 	data = new unsigned char[len];
@@ -1535,23 +1547,24 @@
 
 	Tcl_Ckfree((char *)str);
 	event = new MetaSequencerSpecificEvent(time, data, len);
-	delete data;
+	delete[] data;
 
 	return (event);
 }
 
 Event *
-Tclm_ParseMetaUnknown(Tcl_Interp *interp, long time, int argc, char **argv)
+Tclm_ParseMetaUnknown(Tcl_Interp *interp, long time, int argc,
+    const char **argv)
 {
-	char **str;
+	const char **str;
 	MetaUnknownEvent *event;
 	unsigned char *data;
-	long len;
+	int len;
 	int i, type, val;
 
 	if (argc != 3) {
-		Tcl_SetResult(interp, "bad event: should be \"time MetaUnknown "
-		    "type {data ?data ...?}\"", TCL_STATIC);
+		SET_CONST_RESULT("bad event: should be \"time MetaUnknown "
+		    "type {data ?data ...?}\"");
 		return (0);
 	}
 
@@ -1565,7 +1578,7 @@
 		len = MetaUnknownEvent::WC_LENGTH;
 		return (new MetaUnknownEvent(time, data, len, type));
 	}
-	if (Tcl_SplitList(interp, argv[2], (int *)&len, &str) != TCL_OK)
+	if (Tcl_SplitList(interp, argv[2], &len, &str) != TCL_OK)
 		return (0);
 
 	data = new unsigned char[len];
@@ -1580,7 +1593,7 @@
 
 	Tcl_Ckfree((char *)str);
 	event = new MetaUnknownEvent(time, data, len, type);
-	delete data;
+	delete[] data;
 
 	return (event);
 }
--- tclmEvnt.h	1996-02-12 19:25:00.000000000 -0500
+++ tclmEvnt.h	2012-04-07 14:08:43.000000000 -0400
@@ -61,57 +61,57 @@
 extern char *Tclm_PrintMetaKey(MetaKeyEvent *e);
 extern char *Tclm_PrintMetaSequencerSpecific(MetaSequencerSpecificEvent *e);
 extern char *Tclm_PrintMetaUnknown(MetaUnknownEvent *e);
-extern Event *Tclm_ParseEvent(Tcl_Interp *interp, char *str);
+extern Event *Tclm_ParseEvent(Tcl_Interp *interp, const char *str);
 extern Event *Tclm_ParseNoteOff(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseNoteOn(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseNote(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseKeyPressure(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseParameter(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseProgram(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseChannelPressure(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParsePitchWheel(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseSystemExclusive(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaSequenceNumber(Tcl_Interp *interp, long time,
-    int argc, char **argv);
+    int argc, const char **argv);
 extern Event *Tclm_ParseMetaText(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaCopyright(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaSequenceName(Tcl_Interp *interp, long time,
-    int argc, char **argv);
+    int argc, const char **argv);
 extern Event *Tclm_ParseMetaInstrumentName(Tcl_Interp *interp, long time,
-    int argc, char **argv);
+    int argc, const char **argv);
 extern Event *Tclm_ParseMetaLyric(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaMarker(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaCue(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaChannelPrefix(Tcl_Interp *interp, long time,
-    int argc, char **argv);
+    int argc, const char **argv);
 extern Event *Tclm_ParseMetaPortNumber(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaEndOfTrack(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaTempo(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaSMPTE(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaTime(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaKey(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 extern Event *Tclm_ParseMetaSequencerSpecific(Tcl_Interp *interp, long time,
-    int argc, char **argv);
+    int argc, const char **argv);
 extern Event *Tclm_ParseMetaUnknown(Tcl_Interp *interp, long time, int argc,
-    char **argv);
+    const char **argv);
 #endif
--- tclmPtch.cxx	1996-08-04 23:47:13.000000000 -0400
+++ tclmPtch.cxx	2012-04-07 14:08:43.000000000 -0400
@@ -37,10 +37,8 @@
 #include "tclmidi.h"
 #include "TclmIntp.h"
 
-static int Tclm_PatchRead(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_PatchFree(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
+static Tcl_CmdProc Tclm_PatchRead;
+static Tcl_CmdProc Tclm_PatchFree;
 
 int
 Tclm_PatchInit(Tcl_Interp *interp, TclmInterp *tclm_interp)
@@ -53,7 +51,7 @@
 
 int
 Tclm_PatchRead(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	Tcl_Channel channel;
 	int mode;
@@ -96,7 +94,7 @@
 
 int
 Tclm_PatchFree(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 
--- song/EvntTree.cxx.orig	1996-08-05 05:47:38.000000000 +0200
+++ song/EvntTree.cxx	2013-05-14 11:22:45.000000000 +0200
@@ -611,7 +611,7 @@
 					for (j = 0; j < num_found; j++)
 						new_found[j] = found[j];
 					new_found[j] = e;
-					delete found;
+					delete[] found;
 					found = new_found;
 					num_found++;
 				}
@@ -631,7 +631,7 @@
 					for (j = 0; j < num_found; j++)
 						new_found[j] = found[j];
 					new_found[j] = e;
-					delete found;
+					delete[] found;
 					found = new_found;
 					num_found++;
 				}
@@ -735,6 +735,7 @@
 		assert(new_event != 0);
 		place = rb_insert_b(place, (char *)time, (char *)new_event);
 	}
+
 	curr_event = new_event;
 	new_event->SetEventTreeNode(place);
 	return (new_event);
@@ -746,7 +747,7 @@
 	Event *e, *events, *prev;
 	EventTreeNode *n, *next_n;
 
-	n = (EventTreeNode *)event.GetEventTreeNode();
+	n = event.GetEventTreeNode();
 	if (n != 0) {
 		e = &event;
 		prev = e->GetPrevEvent();
@@ -785,6 +786,9 @@
 			}
 			
 		}
+		if (e->GetNextEvent() == 0 ||
+		    (prev && prev->GetEventTreeNode() != n))
+			rb_delete_node(n);
 	} else {
 		// This is the only event in the node
 		if (curr_event == e) {
@@ -818,7 +822,7 @@
 	/* get each event in order and delete it */
 	while ((e = NextEvent()) != 0)
 		DeleteEvent(*e);
-		
+
 	/* then free head */
 	free(head);
 	head = 0;
--- tclmPlay.cxx.orig	1996-08-05 05:47:12.000000000 +0200
+++ tclmPlay.cxx	2013-06-05 15:46:23.000000000 +0200
@@ -43,30 +43,24 @@
 #include "TclmDr75.h"
 #endif
 
+#define SET_CONST_RESULT(string)	\
+	Tcl_SetResult(interp, (char *)(void *)string, TCL_STATIC)
+
 #if defined(HAVE_SYS_MIDIIOCTL_H)
 static const int DeviceConfigured = 1;
 #else
 static const int DeviceConfigured = 0;
 #endif
 
-static int Tclm_MidiPlay(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiRecord(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiStop(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiWait(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiDevice(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiTime(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiFeature(ClientData client_data, Tcl_Interp *interp,
-    int argc, char **argv);
-static int Tclm_MidiSend(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiRecv(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
+static Tcl_CmdProc Tclm_MidiPlay;
+static Tcl_CmdProc Tclm_MidiRecord;
+static Tcl_CmdProc Tclm_MidiStop;
+static Tcl_CmdProc Tclm_MidiWait;
+static Tcl_CmdProc Tclm_MidiDevice;
+static Tcl_CmdProc Tclm_MidiTime;
+static Tcl_CmdProc Tclm_MidiFeature;
+static Tcl_CmdProc Tclm_MidiSend;
+static Tcl_CmdProc Tclm_MidiRecv;
 
 int
 Tclm_PlayInit(Tcl_Interp *interp, TclmInterp *tclm_interp)
@@ -89,7 +83,7 @@
 
 int
 Tclm_MidiPlay(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *song;
@@ -130,13 +124,13 @@
 		    dev->GetError(), 0);
 		return (TCL_ERROR);
 	}
-	Tcl_SetResult(interp, "1", TCL_STATIC);
+	SET_CONST_RESULT("1");
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiRecord(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *rsong, *psong;
@@ -185,13 +179,13 @@
 		    dev->GetError(), 0);
 		return (TCL_ERROR);
 	}
-	Tcl_SetResult(interp, "1", TCL_STATIC);
+	SET_CONST_RESULT("1");
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiStop(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	MidiDevice *dev;
@@ -214,13 +208,13 @@
 		    dev->GetError(), 0);
 		return (TCL_ERROR);
 	}
-	Tcl_SetResult(interp, "1", TCL_STATIC);
+	SET_CONST_RESULT("1");
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiWait(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	MidiDevice *dev;
@@ -241,19 +235,20 @@
 		    "to stop\n", dev->GetError(), 0);
 		return (TCL_ERROR);
 	}
-	Tcl_SetResult(interp, "1", TCL_STATIC);
+	SET_CONST_RESULT("1");
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiDevice(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	MidiDevice *dev;
 	ostrstream *buf;
 	unsigned short mask;
-	char *dev_key, *str, **sub_argv;
+	const char *dev_key, **sub_argv;
+	char *str;
 	int con, i, imask, j, mt, sub_argc, value;
 
 	tclm_interp = (TclmInterp *)client_data;
@@ -293,7 +288,7 @@
 		dev = 0;
 #endif
 		if (dev == 0) {
-			Tcl_SetResult(interp, "Out of memory", TCL_STATIC);
+			SET_CONST_RESULT("Out of memory");
 			return (TCL_ERROR);
 		}
 		if (!dev->Open(argv[1])) {
@@ -303,8 +298,7 @@
 		}
 		dev_key = tclm_interp->AddDevice(dev);
 		if (dev_key == 0) {
-			Tcl_SetResult(interp, "Couldn't add device",
-			    TCL_STATIC);
+			SET_CONST_RESULT("Couldn't add device");
 			return (TCL_ERROR);
 		}
 		Tcl_AppendResult(interp, dev_key, 0);
@@ -317,13 +311,13 @@
 			return (TCL_ERROR);
 		if (strcmp(sub_argv[0], "close") == 0) {
 			if (i != argc - 1) {
-				Tcl_SetResult(interp, "Can't perform ops after "
-				    "closing device", TCL_STATIC);
+				SET_CONST_RESULT("Can't perform ops after "
+				    "closing device");
 				return (TCL_ERROR);
 			}
 			if (dev_key == 0) {
-				Tcl_SetResult(interp, "Can't close until after "
-				    "device has been opened", TCL_STATIC);
+				SET_CONST_RESULT("Can't close until after "
+				    "device has been opened");
 				return (TCL_ERROR);
 			}
 			tclm_interp->DeleteDevice(dev_key);
@@ -465,7 +459,7 @@
 
 int
 Tclm_MidiTime(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	ostrstream tbuf;
 	unsigned long t;
@@ -498,11 +492,11 @@
 
 int
 Tclm_MidiFeature(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	MidiDevice *dev;
-	char **sub_argv;
+	const char **sub_argv;
 	int i, sub_argc;
 
 	if (argc < 3) {
@@ -542,7 +536,7 @@
 
 int
 Tclm_MidiSend(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	MidiDevice *dev;
@@ -564,7 +558,7 @@
 
 	events = new Event *[argc - 2];
 	if (events == 0) {
-		Tcl_SetResult(interp, "Out of memory", TCL_STATIC);
+		SET_CONST_RESULT("Out of memory");
 		return (TCL_ERROR);
 	}
 	num_events = 0;
@@ -584,9 +578,8 @@
 				num_events++;
 			}
 		} else {
-			if (strlen(interp->result) == 0) {
-				Tcl_SetResult(interp, "Out of memory",
-				    TCL_STATIC);
+			if (strlen(Tcl_GetStringResult(interp)) == 0) {
+				SET_CONST_RESULT("Out of memory");
 				return (TCL_ERROR);
 			}
 		}
@@ -603,7 +596,7 @@
 
 int
 Tclm_MidiRecv(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	ostrstream *buf;
 	TclmInterp *tclm_interp;
--- tclmCmd.cxx.orig	1996-08-05 05:47:12.000000000 +0200
+++ tclmCmd.cxx	2013-06-05 15:46:37.000000000 +0200
@@ -41,39 +41,27 @@
 #include "tclmEvnt.h"
 #include "patchlvl.h"
 
-static int Tclm_MidiMake(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiFree(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiRead(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiWrite(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiConfig(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiRewind(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiGet(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiPut(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiDelete(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiMerge(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiSplit(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiCopy(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv);
-static int Tclm_MidiVersion(ClientData client_data, Tcl_Interp *interp,
-    int argc, char **argv);
-static int Tclm_MidiTrack(ClientData client_data, Tcl_Interp *interp,
-    int argc, char **argv);
-static int Tclm_MidiGrep(ClientData client_data, Tcl_Interp *interp,
-    int argc, char **argv);
+static Tcl_CmdProc Tclm_MidiMake;
+static Tcl_CmdProc Tclm_MidiFree;
+static Tcl_CmdProc Tclm_MidiRead;
+static Tcl_CmdProc Tclm_MidiWrite;
+static Tcl_CmdProc Tclm_MidiConfig;
+static Tcl_CmdProc Tclm_MidiRewind;
+static Tcl_CmdProc Tclm_MidiGet;
+static Tcl_CmdProc Tclm_MidiPut;
+static Tcl_CmdProc Tclm_MidiDelete;
+static Tcl_CmdProc Tclm_MidiMerge;
+static Tcl_CmdProc Tclm_MidiSplit;
+static Tcl_CmdProc Tclm_MidiCopy;
+static Tcl_CmdProc Tclm_MidiVersion;
+static Tcl_CmdProc Tclm_MidiTrack;
+static Tcl_CmdProc Tclm_MidiGrep;
 static int Tclm_GetTrack(TclmInterp *tclm_interp, Tcl_Interp *interp,
     const char *str, Song **song, int *track);
 
+#define SET_CONST_RESULT(string)	\
+	Tcl_SetResult(interp, (char *)(void *)string, TCL_STATIC)
+
 
 /*
  * DllEntryPoint --
@@ -98,8 +86,7 @@
 
 	ti = new TclmInterp;
 	if (ti == 0) {
-		Tcl_SetResult(interp, "Out of memory in Tclmidi_Init",
-		    TCL_STATIC);
+		SET_CONST_RESULT("Out of memory in Tclmidi_Init");
 		return (TCL_ERROR);
 	}
 	Tcl_CreateCommand(interp, "midimake", Tclm_MidiMake, ti, 0);
@@ -129,7 +116,7 @@
 
 int
 Tclm_MidiMake(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *s;
@@ -145,13 +132,13 @@
 	s = new Song;
 	key = tclm_interp->AddSong(s);
 	Tcl_SetResult(interp, key, TCL_VOLATILE);
-	delete key;
+	delete[] key;
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiFree(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 
@@ -171,7 +158,7 @@
 
 int
 Tclm_MidiRead(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	Tcl_Channel channel;
 	int mode;
@@ -211,7 +198,7 @@
 
 int
 Tclm_MidiWrite(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *song;
@@ -250,12 +237,13 @@
 
 int
 Tclm_MidiConfig(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	ostrstream *buf;
 	TclmInterp *tclm_interp;
 	Song *song;
-	char *str, **sub_argv;
+	char *str;
+	const char **sub_argv;
 	int i, sub_argc, value;
 
 	if (argc < 2) {
@@ -338,8 +326,8 @@
 			}
 			break;
 		default:
-			Tcl_SetResult(interp, "wrong # args: should be "
-			    "{format|division|tracks ?value?}", TCL_STATIC);
+			SET_CONST_RESULT("wrong # args: should be "
+			    "{format|division|tracks ?value?}");
 			return (TCL_ERROR);
 			break;
 		}
@@ -350,7 +338,7 @@
 
 int
 Tclm_MidiRewind(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *song;
@@ -380,7 +368,7 @@
 
 int
 Tclm_MidiGet(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	ostrstream *buf;
 	long time;
@@ -421,7 +409,7 @@
 		printable = 0;
 		while (!printable) {
 			if ((e = song->NextEvent(track)) == 0) {
-				Tcl_SetResult(interp, "EOT", TCL_STATIC);
+				SET_CONST_RESULT("EOT");
 				printable = 1;
 			} else {
 				buf = new ostrstream;
@@ -432,7 +420,7 @@
 					    TCL_VOLATILE);
 					printable = 1;
 				}
-				delete str;
+				delete[] str;
 				delete buf;
 			}
 		}
@@ -440,7 +428,7 @@
 		printable = 0;
 		while (!printable) {
 			if ((e = song->PrevEvent(track)) == 0) {
-				Tcl_SetResult(interp, "EOT", TCL_STATIC);
+				SET_CONST_RESULT("EOT");
 				printable = 1;
 			} else {
 				buf = new ostrstream;
@@ -459,7 +447,7 @@
 		if (Tcl_GetLong(interp, argv[3], &time) != TCL_OK)
 			return (TCL_ERROR);
 		if ((events = song->GetEvents((short)track, time)) == 0)
-			Tcl_SetResult(interp, "EOT", TCL_STATIC);
+			SET_CONST_RESULT("EOT");
 		else {
 			for (e = events; e != 0; e = e->GetNextEvent()) {
 				buf = new ostrstream;
@@ -477,7 +465,7 @@
 
 int
 Tclm_MidiPut(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *song;
@@ -513,18 +501,17 @@
 	}
 
 	if ((event = Tclm_ParseEvent(interp, argv[3])) == 0) {
-		if (strlen(interp->result) == 0)
-			Tcl_SetResult(interp, "No more memory", TCL_STATIC);
+		if (strlen(Tcl_GetStringResult(interp)) == 0)
+			SET_CONST_RESULT("No more memory");
 		return (TCL_ERROR);
 	}
 	if (event->IsWildcard()) {
-		Tcl_SetResult(interp, "Can't put wildcard events in a song",
-		    TCL_STATIC);
+		SET_CONST_RESULT("Can't put wildcard events in a song");
 		return (TCL_ERROR);
 	}
 	new_e1 = song->PutEvent(track, *event);
 	if (new_e1 == 0) {
-		Tcl_SetResult(interp, "Couldn't put event", TCL_STATIC);
+		SET_CONST_RESULT("Couldn't put event");
 		return (TCL_ERROR);
 	}
 	// check to see if it has a note off too
@@ -534,8 +521,7 @@
 	if (np != 0) {
 		new_e2 = (NoteEvent *)song->PutEvent(track, *np);
 		if (new_e2 == 0) {
-			Tcl_SetResult(interp, "Couldn't put event",
-			    TCL_STATIC);
+			SET_CONST_RESULT("Couldn't put event");
 			return (TCL_ERROR);
 		}
 		((NoteEvent *)new_e1)->SetNotePair(new_e2);
@@ -549,7 +535,7 @@
 
 int
 Tclm_MidiDelete(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *song;
@@ -592,17 +578,16 @@
 		if (Tcl_GetLong(interp, argv[5], (long *)&end) != TCL_OK)
 			return (TCL_ERROR);
 		if (!song->DeleteRange(track, start, end)) {
-			Tcl_SetResult(interp, "couldn't delete range",
-			    TCL_STATIC);
+			SET_CONST_RESULT("couldn't delete range");
 			return (TCL_ERROR);
 		}
-		Tcl_SetResult(interp, "1", TCL_STATIC);
+		SET_CONST_RESULT("1");
 		return (TCL_OK);
 	}
 
 	if ((event = Tclm_ParseEvent(interp, argv[3])) == 0) {
-		if (strlen(interp->result) == 0)
-			Tcl_SetResult(interp, "No more memory", TCL_STATIC);
+		if (strlen(Tcl_GetStringResult(interp)) == 0)
+			SET_CONST_RESULT("No more memory");
 		return (TCL_ERROR);
 	}
 	// If this is a NoteOn/NoteOff pair, get real NoteOff from tree
@@ -616,7 +601,7 @@
 		for (e = events; e != 0 && !(*event == *e);
 		    e = e->GetNextEvent());
 		if (e == 0) {
-			Tcl_SetResult(interp, "0", TCL_STATIC);
+			SET_CONST_RESULT("0");
 			delete ((NoteEvent *)event)->GetNotePair();
 			delete event;
 			return (TCL_OK);
@@ -625,7 +610,7 @@
 		// find real NoteOff pair and delete it
 		note_off = ((NoteEvent *)e)->GetNotePair();
 		if (!song->DeleteEvent(track, *note_off)) {
-			Tcl_SetResult(interp, "0", TCL_STATIC);
+			SET_CONST_RESULT("0");
 			delete ((NoteEvent *)event)->GetNotePair();
 			delete event;
 			return (TCL_OK);
@@ -633,7 +618,7 @@
 		delete ((NoteEvent *)event)->GetNotePair();
 	}
 	if (!song->DeleteEvent(track, *event)) {
-		Tcl_SetResult(interp, "0", TCL_STATIC);
+		SET_CONST_RESULT("0");
 		if (event->GetType() == NOTEON &&
 		   ((NoteEvent *)event)->GetNotePair() != 0)
 			delete ((NoteEvent *)event)->GetNotePair();
@@ -641,13 +626,13 @@
 		return (TCL_OK);
 	}
 	delete event;
-	Tcl_SetResult(interp, "1", TCL_STATIC);
+	SET_CONST_RESULT("1");
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiMerge(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *dest_song, *src_song;
@@ -680,7 +665,7 @@
 
 int
 Tclm_MidiSplit(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *src_song, *meta_song, *normal_song;
@@ -715,7 +700,7 @@
 
 int
 Tclm_MidiCopy(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	EventTree *tmp_track;
@@ -748,6 +733,7 @@
 	scalar = (double)dest_song->GetDivision() / src_song->GetDivision();
 
 	tmp_track = src_song->GetRange(src_track, sstart, send);
+fprintf(stderr, "Got tmp_track as %p\n", tmp_track);
 	if (tmp_track == 0) {
 		Tcl_AppendResult(interp, "Couldn't get range from: ", argv[3],
 		    " to ", argv[4], 0);
@@ -757,20 +743,23 @@
 		if (!src_song->DeleteRange(src_track, sstart, send)) {
 			Tcl_AppendResult(interp, "Couldn't remove events "
 			    "from source track", 0);
+			delete tmp_track;
 			return (TCL_ERROR);
 		}
 	}
 	if (!dest_song->Add(dest_track, *tmp_track, dstart, scalar)) {
 		Tcl_AppendResult(interp, "Couldn't add range", 0);
+		delete tmp_track;
 		return (TCL_ERROR);
 	}
+fprintf(stderr, "Deleting tmp_track %p\n", tmp_track);
 	delete tmp_track;
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiVersion(ClientData client_data, Tcl_Interp *interp, int argc,
-    char *argv[])
+    const char *argv[])
 {
 	ClientData *dummy;
 
@@ -782,13 +771,13 @@
 		    argv[0], "\"", 0);
 		return (TCL_ERROR);
 	}
-	Tcl_SetResult(interp, (char *)TCLMIDI_VERSION, TCL_STATIC);
+	SET_CONST_RESULT(TCLMIDI_VERSION);
 	return (TCL_OK);
 }
 
 int
 Tclm_MidiTrack(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *song;
@@ -848,7 +837,7 @@
 
 int
 Tclm_MidiGrep(ClientData client_data, Tcl_Interp *interp, int argc,
-    char **argv)
+    const char **argv)
 {
 	TclmInterp *tclm_interp;
 	Song *song;
@@ -857,6 +846,7 @@
 	NoteEvent *np;
 	ostrstream *buf;
 	char *str;
+	int result;
 
 	if (argc < 4) {
 		Tcl_AppendResult(interp, "wrong # args: should be \"",
@@ -888,16 +878,15 @@
 	num_events = argc - 3;
 	events = new Event *[num_events];
 	if (events == 0) {
-		Tcl_SetResult(interp, "No more memory", TCL_STATIC);
+		SET_CONST_RESULT("No more memory");
 		return (TCL_ERROR);
 	}
 	for (i = 0; i < num_events; i++) {
 		// parse events
 		events[i] = Tclm_ParseEvent(interp, argv[i + 3]);
 		if (events[i] == 0) {
-			if (strlen(interp->result) == 0)
-				Tcl_SetResult(interp, "No more memory",
-				    TCL_STATIC);
+			if (strlen(Tcl_GetStringResult(interp)) == 0)
+				SET_CONST_RESULT("No more memory");
 			i--;
 			for (; i >= 0; i--) {
 				if (events[i]->GetType() == NOTEON) {
@@ -913,9 +902,11 @@
 		}
 	}
 	if (!song->Grep(track, events, num_events, &matched, &num_matched)) {
-		Tcl_SetResult(interp, "midigrep failed", TCL_STATIC);
-		return (TCL_ERROR);
-	}
+		SET_CONST_RESULT("midigrep failed");
+		result = TCL_ERROR;
+	} else
+		result = TCL_OK;
+
 	for (i = 0; i < num_events; i++) {
 		if (events[i]->GetType() == NOTEON) {
 			np = ((NoteEvent *)events[i])->GetNotePair();
@@ -924,33 +915,33 @@
 		}
 		delete events[i];
 	}
-	delete events;
+	delete[] events;
 	for (i = 0; i < num_matched; i++) {
 		buf = new ostrstream;
 		Tclm_PrintEvent(*buf, matched[i]);
 		str = buf->str();
 		if (str != 0 && str[0] != '\0')
 			Tcl_AppendElement(interp, str);
-		delete str;
+		delete[] str;
 		delete buf;
 	}
-	delete matched;
+	delete[] matched;
+	return (result);
 	return (TCL_OK);
 }
 
-
 int
 Tclm_GetTrack(TclmInterp *tclm_interp, Tcl_Interp *interp, const char *str,
     Song **song, int *track)
 {
-	char **sub_argv;
+	const char **sub_argv;
 	int sub_argc;
 
-	if (Tcl_SplitList(interp, (char *)str, &sub_argc, &sub_argv) != TCL_OK)
+	if (Tcl_SplitList(interp, str, &sub_argc, &sub_argv) != TCL_OK)
 		return (TCL_ERROR);
 	if (sub_argc != 2) {
-		Tcl_SetResult(interp, "bad track designation: "
-		    "should be \"{MidiID Track}\"", TCL_STATIC);
+		SET_CONST_RESULT("bad track designation: "
+		    "should be \"{MidiID Track}\"");
 		Tcl_Ckfree((char *)sub_argv);
 		return (TCL_ERROR);
 	}
