public void AttachListener(IMidiListener listener) { if (listener != null) { _listeners.Add(new WeakReference <IMidiListener>(listener)); } }
public Midi(IMidiListener midiListener) { this.midiListener = midiListener; midiInProc = new NativeMethods.MidiInProc(MidiProc); midiInHandle = IntPtr.Zero; midiOutHandle = IntPtr.Zero; }
public void DetachListener(IMidiListener listener) { foreach (WeakReference <IMidiListener> wr in _listeners.ToArray()) { IMidiListener candidate; if (!wr.TryGetTarget(out candidate)) { _listeners.Remove(wr); } else if (candidate == listener) { _listeners.Remove(wr); } } }
public void RepublishState(IMidiListener toListener = null) { // This does not include active notes // Messages that came in on the OMNI channel have already been distributed to each cache // Messages that came in on individual channels have all been distributed to the omni cache as well. IEnumerable <IMidiListener> listeners; if (toListener == null) { listeners = GetListeners(); } else { listeners = new[] { toListener } }; foreach (IMidiListener listener in listeners) { MidiPerformance cache; if (_localPerformanceCache.TryGetValue(listener.Channel, out cache)) { listener.HandleChannelPressure((int)cache.Pressure, cache.Channel); listener.HandlePitchWheel((int)cache.PitchBend, cache.Channel); listener.HandleControlChange((int)MidiController.Modulation, (int)cache.Modulation, cache.Channel); listener.HandleControlChange((int)MidiController.Modulation, (int)cache.Modulation, cache.Channel); listener.HandleControlChange((int)MidiController.BreathController, (int)cache.BreathController, cache.Channel); listener.HandleControlChange((int)MidiController.MainVolume, (int)cache.Volume, cache.Channel); listener.HandleControlChange((int)MidiController.Pan, (int)cache.Pan, cache.Channel); listener.HandleControlChange((int)MidiController.Expression, (int)cache.Expression, cache.Channel); listener.HandleControlChange((int)MidiController.Sustain, cache.HoldPedal ? 127 : 0, cache.Channel); listener.HandleControlChange((int)MidiController.Portamento, cache.Portamento ? 127 : 0, cache.Channel); listener.HandleControlChange((int)MidiController.Sostenuto, cache.SustenutoPedal ? 127 : 0, cache.Channel); listener.HandleControlChange((int)MidiController.SoftPedal, cache.SoftPedal ? 127 : 0, cache.Channel); listener.HandleControlChange((int)MidiController.LegatoFootswitch, cache.Legato ? 127 : 0, cache.Channel); } } }