public static void ThrowExceptionForReasonCode(int reasonCode)
        {
            TeVirtualMIDIException exception = new TeVirtualMIDIException(reasonCodeToString(reasonCode));

            exception.reasonCode = reasonCode;

            throw exception;
        }
        public void shutdown()
        {
            if (!virtualMIDIShutdown(fInstance))
            {
                int lastError = Marshal.GetLastWin32Error();

                TeVirtualMIDIException.ThrowExceptionForReasonCode(lastError);
            }
        }
        public void sendCommand(byte[] command)
        {
            if ((command == null) || (command.Length == 0))
            {
                return;
            }

            if (!virtualMIDISendData(fInstance, command, (UInt32)command.Length))
            {
                int lastError = Marshal.GetLastWin32Error();
                TeVirtualMIDIException.ThrowExceptionForReasonCode(lastError);
            }
        }
        public TeVirtualMIDI(string portName, UInt32 maxSysexLength, UInt32 flags, ref Guid manufacturer, ref Guid product)
        {
            fInstance = virtualMIDICreatePortEx3(portName, IntPtr.Zero, IntPtr.Zero, maxSysexLength, flags, ref manufacturer, ref product);

            if (fInstance == IntPtr.Zero)
            {
                int lastError = Marshal.GetLastWin32Error();

                TeVirtualMIDIException.ThrowExceptionForReasonCode(lastError);
            }

            fReadBuffer     = new byte[maxSysexLength];
            fReadProcessIds = new UInt64[17];
            fMaxSysexLength = maxSysexLength;
        }
        public TeVirtualMIDI(string portName, UInt32 maxSysexLength = TE_VM_DEFAULT_SYSEX_SIZE, UInt32 flags = TE_VM_FLAGS_PARSE_RX)
        {
            fInstance = virtualMIDICreatePortEx2(portName, IntPtr.Zero, IntPtr.Zero, maxSysexLength, flags);

            if (fInstance == IntPtr.Zero)
            {
                int lastError = Marshal.GetLastWin32Error();

                TeVirtualMIDIException.ThrowExceptionForReasonCode(lastError);
            }

            fReadBuffer     = new byte[maxSysexLength];
            fReadProcessIds = new UInt64[17];
            fMaxSysexLength = maxSysexLength;
        }
        public byte[] getCommand( )
        {
            UInt32 length = fMaxSysexLength;

            if (!virtualMIDIGetData(fInstance, fReadBuffer, ref length))
            {
                int lastError = Marshal.GetLastWin32Error();
                TeVirtualMIDIException.ThrowExceptionForReasonCode(lastError);
            }

            byte[] outBytes = new byte[length];

            Array.Copy(fReadBuffer, outBytes, length);

            return(outBytes);
        }
        public UInt64[] getProcessIds( )
        {
            UInt32 length = 17 * sizeof(ulong);
            UInt32 count;

            if (!virtualMIDIGetProcesses(fInstance, fReadProcessIds, ref length))
            {
                int lastError = Marshal.GetLastWin32Error();
                TeVirtualMIDIException.ThrowExceptionForReasonCode(lastError);
            }

            count = length / sizeof(ulong);

            UInt64[] outIds = new UInt64[count];

            Array.Copy(fReadProcessIds, outIds, count);

            return(outIds);
        }