public void Write (MidiEvent [] buffer)
		{
			Write (buffer, 0, buffer.Length);
		}
		public void Write (MidiEvent [] buffer, int index, int length)
		{
			var gch = GCHandle.Alloc (buffer);
			try {
				var ptr = Marshal.UnsafeAddrOfPinnedArrayElement (buffer, index);
				var ret = PortMidiMarshal.Pm_Write (stream, ptr, length);
				if (ret != PmError.NoError)
					throw new MidiException (ret, String.Format ("Failed to write messages : {0}", PortMidiMarshal.Pm_GetErrorText ((PmError) ret)));
			} finally {
				gch.Free ();
			}
		}
		public void Write (MidiEvent mevent)
		{
			if (mevent.Data != null)
				WriteSysEx (mevent.Timestamp, mevent.Data);
			else
				Write (mevent.Timestamp, mevent.Message);
		}