public static MidiPlayer GetMidiPlayer(IMidiPlayerTimeManager timeManager, MidiMusic midiMusic, IMidiAccess midiAccess = null) { var access = midiAccess ?? MidiAccessManager.Empty; var music = midiMusic ?? GetMidiMusic(); var tm = timeManager ?? new VirtualMidiPlayerTimeManager(); return(new MidiPlayer(music, access, tm)); }
public static MidiPlayer GetMidiPlayer(IMidiPlayerTimeManager timeManager = null, IMidiAccess midiAccess = null, string resourceId = null) { var access = midiAccess ?? MidiAccessManager.Empty; var music = resourceId != null?GetMidiMusic(resourceId) : GetMidiMusic(); var tm = timeManager ?? new VirtualMidiPlayerTimeManager(); return(new MidiPlayer(music, access, tm)); }
public MidiEventLooper(IList <MidiMessage> messages, IMidiPlayerTimeManager timeManager, int deltaTimeSpec) { if (messages == null) { throw new ArgumentNullException("messages"); } if (deltaTimeSpec < 0) { throw new NotSupportedException("SMPTe-based delta time is not implemented in this player."); } delta_time_spec = deltaTimeSpec; time_manager = timeManager; this.messages = messages; state = PlayerState.Stopped; }
public MidiPlayer(MidiMusic music, IMidiOutput output, IMidiPlayerTimeManager timeManager) { if (music == null) { throw new ArgumentNullException("music"); } if (output == null) { throw new ArgumentNullException("output"); } if (timeManager == null) { throw new ArgumentNullException("timeManager"); } this.music = music; this.output = output; messages = SmfTrackMerger.Merge(music).Tracks [0].Messages; player = new MidiEventLooper(messages, timeManager, music.DeltaTimeSpec); player.Starting += () => { // all control reset on all channels. for (int i = 0; i < 16; i++) { buffer [0] = (byte)(i + 0xB0); buffer [1] = 0x79; buffer [2] = 0; output.Send(buffer, 0, 3, 0); } }; EventReceived += (m) => { switch (m.EventType) { case MidiEvent.NoteOn: case MidiEvent.NoteOff: if (channel_mask != null && channel_mask [m.Channel]) { return; // ignore messages for the masked channel. } goto default; case MidiEvent.SysEx1: case MidiEvent.SysEx2: if (buffer.Length <= m.Data.Length) { buffer = new byte [buffer.Length * 2]; } buffer [0] = m.StatusByte; Array.Copy(m.Data, 0, buffer, 1, m.Data.Length); output.Send(buffer, 0, m.Data.Length + 1, 0); break; case MidiEvent.Meta: // do nothing. break; default: var size = MidiEvent.FixedDataSize(m.StatusByte); buffer [0] = m.StatusByte; buffer [1] = m.Msb; buffer [2] = m.Lsb; output.Send(buffer, 0, size + 1, 0); break; } }; }
public MidiPlayer(MidiMusic music, IMidiAccess access, IMidiPlayerTimeManager timeManager) : this(music, access.OpenOutputAsync(access.Outputs.First().Id).Result, timeManager) { should_dispose_output = true; }
public MidiPlayer(MidiMusic music, IMidiPlayerTimeManager timeManager) : this(music, MidiAccessManager.Empty, timeManager) { }