示例#1
0
 /// <summary>
 /// Creates a new recording session object
 /// </summary>
 /// <param name="midiInput">Expected to be injected</param>
 public RecordSession(IMidiInput midiInput, IOutput output, IVirtualKeyBoard virtualKeyboard)
 {
     _midiInput = midiInput;
     _output = output;
     _virtualKeyboard = virtualKeyboard;
     Init();
 }
示例#2
0
        public MidiBusAdapter(IEventBus eventBus, IMidiInput midiBus)
        {
            _eventBus = eventBus;
            _midiBus  = midiBus;

            _midiBus.MessageReceived += ConsumeMidiEvent;
        }
示例#3
0
 public VirtualKeyBoard(IInputEvents inputEvents, IMidiInput midiInput, ILogger logger)
 {
     _inputEvents = inputEvents;
     _midiInput   = midiInput;
     _logger      = logger;
     Initialise();
 }
示例#4
0
        public ScoreControl(IUnityContainer container, IOutput output, IMidiInput midiInput, IInputEvents inputEvents, IMediaServiceHost mediaServiceHost,
                            IVirtualKeyBoard virtualKeyboard, ILogger logger, XScore musicScore) : this()
        {
            _container        = container;
            _output           = output;
            _intputEvents     = inputEvents;
            _midiInput        = midiInput;
            _virtualKeyboard  = virtualKeyboard;
            _musicScore       = musicScore;
            _mediaServiceHost = mediaServiceHost;
            _logger           = logger;

            _updateScrollTimer = new Timer(ScrollTimerHandler, null, Timeout.Infinite, _scrollTimingPerdiod);

            _scoreParser = new ScoreParser(_musicScore, ScoreGrid);
            _scoreParser.Render();
            ScoreGrid.Width = _scoreParser.GetMaxHorizontalPosition();

            nextBarDetails          = new BarDetails();
            nextBarDetails.NoteTime = 0;
            nextBarDetails.XCoord   = 0;

            _intputEvents.MessageReceived += HandleInputEvent;

            _midiInput.StartRecording();

            ConfigureSongEventController();
        }
