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(); }
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); } } }