/// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void MidiIn_InputEvent(object sender, NpMidiEventArgs e)
        {
            PMidiEvent mevt = new PMidiEvent(e.channel, e.note, e.velocity, e.controllerId, e.controllerValue);

            _pmidiEvents.Enqueue(mevt);

            if (_midiOut != null) // pass-thru?
            {
                _midiOut.Send(e);
            }
        }
Пример #2
0
        /// <summary>
        /// Send a midi message.
        /// </summary>
        /// <param name="mevt"></param>
        /// <returns></returns>
        public bool Send(NpMidiEventArgs mevt)
        {
            bool ok = true;

            if (mevt.velocity >= 0)
            {
                SendNote(mevt.channel, mevt.note, mevt.velocity);
            }
            else if (mevt.controllerId >= 0)
            {
                SendController(mevt.channel, mevt.controllerId, mevt.controllerValue);
            }
            else
            {
                ok = false;
            }

            return(ok);
        }
        /// <summary>
        /// Make a floating midi piano.
        /// </summary>
        void CreatePiano()
        {
            _piano = new Form()
            {
                Text            = "Virtual Keyboard",
                Size            = new Size(864, 100),
                StartPosition   = FormStartPosition.Manual,
                Location        = new Point(Left, Bottom + 20),
                FormBorderStyle = FormBorderStyle.FixedToolWindow,
                ShowIcon        = false,
                ShowInTaskbar   = false
            };

            VirtualKeyboard vkey = new VirtualKeyboard()
            {
                Dock          = DockStyle.Fill,
                ShowNoteNames = true,
            };

            // Set the icon.
            Bitmap bm = new Bitmap(Properties.Resources.glyphicons_327_piano);

            _piano.Icon = Icon.FromHandle(bm.GetHicon());

            vkey.KeyboardEvent += (_, e) =>
            {
                NpMidiEventArgs mevt = new NpMidiEventArgs()
                {
                    channel  = e.ChannelNumber,
                    note     = e.NoteId,
                    velocity = e.Velocity
                };
                MidiIn_InputEvent(vkey, mevt);
            };

            _piano.Controls.Add(vkey);
            _piano.TopMost = true;
            _piano.Show();
        }
Пример #4
0
        /// <summary>
        /// Process input midi event.
        /// </summary>
        void NpMidiIn_MessageReceived(object sender, MidiInMessageEventArgs e)
        {
            // Decode the message. We only care about a few.
            MidiEvent       me   = MidiEvent.FromRawMessage(e.RawMessage);
            NpMidiEventArgs mevt = null;

            switch (me.CommandCode)
            {
            case MidiCommandCode.NoteOn:
            {
                NoteOnEvent evt = me as NoteOnEvent;
                mevt = new NpMidiEventArgs()
                {
                    channel  = evt.Channel,
                    note     = evt.NoteNumber,
                    velocity = evt.Velocity
                };
            }
            break;

            case MidiCommandCode.NoteOff:
            {
                NoteEvent evt = me as NoteEvent;
                mevt = new NpMidiEventArgs()
                {
                    channel  = evt.Channel,
                    note     = evt.NoteNumber,
                    velocity = 0
                };
            }
            break;

            case MidiCommandCode.ControlChange:
            {
                ControlChangeEvent evt = me as ControlChangeEvent;
                mevt = new NpMidiEventArgs()
                {
                    channel         = evt.Channel,
                    controllerId    = (int)evt.Controller,
                    controllerValue = evt.ControllerValue
                };
            }
            break;

            case MidiCommandCode.PitchWheelChange:
            {
                PitchWheelChangeEvent evt = me as PitchWheelChangeEvent;
                mevt = new NpMidiEventArgs()
                {
                    channel         = evt.Channel,
                    controllerId    = NpMidiEventArgs.PITCH_CONTROL,
                    controllerValue = evt.Pitch
                };
            }
            break;
            }

            if (mevt != null)
            {
                // Pass it up for handling.
                InputEvent?.Invoke(this, mevt);
            }
            // else ignore??
        }