示例#5
0
        /// <summary>
        /// Opens a new midi device from a device name and *should* automatically close the previous connection
        /// </summary>
        /// <param name="deviceInput">Midi input device name</param>
        /// <param name="deviceOutput">Midi output device name</param>
        public void OpenMidiDevice(string deviceInput, string deviceOutput)
        {
            if (midiOutput != null)
            {
                midiOutput.CloseAsync();//Will this wait for the port to be closed or does it really matter?
            }
            if (midiInput != null)
            {
                midiInput.MessageReceived -= MidiInput_MessageReceived;
                midiInput.CloseAsync();//Will this wait for the port to be closed or does it really matter?
            }

            var access = MidiAccessManager.Default;

            try
            {
                midiOutput = access.OpenOutputAsync(deviceOutput).Result;
                midiInput  = access.OpenInputAsync(deviceInput).Result;

                midiInput.MessageReceived += MidiInput_MessageReceived;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
示例#6
0
        public ScoreControl(IUnityContainer container, IOutput output, IMidiInput midiInput, IInputEvents inputEvents, IMediaServiceHost mediaServiceHost, 
            IVirtualKeyBoard virtualKeyboard, ILogger logger, XScore musicScore)
            : this()
        {
            _container = container;
            _output = output;
            _intputEvents = inputEvents;
            _midiInput = midiInput;
            _virtualKeyboard = virtualKeyboard;
            _musicScore = musicScore;
            _mediaServiceHost = mediaServiceHost;
            _logger = logger;

            _updateScrollTimer = new Timer(ScrollTimerHandler, null, Timeout.Infinite, _scrollTimingPerdiod);

            _scoreParser = new ScoreParser(_musicScore, ScoreGrid);
            _scoreParser.Render();
            ScoreGrid.Width = _scoreParser.GetMaxHorizontalPosition();

            nextBarDetails = new BarDetails();
            nextBarDetails.NoteTime = 0;
            nextBarDetails.XCoord = 0;

            _intputEvents.MessageReceived += HandleInputEvent;

            _midiInput.StartRecording();

            ConfigureSongEventController();
        }
示例#7
0
 /// <summary>
 /// Creates a new recording session object
 /// </summary>
 /// <param name="midiInput">Expected to be injected</param>
 public RecordSession(IMidiInput midiInput, IOutput output, IVirtualKeyBoard virtualKeyboard)
 {
     _midiInput       = midiInput;
     _output          = output;
     _virtualKeyboard = virtualKeyboard;
     Init();
 }
示例#8
0
 private RawMidiClient(IMidiInput input, string inputName, IMidiOutput output, string outputName, Action <RawMidiMessage> messageHandler)
 {
     this.input             = input;
     InputName              = inputName;
     this.output            = output;
     OutputName             = outputName;
     input.MessageReceived += (sender, args) => messageHandler(ConvertMessage(args));
 }
        private void closeDevice(IMidiInput device)
        {
            device.MessageReceived -= onMidiMessageReceived;

            // some devices may take some time to close, so this should be fire-and-forget.
            // the internal implementations look to have their own (eventual) timeout logic.
            Task.Factory.StartNew(() => device.CloseAsync(), TaskCreationOptions.LongRunning);
        }
示例#10
0
 public PushPad(IMidiInput pushIn, IMidiOutput pushOut, IMidiOutput virtualOutput, PushControl pushControl)
 {
     PushControl             = pushControl;
     PushIn                  = pushIn;
     PushOut                 = pushOut;
     VirtualOut              = virtualOutput;
     PushIn.MessageReceived += OnMidiData;
 }
示例#11
0
 public PushEncoder(IMidiInput pushIn, IMidiOutput pushOut, IMidiOutput virtualOut, PushControl pushControl, int mapToCC, MidiValueStore store)
 {
     PushControl             = pushControl;
     PushIn                  = pushIn;
     PushOut                 = pushOut;
     VirtualOut              = virtualOut;
     PushIn.MessageReceived += OnMidiData;
     MappedToCC              = mapToCC;
     Store = store;
 }
示例#12
0
 internal RolandMidiClient(IMidiInput input, IMidiOutput output, string inputName, string outputName, byte rawDeviceId, ModuleIdentifier identifier)
 {
     this.input             = input;
     this.output            = output;
     input.MessageReceived += HandleMessage;
     InputName              = inputName;
     OutputName             = outputName;
     this.rawDeviceId       = rawDeviceId;
     this.Identifier        = identifier;
 }
示例#13
0
        public MidiCommunicationChannel(IMidiInput input, IMidiOutput output)
        {
            Input  = input;
            Output = output;

            InputPortDetails  = new MidiPortDetails(input.Details);
            OutputPortDetails = new MidiPortDetails(output.Details);

            Input.MessageReceived += Input_MessageReceived;
        }
示例#14
0
        public MidiInputDevice(IMidiInput midiInput)
        {
            MidiInput = midiInput;

            // Initialise these higher-level actions with empty callbacks
            MessageReceived = (MidiReceivedEventArgs e) => { };
            NoteOn          = (int noteNumber, int velocity) => { };
            NoteOff         = (int noteNumber) => { };
            ControlChange   = (int ccNumber, int value) => { };

            // And add the message routing method to the base callback
            MidiInput.MessageReceived += ProcessMessageReceived;
        }
        public LaunchPadManager(IMidiAccess access, IMidiInput input, IMidiOutput output)
        {
            if (input == null || output == null)
            {
                throw new ArgumentException("Please choose the connected Launchpad S before going further");
            }

            this.access = access;
            this.input  = input;
            this.output = output;

            StartListener();
        }
        public async Task InitAsync()
        {
            var inputs = MidiAccessManager.Default.Inputs;

            foreach (var inputDevice in inputs)
            {
                if (inputDevice.Name == "nanoKONTROL2")
                {
                    _input = await MidiAccessManager.Default.OpenInputAsync(inputDevice.Id);

                    _input.MessageReceived += Input_MessageReceived;
                }
            }
        }
        private void ConfirmButtonPressed(object sender, RoutedEventArgs e)
        {
            input  = access.OpenInputAsync(LaunchPadInputs.SelectedValue.ToString()).Result;
            output = access.OpenOutputAsync(LaunchPadOutputs.SelectedValue.ToString()).Result;

            try
            {
                lpmngr = new LaunchPadManager(access, input, output);

                InitMacroGrid();
            } catch (ArgumentException ex)
            {
                MessageBox.Show(ex.Message, "LaunchPad Macros", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
        }
        //, ITestControlService currentTest)
        public MainWindowViewModel(IUnityContainer container,  IMediaService mediaService, 
            IDialogService dialogService, IOutput outputDevice, IMidiInput inputDevice,
            IVirtualKeyBoard keyBoard)
        {
            _container =container;
            _dialoagService = dialogService;
            _mediaService = mediaService;
            _output = outputDevice;
            _input = inputDevice;
            _keyBoard = keyBoard;
            //_currentTest = currentTest.Control;

            ResolveViews();

            //Hook up keyboard (mouse presses) to output
            _keyBoard.KeyPressEvent += (o, e) => _output.Send(e);
        }
示例#19
0
        public MainWindowViewModel(IUnityContainer container,  IMediaServiceHost mediaServiceHost, 
            IDialogService dialogService, IOutput outputDevice, IMidiInput inputDevice,
            IVirtualKeyBoard keyBoard, ITestControlService currentTest, IInputEvents inputEvents)
        {
            _container =container;
            _dialoagService = dialogService;
            _mediaServiceHost = mediaServiceHost;
            _output = outputDevice;
            _input = inputDevice;
            _keyBoard = keyBoard;
            _currentTestControl = currentTest;

            availableTestControls = new ObservableCollection<ITestControlService>();
            availableTestControls.Add(_currentTestControl);
            availableTestControls.Add(_container.Resolve<NoteGuess.NoteGuessControl>());

            ResolveViews();
        }
示例#20
0
        public MainWindowViewModel(IUnityContainer container, IMediaServiceHost mediaServiceHost,
                                   IDialogService dialogService, IOutput outputDevice, IMidiInput inputDevice,
                                   IVirtualKeyBoard keyBoard, ITestControlService currentTest, IInputEvents inputEvents)
        {
            _container          = container;
            _dialoagService     = dialogService;
            _mediaServiceHost   = mediaServiceHost;
            _output             = outputDevice;
            _input              = inputDevice;
            _keyBoard           = keyBoard;
            _currentTestControl = currentTest;

            availableTestControls = new ObservableCollection <ITestControlService>();
            availableTestControls.Add(_currentTestControl);
            availableTestControls.Add(_container.Resolve <NoteGuess.NoteGuessControl>());

            ResolveViews();
        }
示例#21
0
        private async Task PollMidiConnection()
        {
            //Checking for added devices
            int numDevices = midi.Inputs.Count();

            if (numDevices > inDevice.Count)
            {
                foreach (IMidiPortDetails details in midi.Inputs)
                {
                    IMidiInput input = inDevice.Find(x => x.Details.Name.Equals(details.Name));
                    if (input == null)
                    {
                        IMidiInput newInput = midi.OpenInputAsync(details.Id).Result;
                        inDevice.Add(newInput);
                        this.Monitor.Log($"{newInput.Details.Name} connected", LogLevel.Info);
                        break;
                    }
                }
            }
            //Checking for removed devices
            if (numDevices < inDevice.Count)
            {
                foreach (IMidiInput input in inDevice)
                {
                    IMidiPortDetails details = midi.Inputs.ToList().Find(x => x.Id.Equals(input.Details.Id));
                    if (details == null)
                    {
                        this.Monitor.Log($"{input.Details.Name} disconnected", LogLevel.Info);
                        await input.CloseAsync();

                        inDevice.Remove(input);
                        break;
                    }
                }
            }

            await Task.Delay(1000 / 60);
        }
示例#22
0
 public APCIntance(IMidiOutput output, IMidiInput input)
 {
     outdevice = output;
     indevice  = input;
     indevice.MessageReceived += Message_Received;
     for (int row = 0; row < 64; row++)
     {
         Seq64.Add(row, false);
         Clips.Add(row, false);
     }
     for (int row = 0; row < 8; row++)
     {
         Seq8a.Add(row, new Dictionary <int, bool>());
         Seq8b.Add(row, new Dictionary <int, bool>());
         Chords.Add(row, new List <int>());
         for (int col = 0; col < 8; col++)
         {
             Seq8a[row].Add(col, false);
             Seq8b[row].Add(col, false);
         }
     }
     DrawPage(true);
 }
示例#23
0
 private void closeDevice(IMidiInput device)
 {
     device.CloseAsync().Wait();
     device.MessageReceived -= onMidiMessageReceived;
 }
示例#24
0
 public Recorder()
 {
     this.access = (IMidiAccess2)MidiAccessManager.Default;
     this.input  = access.OpenInputAsync(access.Inputs.Last().Id).Result;
 }
示例#25
0
        static void Main(string[] args)
        {
            //MIDIEngine.ListInputs();
            //MIDIEngine.ListOutputs();

            PushIn = MIDIEngine.UseInput("Ableton Push 2");
            if (PushIn == null)
            {
                Console.WriteLine("\nCouldn't find an ableton Push 2 midi input, make sure it's plugged in and switched on");
                return;
            }

            PushOut = MIDIEngine.UseOutput("Ableton Push 2");
            if (PushOut == null)
            {
                Console.WriteLine("\nCouldn't find an Ableton Push 2 midi output make sure it's plugged in and switched on");
                return;
            }

            VirtualOut = MIDIEngine.UseOutput("Push2Standalone");
            if (VirtualOut == null)
            {
                Console.WriteLine(
                    "Couldn't find a Virtual midi device.\n" +
                    "Install a virtual midi device (https://www.tobias-erichsen.de/software/loopmidi.html)\n" +
                    "and then create a virtual device named \"Push2Standalone\""
                    );
                return;
            }

            Console.WriteLine("USING INPUT: " + PushIn.Details.Name);
            Console.WriteLine("USING OUTPUT: " + VirtualOut.Details.Name);

            var store = new MidiValueStore();

            Enc1 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder1, 1, store);
            Enc2 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder2, 2, store);
            Enc3 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder3, 3, store);
            Enc4 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder4, 4, store);
            Enc5 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder5, 5, store);
            Enc6 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder6, 6, store);
            Enc7 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder7, 7, store);
            Enc8 = new PushEncoder(PushIn, PushOut, VirtualOut, PushControl.Encoder8, 8, store);

            Pad11 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad11);
            Pad12 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad12);
            Pad13 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad13);
            Pad14 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad14);
            Pad15 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad15);
            Pad16 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad16);
            Pad17 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad17);
            Pad18 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad18);

            Pad21 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad21);
            Pad22 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad22);
            Pad23 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad23);
            Pad24 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad24);
            Pad25 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad25);
            Pad26 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad26);
            Pad27 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad27);
            Pad28 = new PushPad(PushIn, PushOut, VirtualOut, PushControl.Pad28);

            PadGroup CCSelectGroup = new PadGroup(122);

            CCSelectGroup.Add(Pad11);
            CCSelectGroup.Add(Pad12);
            CCSelectGroup.Add(Pad13);
            CCSelectGroup.Add(Pad14);
            CCSelectGroup.Add(Pad15);
            CCSelectGroup.Add(Pad16);
            CCSelectGroup.Add(Pad17);
            CCSelectGroup.Add(Pad18);
            CCSelectGroup.Add(Pad21);
            CCSelectGroup.Add(Pad22);
            CCSelectGroup.Add(Pad23);
            CCSelectGroup.Add(Pad24);
            CCSelectGroup.Add(Pad25);
            CCSelectGroup.Add(Pad26);
            CCSelectGroup.Add(Pad27);
            CCSelectGroup.Add(Pad28);


            var CCBank1  = Enumerable.Range(0, 8).ToArray();
            var CCBank2  = Enumerable.Range(8, 16).ToArray();
            var CCBank3  = Enumerable.Range(16, 24).ToArray();
            var CCBank4  = Enumerable.Range(24, 32).ToArray();
            var CCBank5  = Enumerable.Range(32, 40).ToArray();
            var CCBank6  = Enumerable.Range(40, 48).ToArray();
            var CCBank7  = Enumerable.Range(48, 56).ToArray();
            var CCBank8  = Enumerable.Range(56, 64).ToArray();
            var CCBank9  = Enumerable.Range(64, 72).ToArray();
            var CCBank10 = Enumerable.Range(72, 80).ToArray();
            var CCBank11 = Enumerable.Range(80, 88).ToArray();
            var CCBank12 = Enumerable.Range(88, 96).ToArray();
            var CCBank13 = Enumerable.Range(96, 104).ToArray();
            var CCBank14 = Enumerable.Range(104, 112).ToArray();
            var CCBank15 = Enumerable.Range(112, 120).ToArray();
            var CCBank16 = Enumerable.Range(120, 127).ToArray();

            EncoderGroup Encoders = new EncoderGroup();

            Encoders.Add(Enc1);
            Encoders.Add(Enc2);
            Encoders.Add(Enc3);
            Encoders.Add(Enc4);
            Encoders.Add(Enc5);
            Encoders.Add(Enc6);
            Encoders.Add(Enc7);
            Encoders.Add(Enc8);


            Pad11.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad11.SetColor(4);
                Encoders.MapTo(CCBank1);
            };

            Pad12.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad12.SetColor(4);
                Encoders.MapTo(CCBank2);
            };

            Pad13.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad13.SetColor(4);
                Encoders.MapTo(CCBank3);
            };

            Pad14.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad14.SetColor(4);
                Encoders.MapTo(CCBank4);
            };

            Pad15.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad15.SetColor(4);
                Encoders.MapTo(CCBank5);
            };

            Pad16.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad16.SetColor(4);
                Encoders.MapTo(CCBank6);
            };

            Pad17.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad17.SetColor(4);
                Encoders.MapTo(CCBank7);
            };

            Pad18.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad18.SetColor(4);
                Encoders.MapTo(CCBank8);
            };

            Pad21.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad21.SetColor(4);
                Encoders.MapTo(CCBank9);
            };

            Pad22.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad22.SetColor(4);
                Encoders.MapTo(CCBank10);
            };

            Pad23.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad23.SetColor(4);
                Encoders.MapTo(CCBank11);
            };

            Pad24.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad24.SetColor(4);
                Encoders.MapTo(CCBank12);
            };

            Pad25.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad25.SetColor(4);
                Encoders.MapTo(CCBank13);
            };

            Pad26.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad26.SetColor(4);
                Encoders.MapTo(CCBank14);
            };

            Pad27.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad27.SetColor(4);
                Encoders.MapTo(CCBank15);
            };

            Pad28.OnNoteOn += (data) => {
                CCSelectGroup.SetColor(122);
                Pad28.SetColor(4);
                Encoders.MapTo(CCBank16);
            };

            Console.WriteLine("\nActive. Press escape to leave...");

            while (true)
            {
                var key = Console.ReadKey().Key;
                if (key == ConsoleKey.Escape)
                {
                    break;
                }
                ;
            }

            // Turn off lights
            CCSelectGroup.SetColor(0);

            // Clean up
            PushIn.Dispose();
            PushOut.Dispose();
            VirtualOut.Dispose();
        }
