示例#1
0
        protected override void OnStart(string[] args)
        {
            MidiIn = CreateMidiIn(Settings.Default.InputMidiDevice);

            OscOut = new OscSender(IPAddress.Parse(Settings.Default.OscHost), 0, Settings.Default.OscPortOut);
            OscOut.Connect();

            OscIn = new OscReceiver(IPAddress.Parse(Settings.Default.OscHost), Settings.Default.OscPortIn);
            Task.Run(() =>
            {
                OscIn.Connect();
                var running = true;
                while (running)
                {
                    try
                    {
                        var packet   = OscIn.Receive();
                        var messages = ExplodeBundle(packet);
                        foreach (var message in messages)
                        {
                            try
                            {
                                var msg = new OscEventArgs(message.Address, message.ToArray());
                                WriteDebug($"Got OSC: {msg}");
                                OscMessageReceived?.Invoke(this, msg);
                            }
                            catch
                            {
                                // ignore
                            }
                        }
                    }
                    catch
                    {
                        running = false;
                    }
                }
            });

            LoadPlugins();
        }
示例#2
0
        protected void OnMessageReceive(OscPacket oscPacketReceived)
        {
            var bundle = oscPacketReceived as OscBundle;

            if (bundle == null)
            {
                return;
            }

            //example regex taht work for all layer and channel -> /channel/[0-9]\d*/stage/layer/[0-9]\d*/background/producer
            var bundleToNotify = bundle
                                 .OfType <OscMessage>();

            if (IsFilteringAddress)
            {
                bundleToNotify = bundleToNotify
                                 .Where(x => _whiteListedAddresses.Any(m => m.Value.IsMatch(x.Address)));
            }
            else
            {
                bundleToNotify = bundleToNotify.Where(x => !_blackListedAddresses.Any(m => m.Value.IsMatch(x.Address)));
            }

            if (NotifyOnce)
            {
                bundleToNotify = bundleToNotify.Where(oscMessage =>
                                                      !_packetAlreadyNotified.Any(x => x.Key == oscMessage.Address && x.Value.Equals(oscMessage)));
            }



            foreach (var oscMessage in bundleToNotify)
            {
                OscMessageReceived?.Invoke(this, new OscMessageEventArgs(oscMessage));
                if (NotifyOnce)
                {
                    _packetAlreadyNotified.AddOrUpdate(oscMessage.Address, oscMessage, (key, oldvalue) => oscMessage);
                }
            }
        }