예제 #1
0
        protected override void Dispose(bool isDisposing)
        {
            if (!isDisposing)
            {
                return;
            }

            MidiInConnectionManager.UnregisterConsumer(this);
        }
예제 #2
0
        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;
                    }
                }
            }
        }
예제 #3
0
        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;
        }
예제 #4
0
 public MidiInput()
 {
     Result.UpdateAction = Update;
     Range.UpdateAction  = Update;
     MidiInConnectionManager.RegisterConsumer(this);
 }