示例#26
0
        public async void SetInputPort(IMidiPortDetails port)
        {
            await input.CloseAsync();

            this.input = access.OpenInputAsync(port.Id).Result;
        }
示例#27
0
        static async Task Main(string[] args)
        {
            Console.WriteLine("MIDI to BLE Bridge");

            var access   = MidiAccessManager.Default;
            var midiPort = access.Inputs.FirstOrDefault(inp => inp.Name.Contains("mio", StringComparison.OrdinalIgnoreCase));

            if (midiPort == null)
            {
                midiPort = access.Inputs.FirstOrDefault(inp => inp.Name.Contains("vmpk", StringComparison.OrdinalIgnoreCase));
            }

            IMidiInput input = null;

            if (midiPort != null)
            {
                Console.WriteLine($"Found {midiPort.Name}. Opening...");
                input = await access.OpenInputAsync(midiPort.Id);

                // There seems to be a pretty bad race condition inside the library.
                // If your MIDI device is streaming data but there is no MessageReceived delegate, it will
                // throw a NRE. So register this dummy here for now.
                input.MessageReceived += (obj, e) => {};
            }
            else
            {
                Console.WriteLine("No suitable MIDI port found.");
            }

            Task.Run(async() =>
            {
                using (var connection = new Connection(Address.System))
                {
                    await connection.ConnectAsync();

                    var hci0Path    = new ObjectPath("/org/bluez/hci0");
                    var serviceName = "org.bluez";
                    var hci0Adapter = connection.CreateProxy <IAdapter1>(serviceName, hci0Path);

                    // Based on BlueZ sample code. Verify what it does. Does it really turn my BT adapeter on if it was off?
                    Console.WriteLine("Setting power to true on device 1");
                    await hci0Adapter.SetPoweredAsync(true);

                    var advertisement = new LEAdvertisement(new LEAdvertisementProperties {
                        Type = "peripheral", LocalName = "MIDI-BRIDGE"
                    });
                    advertisement.LEAdvertisementProperties.ServiceUUIDs = new string[] { "03B80E5A-EDE8-4B33-A751-6CE34EC4C700" };

                    // Generic computer icon
                    advertisement.LEAdvertisementProperties.Appearance = 0x0080;

                    // We need to register the LEAdvertisement object. This basically publishes the object
                    // so that when we get the DBus callback to read all the properties, we're good to go.
                    await connection.RegisterObjectAsync(advertisement);

                    var advertisingManager = connection.CreateProxy <ILEAdvertisingManager1>(serviceName, hci0Path);
                    await advertisingManager.RegisterAdvertisementAsync(advertisement, new Dictionary <string, object>());

                    Application application = new Application(@"/org/bluez/example");
                    GattService1 service    = new GattService1(application.ObjectPath, 0, "03B80E5A-EDE8-4B33-A751-6CE34EC4C700", true);

                    GattCharacteristic1 gattCharacteristic1 = new GattCharacteristic1(service.ObjectPath, 0, "7772E5DB-3868-4112-A1A9-F2669D106BF3", new string[] { "notify", "read", "write-without-response" });

                    // TODO: Remove PlayNote out of gattCharacteristic. Bridge should handle locking.
                    Bridge midiBleBridge = new Bridge(data => gattCharacteristic1.Value = data);
                    midiBleBridge.StartActiveSense();
                    if (input != null)
                    {
                        input.MessageReceived += (obj, e) =>
                        {
                            midiBleBridge.ReceiveMidiMessage(e.Length, e.Data);
                        };
                    }
                    service.AddCharacteristic(gattCharacteristic1);
                    application.AddService(service);

                    await connection.RegisterObjectAsync(application);

                    var gattManager = connection.CreateProxy <IGattManager1>(serviceName, new ObjectPath(@"/org/bluez/hci0"));
                    await connection.RegisterObjectAsync(gattCharacteristic1);

                    await gattManager.RegisterApplicationAsync(application, new Dictionary <string, object>());

                    Console.WriteLine("Press <Ctrl>+c to exit...");
                    await Task.Delay(int.MaxValue);
                }
            }).Wait();

            await input.CloseAsync();
        }
