protected override void Dispose(bool isDisposing) { if (!isDisposing) { return; } MidiInConnectionManager.UnregisterConsumer(this); }
public void MessageReceivedHandler(object sender, MidiInMessageEventArgs msg) { lock (this) { if (!(sender is MidiIn midiIn) || msg.MidiEvent == null) { return; } MidiSignal newSignal = null; var device = MidiInConnectionManager.GetDescriptionForMidiIn(midiIn); if (msg.MidiEvent is ControlChangeEvent controlEvent) { if (_printLogMessages) { Log.Debug("" + controlEvent + " ControlValue :" + controlEvent.ControllerValue); } if (!UseControlRange) { newSignal = new MidiSignal() { Channel = controlEvent.Channel, ControllerId = (int)controlEvent.Controller, ControllerValue = (int)controlEvent.ControllerValue, }; } } if (msg.MidiEvent is NoteEvent noteEvent) { switch (noteEvent.CommandCode) { case MidiCommandCode.NoteOn: { if (_printLogMessages) { Log.Debug("" + noteEvent + " ControlValue :" + noteEvent.NoteNumber); } newSignal = new MidiSignal() { Channel = noteEvent.Channel, ControllerId = noteEvent.NoteNumber, ControllerValue = noteEvent.Velocity, }; break; } case MidiCommandCode.NoteOff: newSignal = new MidiSignal() { Channel = noteEvent.Channel, ControllerId = noteEvent.NoteNumber, ControllerValue = 0, }; break; } } else if (msg.MidiEvent.CommandCode == MidiCommandCode.TimingClock && device.ProductName == _trainedDeviceName) { //_timingMsgCount++; } if (newSignal != null) { var matchesDevice = String.IsNullOrEmpty(_trainedDeviceName) || device.ProductName == _trainedDeviceName; var matchesChannel = _trainedChannel < 0 || newSignal.Channel == _trainedChannel; var matchesSingleController = _trainedControllerId < 0 || newSignal.ControllerId == _trainedControllerId; var matchesControlRange = _trainedControllerId < 0 || (newSignal.ControllerId >= _controlRange.Width && newSignal.ControllerId <= _controlRange.Height); var matchesController = UseControlRange ? matchesControlRange : matchesSingleController; if (_teachingActive || (matchesDevice && matchesChannel && matchesController)) { _lastMatchingSignals.Add(newSignal); ; _lastMessageDevice = device; _isDefaultValue = false; } } } }
private void Update(EvaluationContext context) { _trainedDeviceName = Device.GetValue(context); _trainedChannel = Channel.GetValue(context); _trainedControllerId = Control.GetValue(context); _allowPresets = AllowPresets.GetValue(context); _controlRange = ControlRange.GetValue(context); _printLogMessages = PrintLogMessages.GetValue(context); var teachTrigger = !TeachTrigger.GetValue(context); var teachJustTriggered = !teachTrigger && !_oldTeachTrigger; _oldTeachTrigger = !teachTrigger; var controlRangeSize = (_controlRange.Height - _controlRange.Width).Clamp(1, 128); if (_valuesForControlRange == null || _valuesForControlRange.Count != controlRangeSize) { _valuesForControlRange = new List <float>(controlRangeSize); _valuesForControlRange.AddRange(new float[controlRangeSize]); //initialize list values } if (teachJustTriggered) { MidiInConnectionManager.Rescan(); _teachingActive = true; _lastMatchingSignals.Clear(); _currentControllerValue = 0; } lock (this) { foreach (var signal in _lastMatchingSignals) { if (_teachingActive) { Device.TypedInputValue.Value = _lastMessageDevice.ProductName; Device.Input.IsDefault = false; Device.DirtyFlag.Invalidate(); Channel.TypedInputValue.Value = signal.Channel; Channel.Input.IsDefault = false; Channel.DirtyFlag.Invalidate(); Control.TypedInputValue.Value = signal.ControllerId; Control.Input.IsDefault = false; Control.DirtyFlag.Invalidate(); _trainedDeviceName = _lastMessageDevice.ProductName; _trainedChannel = signal.Channel; _trainedControllerId = signal.ControllerId; _teachingActive = false; TeachTrigger.TypedInputValue.Value = false; } _currentControllerValue = signal.ControllerValue; _currentControllerId = signal.ControllerId; var isWithinControlRange = signal.ControllerId >= _controlRange.Width && signal.ControllerId < _controlRange.Height; if (isWithinControlRange) { var index = signal.ControllerId - _controlRange.Width; _valuesForControlRange[index] = signal.ControllerValue; } _isDefaultValue = false; } _lastMatchingSignals.Clear(); } if (_isDefaultValue) { Result.Value = DefaultMidiValue.GetValue(context); return; } var outRange = OutputRange.GetValue(context); Result.Value = UseControlRange ? _currentControllerId : MathUtils.RemapAndClamp(_currentControllerValue, 0, 127, outRange.X, outRange.Y); Range.Value = _valuesForControlRange; }
public MidiInput() { Result.UpdateAction = Update; Range.UpdateAction = Update; MidiInConnectionManager.RegisterConsumer(this); }