public MidiEndpoint CreateVirtualSource(string name, out MidiError statusCode)
        {
            IntPtr ptr;

            statusCode = (MidiError)CoreMidiInterop.MIDISourceCreate(Handle, Midi.CreateCFStringRef(name), out ptr);
            return(statusCode == MidiError.Ok ? new MidiEndpoint(ptr, name, true, null) : null);
        }
        public MidiPort CreateOutputPort(string name)
        {
            MIDIPortRef port;

            CoreMidiInterop.MIDIOutputPortCreate(Handle, Midi.CreateCFStringRef(name), out port);
            return(new MidiPort(port, true, null));
        }
        public MidiEndpoint CreateVirtualDestination(string name, out MidiError statusCode)
        {
            IntPtr ptr;
            var    d = new ReadDispatcher();

            statusCode = (MidiError)CoreMidiInterop.MIDIDestinationCreate(Handle, Midi.CreateCFStringRef(name),
                                                                          d.DispatchProc, IntPtr.Zero, out ptr);
            return(statusCode == MidiError.Ok ? new MidiEndpoint(ptr, name, true, d) : null);
        }
        public MidiPort CreateInputPort(string name)
        {
            MIDIPortRef port;
            var         d = new ReadDispatcher();

            CoreMidiInterop.MIDIInputPortCreate(Handle, Midi.CreateCFStringRef(name), d.DispatchProc, IntPtr.Zero, out port);
            d.Port = new MidiPort(port, true, d);
            return(d.Port);
        }
        void SetStringProp(IntPtr id, string value)
        {
            if (id == IntPtr.Zero)
            {
                return;
            }
            CFStringRef str;

            CoreMidiInterop.MIDIObjectSetStringProperty(Handle, id, Midi.CreateCFStringRef(value));
        }
        public MidiClient(string name)
        {
            IntPtr h;

            name_string = Midi.CreateCFStringRef(name);
            int ret = CoreMidiInterop.MIDIClientCreate(name_string, null, IntPtr.Zero, out h);

            if (ret != 0)
            {
                throw new MidiException($"Failed to create MIDI client for {name}: error code {ret}");
            }
            Handle = h;
        }