Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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;
        }
Пример #4
0
        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;
                }
            };
        }
Пример #5
0
 public MidiPlayer(MidiMusic music, IMidiAccess access, IMidiPlayerTimeManager timeManager)
     : this(music, access.OpenOutputAsync(access.Outputs.First().Id).Result, timeManager)
 {
     should_dispose_output = true;
 }
Пример #6
0
 public MidiPlayer(MidiMusic music, IMidiPlayerTimeManager timeManager)
     : this(music, MidiAccessManager.Empty, timeManager)
 {
 }