示例#28
0
 /// <summary>
 /// Creates a new recording session object
 /// </summary>
 /// <param name="midiInput">Expected to be injected</param>
 public RecordSession(IMidiInput midiInput)
 {
     _midiInput = midiInput;
 }
示例#29
0
        //A client to read MIDI inputs, send them to a light server, and (optionally) forwards them to an output MIDI device
        static void Main(string[] args)
        {
            Console.WriteLine("MIDI Message splitter client");
            var testmode = false;

            var remapNotes = true;

            //remap MIDI notes here (src,target)
            Dictionary <int, int> noteMapping = new Dictionary <int, int>
            {
                { 39, 38 }, //Snare Rim -> Snare
                { 28, 26 }, //Lcymbal -> Hihat
                { 52, 51 }, //Ride bell -> Ride
                { 53, 51 }, //Mcymbal -> Ride
                { 59, 49 }, //xLCymbal -> RCymbal
            };

            string targetAddress = "127.0.0.1";
            int    targetPort    = 5005;

            if (args.Length > 0)
            {
                if (args[0] != null)
                {
                    targetAddress = args[0];
                }
                if (args[1] != null)
                {
                    int.TryParse(args[1], out targetPort);
                }
            }

            TcpClient     client = new TcpClient(targetAddress, targetPort);
            NetworkStream stream = client.GetStream();

            try
            {
                if (testmode)
                {
                    while (true)
                    {
                        var inputstr = Console.ReadLine();
                        TransmitMessage(inputstr, stream);
                        Console.WriteLine($"Sent message {inputstr}");
                    }
                }


                var         access = MidiAccessManager.Default;
                IMidiInput  input  = null;
                IMidiOutput output = null;

                string chosenIdIn  = "";
                string chosenIdOut = "";

                foreach (IMidiPortDetails portdetails in access.Inputs)
                {
                    Console.WriteLine($"Input: {portdetails.Name} / ID: {portdetails.Id}");
                }

                if (access.Inputs.Count() <= 0)
                {
                    throw new InvalidOperationException("No input devices detected!");
                }
                else if (access.Inputs.Count() == 1)
                {
                    //Default
                    chosenIdIn = access.Inputs.First().Id;
                    Console.WriteLine("Using default input...");
                }
                else
                {
                    //Choose from list
                    Console.WriteLine("Enter input device ID to use:");
                    chosenIdIn = Console.ReadLine();
                }

                input = access.OpenInputAsync(chosenIdIn).Result;

                if (access.Outputs.Count() > 0)
                {
                    foreach (IMidiPortDetails portdetails in access.Outputs)
                    {
                        Console.WriteLine($"Output: {portdetails.Name} / ID: {portdetails.Id}");
                    }
                    Console.WriteLine("Enter output device ID to use:");
                    chosenIdOut = Console.ReadLine();
                }

                try
                {
                    output = access.OpenOutputAsync(chosenIdOut).Result;
                }
                catch
                {
                    Console.WriteLine("Couldn't open output device, ignoring...");
                }

                Console.WriteLine("Reading events...");
                input.MessageReceived += (object sender, MidiReceivedEventArgs e)
                                         =>
                {
                    string[] outputs = new string[5] {
                        "0", "0", "0", "0", "0"
                    };

                    for (int i = 0; i < e.Length; i++)
                    {
                        outputs[i] = e.Data[i].ToString();
                    }
                    outputs[4] = e.Timestamp.ToString();
                    TransmitMessage($"{outputs[0]},{outputs[1]},{outputs[2]},{outputs[3]},{outputs[4]},", stream);
                    Console.WriteLine($"{outputs[0]},{outputs[1]},{outputs[2]},{outputs[3]},{outputs[4]}");
                    if (output != null)
                    {
                        if (remapNotes)
                        {
                            int  noteNumberIn  = e.Data[1];
                            byte noteNumberOut = 0;

                            if (noteMapping.ContainsKey(noteNumberIn))
                            {
                                Console.WriteLine($"Remapping note {noteNumberIn} to {noteMapping[noteNumberIn]}");

                                noteNumberOut = (byte)noteMapping[noteNumberIn];
                                e.Data[1]     = noteNumberOut;
                            }
                        }

                        output.Send(e.Data, 0, e.Data.Length, e.Timestamp);
                    }
                };

                Console.ReadKey();
            }
            finally
            {
                TransmitMessage("disconnect", stream);
                stream.Close();
                client.Close();
            }
        }