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