예제 #1
0
        /// <summary>
        /// Indicates if the stream has enough room to write the specified <paramref name="message"/> to the stream.
        /// </summary>
        /// <param name="message">Must no be null.</param>
        /// <returns>Returns true if the message can be written.</returns>
        public virtual bool CanWrite(IMidiMessage message)
        {
            Check.IfArgumentNull(message, nameof(message));

            if (message is MidiShortMessage shortMessage)
            {
                return(StreamWriter.CanWriteShort());
            }

            if (message is MidiLongMessage longMessage)
            {
                return(StreamWriter.CanWriteLong(longMessage.GetData()));
            }

            throw new ArgumentException(
                      String.Format(CultureInfo.InvariantCulture,
                                    "The type '{0}' is not supported for message argument.", message.GetType().FullName), nameof(message));
        }
        /// <summary>
        /// Get the relevant value of the MIDI message.
        /// </summary>
        /// <param name="inputMidiMessage">Raw MIDI message.</param>
        /// <returns>The value as int.</returns>
        private int ExtractMidiMessageValue(IMidiMessage inputMidiMessage)
        {
            // Check controller type messages.
            if (inputMidiMessage.Type == MidiMessageType.ControlChange)
            {
                MidiControlChangeMessage currentMidiMessage = (MidiControlChangeMessage)inputMidiMessage;
                return(currentMidiMessage.ControlValue);
            }

            // Check note on type messages.
            if (inputMidiMessage.Type == MidiMessageType.NoteOn)
            {
                MidiNoteOnMessage currentMidiMessage = (MidiNoteOnMessage)inputMidiMessage;
                return(currentMidiMessage.Velocity);
            }

            return(0);
        }
예제 #3
0
        protected void SendMessage(IMidiMessage message)
        {
            Type type = message.GetType();

            if (type == typeof(ChannelMessage))
            {
                this._midiSender.Send((ChannelMessage)message);
            }
            else if (type == typeof(SysExMessage))
            {
                this._midiSender.Send((SysExMessage)message);
            }

            if (TrackMessage != null)
            {
                TrackMessage(this, message);
            }
        }
예제 #4
0
 public async void MidiInPort_MessageReceived(MidiInPort sender, MidiMessageReceivedEventArgs args)
 {
     IMidiMessage receivedMidiMessage = args.Message;
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         double x = receivedMidiMessage.Type switch
         {
             MidiMessageType.ControlChange =>
             ((MidiControlChangeMessage)receivedMidiMessage).Controller switch
             {
                 48 => redSlider.Value    = ((MidiControlChangeMessage)receivedMidiMessage).ControlValue * 2.008,
                 49 => greenSlider.Value  = ((MidiControlChangeMessage)receivedMidiMessage).ControlValue * 2.008,
                 50 => blueSlider.Value   = ((MidiControlChangeMessage)receivedMidiMessage).ControlValue * 2.008,
                 56 => masterSlider.Value = ((MidiControlChangeMessage)receivedMidiMessage).ControlValue * 2.008,
                 51 => redSlider2.Value   = ((MidiControlChangeMessage)receivedMidiMessage).ControlValue * 2.008,
                 52 => greenSlider2.Value = ((MidiControlChangeMessage)receivedMidiMessage).ControlValue * 2.008,
                 53 => blueSlider2.Value  = ((MidiControlChangeMessage)receivedMidiMessage).ControlValue * 2.008,
                 _ => 1
             },
예제 #5
0
        private bool IsTrackNameMetaMessage(IMidiMessage message)
        {
            // Guard.
            if (!(message is MetaMessage))
            {
                return(false);
            }

            MetaMessage msg = (MetaMessage)message;

            if (msg.Type == MetaType.TrackName)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #6
0
        protected void OnMessageReceived(IMidiMessage message)
        {
            MidiMessageEventHandler handler = MessageReceived;

            if (handler != null)
            {
                if (PostEventsOnCreationContext)
                {
                    context.Post(delegate(object dummy)
                    {
                        handler(message);
                    }, null);
                }
                else
                {
                    handler(message);
                }
            }
        }
예제 #7
0
        public override void midiMessageRecieved(IMidiMessage msg)
        {
            LaunchpadKeySignalInfo sigInfo = convertToLaunchpadKeySignalInfo(msg);
            LaunchpadKey           key     = launchpadKeyArrays[GlobalVariables.currentMode][sigInfo.row, sigInfo.col];

            if (key.functions.Count > 0)
            {
                if (sigInfo.velocity == 127)
                {
                    key.buttonActivated(true);
                    sendMidiMessage(convertToIMidiMessage(sigInfo.row, sigInfo.col, key.functions[key.currentFunction].lightControl.colorPressed));
                }
                else
                {
                    key.buttonActivated(false);
                    sendMidiMessage(convertToIMidiMessage(sigInfo.row, sigInfo.col, key.functions[key.currentFunction].lightControl.colorReleased));
                }
            }
        }
        public string Parse(Sequence sequence)
        {
            StringBuilder lilypondContent = new StringBuilder();
            List <string> stringList      = new List <string>();

            lilypondContent.AppendLine("\\relative c' {");
            lilypondContent.AppendLine("\\clef treble");
            System.Diagnostics.Debug.WriteLine(sequence);
            _division = sequence.Division;

            for (int i = 0; i < sequence.Count(); i++)
            {
                Track track = sequence[i];

                foreach (var midiEvent in track.Iterator())
                {
                    IMidiMessage midiMessage = midiEvent.MidiMessage;
                    // TODO: Split this switch statements and create separate logic.
                    // We want to split this so that we can expand our functionality later with new keywords for example.
                    // Hint: Command pattern? Strategies? Factory method?

                    if (midiMessage.MessageType == MessageType.Meta)
                    {
                        System.Diagnostics.Debug.WriteLine("Meta: " + (midiEvent.MidiMessage as MetaMessage).MetaType);
                        stringList.Add(getMetaString(midiMessage as MetaMessage, midiEvent, ref lilypondContent));
                    }
                    else
                    {
                        System.Diagnostics.Debug.WriteLine("Channel: " + (midiEvent.MidiMessage as ChannelMessage).Message);
                        stringList.Add(getChannelString(midiMessage as ChannelMessage, midiEvent, ref lilypondContent));
                    }
                }
            }

            foreach (string s in stringList)
            {
                // Console.WriteLine(s);
            }
            lilypondContent.Append("}");

            return(lilypondContent.ToString());
        }
예제 #9
0
        private void MidiInPort_MessageReceived(MidiInPort sender, MidiMessageReceivedEventArgs args)
        {
            IMidiMessage receivedMidiMessage = args.Message;

            System.Diagnostics.Debug.WriteLine(receivedMidiMessage.Timestamp.ToString());

            if (receivedMidiMessage.Type == MidiMessageType.NoteOn)
            {
                System.Diagnostics.Debug.WriteLine(((MidiNoteOnMessage)receivedMidiMessage).Channel);
                System.Diagnostics.Debug.WriteLine(((MidiNoteOnMessage)receivedMidiMessage).Note);
                System.Diagnostics.Debug.WriteLine(((MidiNoteOnMessage)receivedMidiMessage).Velocity);

                byte         channel           = ((MidiNoteOnMessage)receivedMidiMessage).Channel;
                byte         note              = ((MidiNoteOnMessage)receivedMidiMessage).Note;
                byte         velocity          = ((MidiNoteOnMessage)receivedMidiMessage).Velocity;
                IMidiMessage midiMessageToSend = new MidiNoteOnMessage(channel, note, velocity);

                midiOutPort.SendMessage(midiMessageToSend);
            }
        }
예제 #10
0
        /// <summary>
        /// Writes a new event to the stream for the <paramref name="message"/>.
        /// </summary>
        /// <param name="message">Must not be null.</param>
        /// <param name="deltaTime">The delta-time for the event.</param>
        public virtual void Write(IMidiMessage message, int deltaTime)
        {
            Check.IfArgumentNull(message, nameof(message));

            if (message is MidiShortMessage shortMessage)
            {
                Write(shortMessage, deltaTime);
                return;
            }

            if (message is MidiLongMessage longMessage)
            {
                Write(longMessage, deltaTime);
                return;
            }

            throw new ArgumentException(
                      String.Format(CultureInfo.InvariantCulture,
                                    "The type '{0}' is not supported for message argument.", message.GetType().FullName), nameof(message));
        }
예제 #11
0
        public void processFile(Sequence midiSequence)
        {
            division = midiSequence.Division;
            List <MidiEvent> allEvents = new List <MidiEvent>();;

            //add all events to list
            foreach (var track in midiSequence)
            {
                foreach (var midiEvent in track.Iterator())
                {
                    IMidiMessage midiMessage = midiEvent.MidiMessage;
                    if (midiMessage.GetType() == typeof(MetaMessage))
                    {
                        addMetaMessage(midiEvent, allEvents);
                    }
                    if (midiMessage.GetType() == typeof(ChannelMessage))
                    {
                        addChannelMessage(midiEvent, allEvents);
                    }
                }
            }

            //sort allNodes
            MidiEvent[] allEventsArray = allEvents.ToArray();
            sortAllEvents(allEventsArray);

            noteBuilder.SetClef(new Clef(Clef.Key.G));
            lastAbsoluteTicks = 0;
            foreach (var midiEvent in allEventsArray)
            {
                IMidiMessage midiMessage = midiEvent.MidiMessage;
                if (midiMessage.GetType() == typeof(MetaMessage))
                {
                    handleMetaMessage(midiMessage);
                }
                if (midiMessage.GetType() == typeof(ChannelMessage))
                {
                    handleChannelMessage(midiEvent);
                }
            }
        }
예제 #12
0
        public void ParseEvent(MidiEvent @event)
        {
            IMidiMessage message = @event.MidiMessage;

            if (message.MessageType == MessageType.Channel)
            {
                ParseChannelMessage((ChannelMessage)message, @event);
            }
            else if (message.MessageType == MessageType.Meta)
            {
                ParseMetaMessage((MetaMessage)message, @event);
            }
            else if (message.MessageType == MessageType.SystemExclusive)
            {
                ParseSysExMessage((SysExMessage)message, @event);
            }
            else
            {
                UnhandledMidiEvent?.Invoke(this, new MidiEventArgs(@event));
            }
        }
예제 #13
0
        private void tp_TrackMessage(object sender, IMidiMessage message)
        {
            if (!(message is Endogine.Midi.ChannelMessage))             //message.GetType() != typeof(Endogine.Midi.ChannelMessage))
            {
                return;
            }

            TrackPlayer    tp = (TrackPlayer)sender;
            ChannelMessage cm = (ChannelMessage)message;

            if (cm.Command != ChannelCommand.NoteOn)
            {
                return;
            }
            if (cm.Data2 == 0)
            {
                return;
            }

            this._factory.CreateInteractor(tp, cm);
        }
예제 #14
0
        public static string MessageToString(IMidiMessage message)
        {
            switch (message.MessageType)
            {
            case MessageType.Channel:
                var cm = (ChannelMessage)message;
                return(cm.Command.ToString() + " Ch: " +
                       cm.MidiChannel.ToString() + " Nr: " +
                       cm.Data1.ToString() + " Value: " +
                       cm.Data2.ToString());

            case MessageType.SystemExclusive:
                var    syx    = (SysExMessage)message;
                string result = "SysEx Message: ";
                foreach (byte b in syx)
                {
                    result += string.Format("{0:X2} ", b);
                }
                return(result);

            case MessageType.SystemCommon:
                var sym = (SysCommonMessage)message;
                return(sym.SysCommonType.ToString() + " Data 1: " +
                       sym.Data1.ToString() + " Data 2: " +
                       sym.Data2.ToString());

            case MessageType.SystemRealtime:
                var rm = (SysRealtimeMessage)message;
                return("Realtime Mesage: " + rm.SysRealtimeType.ToString());

            case MessageType.Meta:
                return("Meta Message");

            case MessageType.Short:
                var sm = (ShortMessage)message;
                return("Short Message");
            }

            return(message.ToString());
        }
예제 #15
0
        public virtual bool CanWrite(IMidiMessage message)
        {
            Contract.Requires(message != null);
            Check.IfArgumentNull(message, "message");

            var shortMessage = message as MidiShortMessage;

            if (shortMessage != null)
            {
                return(this.StreamWriter.CanWriteShort());
            }

            var longMessage = message as MidiLongMessage;

            if (longMessage != null)
            {
                return(this.StreamWriter.CanWriteLong(longMessage.GetData()));
            }

            throw new ArgumentException(
                      String.Format(CultureInfo.InvariantCulture, "The type '{0}' is not supported for message argument.", message.GetType().FullName));
        }
        private List <Symbol> GetSymbolsFromTrack(Track track, int division, TimeSignature timeSignature, int start, int?end)
        {
            _symbols             = new List <Symbol>();
            _startedNoteIsClosed = true;

            foreach (var midiEvent in track.Iterator())
            {
                IMidiMessage midiMessage = midiEvent.MidiMessage;
                if (midiEvent.AbsoluteTicks < start)
                {
                    continue;
                }

                if (end != null && midiEvent.AbsoluteTicks >= end)
                {
                    return(_symbols);
                }

                if (midiMessage.MessageType != MessageType.Channel)
                {
                    continue;
                }

                if (midiEvent.MidiMessage is ChannelMessage channelMessage)
                {
                    if (channelMessage.Command == ChannelCommand.NoteOn)
                    {
                        StartNote(channelMessage, midiEvent.AbsoluteTicks, division);
                    }
                    else if (channelMessage.Command == ChannelCommand.NoteOff)
                    {
                        CloseNote(_symbols[_symbols.Count - 1], midiEvent.AbsoluteTicks, division);
                    }
                }
            }

            return(_symbols);
        }
예제 #17
0
        public virtual void Write(IMidiMessage message, int deltaTime)
        {
            Contract.Requires(message != null);
            Check.IfArgumentNull(message, "message");

            var shortMessage = message as MidiShortMessage;

            if (shortMessage != null)
            {
                this.Write(shortMessage, deltaTime);
                return;
            }

            var longMessage = message as MidiLongMessage;

            if (longMessage != null)
            {
                this.Write(longMessage, deltaTime);
                return;
            }

            throw new ArgumentException(
                      String.Format(CultureInfo.InvariantCulture, "The type '{0}' is not supported for message argument.", message.GetType().FullName));
        }
예제 #18
0
파일: MidiEvent.cs 프로젝트: Jbtyson/cis598
        internal MidiEvent(object owner, int absoluteTicks, IMidiMessage message)
        {
            #region Require

            if(owner == null)
            {
                throw new ArgumentNullException("owner");
            }
            else if(absoluteTicks < 0)
            {
                throw new ArgumentOutOfRangeException("absoluteTicks", absoluteTicks,
                    "Absolute ticks out of range.");
            }
            else if(message == null)
            {
                throw new ArgumentNullException("e");
            }

            #endregion

            this.owner = owner;
            this.absoluteTicks = absoluteTicks;
            this.message = message;
        }
예제 #19
0
        internal MidiEvent(object owner, int absoluteTicks, IMidiMessage message)
        {
            #region Require

            if (owner == null)
            {
                throw new ArgumentNullException("owner");
            }
            else if (absoluteTicks < 0)
            {
                throw new ArgumentOutOfRangeException("absoluteTicks", absoluteTicks,
                                                      "Absolute ticks out of range.");
            }
            else if (message == null)
            {
                throw new ArgumentNullException("e");
            }

            #endregion

            this.owner         = owner;
            this.absoluteTicks = absoluteTicks;
            this.message       = message;
        }
예제 #20
0
 public TimestampedMessage(int ticks, IMidiMessage message)
 {
     this.ticks   = ticks;
     this.message = message;
 }
예제 #21
0
 public MidiEvent Insert(int absoluteTicks, IMidiMessage ev)
 {
     return(midiTrack.Insert(absoluteTicks, ev));
 }
예제 #22
0
파일: Track.cs 프로젝트: huming2207/ghgame
        /// <summary>
        /// Inserts an IMidiMessage at the specified position in absolute ticks.
        /// </summary>
        /// <param name="position">
        /// The position in the Track in absolute ticks in which to insert the
        /// IMidiMessage.
        /// </param>
        /// <param name="message">
        /// The IMidiMessage to insert.
        /// </param>
        public void Insert(int position, IMidiMessage message)
        {
            #region Require

            if(position < 0)
            {
                throw new ArgumentOutOfRangeException("position", position,
                    "IMidiMessage position out of range.");
            }
            else if(message == null)
            {
                throw new ArgumentNullException("message");
            }

            #endregion

            MidiEvent newMidiEvent = new MidiEvent(this, position, message);

            if(head == null)
            {
                head = newMidiEvent;
                tail = newMidiEvent;
            }
            else if(position >= tail.AbsoluteTicks)
            {
                newMidiEvent.Previous = tail;
                tail.Next = newMidiEvent;
                tail = newMidiEvent;
                endOfTrackMidiEvent.SetAbsoluteTicks(Length);
                endOfTrackMidiEvent.Previous = tail;
            }
            else
            {
                MidiEvent current = head;

                while(current.AbsoluteTicks < position)
                {
                    current = current.Next;
                }

                newMidiEvent.Next = current;
                newMidiEvent.Previous = current.Previous;

                if(current.Previous != null)
                {
                    current.Previous.Next = newMidiEvent;
                }
                else
                {
                    head = newMidiEvent;
                }

                current.Previous = newMidiEvent;
            }

            count++;

            #region Invariant

            AssertValid();

            #endregion
        }
예제 #23
0
        static void writeMessage(IMidiMessage m, Stream s)
        {
            s.WriteMidiMultiByte(m.DeltaTime);
            switch (m)
            {
            case IMidiEvent e:
                var status = (byte)(e.Channel | (byte)e.Type);
                if (status != running_status)
                {
                    s.WriteByte(status);
                    running_status = status;
                }
                switch (e)
                {
                case NoteOffEvent x:
                    s.WriteByte(x.Key);
                    s.WriteByte(x.Velocity);
                    break;

                case NoteOnEvent x:
                    s.WriteByte(x.Key);
                    s.WriteByte(x.Velocity);
                    break;

                case NotePressureEvent x:
                    s.WriteByte(x.Key);
                    s.WriteByte(x.Pressure);
                    break;

                case ControllerEvent x:
                    s.WriteByte(x.Controller);
                    s.WriteByte(x.Value);
                    break;

                case ProgramChgEvent x:
                    s.WriteByte(x.Program);
                    break;

                case ChannelPressureEvent x:
                    s.WriteByte(x.Pressure);
                    break;

                case PitchBendEvent x:
                    s.WriteBE(x.Bend);
                    break;
                }
                break;

            case MetaEvent e:
                // cancel running status
                running_status = 0;
                s.WriteByte(0xFF);
                s.WriteByte((byte)e.MetaType);
                switch (e)
                {
                case SequenceNumber x:
                    s.WriteMidiMultiByte(2);
                    s.WriteBE(x.Number);
                    break;

                case TextEvent x:
                    s.WriteMidiMultiByte((uint)x.Text.Length);
                    s.Write(System.Text.Encoding.ASCII.GetBytes(x.Text), 0, x.Text.Length);
                    break;

                case CopyrightNotice x:
                    s.WriteMidiMultiByte((uint)x.Text.Length);
                    s.Write(System.Text.Encoding.ASCII.GetBytes(x.Text), 0, x.Text.Length);
                    break;

                case TrackName x:
                    s.WriteMidiMultiByte((uint)x.Text.Length);
                    s.Write(System.Text.Encoding.ASCII.GetBytes(x.Text), 0, x.Text.Length);
                    break;

                case InstrumentName x:
                    s.WriteMidiMultiByte((uint)x.Text.Length);
                    s.Write(System.Text.Encoding.ASCII.GetBytes(x.Text), 0, x.Text.Length);
                    break;

                case Lyric x:
                    s.WriteMidiMultiByte((uint)x.Text.Length);
                    s.Write(System.Text.Encoding.ASCII.GetBytes(x.Text), 0, x.Text.Length);
                    break;

                case Marker x:
                    s.WriteMidiMultiByte((uint)x.Text.Length);
                    s.Write(System.Text.Encoding.ASCII.GetBytes(x.Text), 0, x.Text.Length);
                    break;

                case CuePoint x:
                    s.WriteMidiMultiByte((uint)x.Text.Length);
                    s.Write(System.Text.Encoding.ASCII.GetBytes(x.Text), 0, x.Text.Length);
                    break;

                case ChannelPrefix x:
                    s.WriteMidiMultiByte(1);
                    s.WriteByte(x.Channel);
                    break;

                case EndOfTrackEvent x:
                    s.WriteMidiMultiByte(0);
                    break;

                case TempoEvent x:
                    s.WriteMidiMultiByte(3);
                    s.WriteUInt24BE(x.MicrosPerQn);
                    break;

                case SmtpeOffset x:
                    s.WriteMidiMultiByte(5);
                    var sdata = new byte[5] {
                        x.Hours, x.Minutes, x.Seconds, x.Frames, x.FrameHundredths
                    };
                    s.Write(sdata, 0, 5);
                    break;

                case TimeSignature x:
                    s.WriteMidiMultiByte(4);
                    var tdata = new byte[4] {
                        x.Numerator, x.Denominator, x.ClocksPerTick, x.ThirtySecondNotesPer24Clocks
                    };
                    s.Write(tdata, 0, 4);
                    break;

                case KeySignature x:
                    s.WriteMidiMultiByte(2);
                    s.WriteByte(x.Sharps);
                    s.WriteByte(x.Tonality);
                    break;

                case SequencerSpecificEvent x:
                    s.WriteMidiMultiByte((uint)x.Data.Length);
                    s.Write(x.Data, 0, x.Data.Length);
                    break;
                }
                break;

            case SysexEvent e:
                // cancel running status
                running_status = 0;
                s.WriteByte(0xF0);
                s.WriteMidiMultiByte((uint)e.Data.Length);
                s.Write(e.Data, 0, e.Data.Length);
                break;
            }
        }
예제 #24
0
 /// <summary>
 /// Adds a MIDI message to the chaser to use for updating the playback
 /// settings later.
 /// </summary>
 /// <param name="message">
 /// The MIDI message to add to the chaser.
 /// </param>
 /// <remarks>
 /// Only certain MIDI messages are accepted by the chaser. If the
 /// message is not accepted, no operation occurs.
 /// </remarks>
 public void Add(IMidiMessage message)
 {
     message.Accept(this);
 }
예제 #25
0
        /// <summary>
        /// Inserts an IMidiMessage at the specified position in absolute ticks.
        /// </summary>
        /// <param name="position">
        /// The position in the Track in absolute ticks in which to insert the
        /// IMidiMessage.
        /// </param>
        /// <param name="message">
        /// The IMidiMessage to insert.
        /// </param>
        public void Insert(int position, IMidiMessage message)
        {
            #region Require

            if (position < 0)
            {
                throw new ArgumentOutOfRangeException("position", position,
                                                      "IMidiMessage position out of range.");
            }
            else if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            #endregion

            MidiEvent newMidiEvent = new MidiEvent(this, position, message);

            if (head == null)
            {
                head = newMidiEvent;
                tail = newMidiEvent;
            }
            else if (position >= tail.AbsoluteTicks)
            {
                newMidiEvent.Previous = tail;
                tail.Next             = newMidiEvent;
                tail = newMidiEvent;
                endOfTrackMidiEvent.SetAbsoluteTicks(Length);
                endOfTrackMidiEvent.Previous = tail;
            }
            else
            {
                MidiEvent current = head;

                while (current.AbsoluteTicks < position)
                {
                    current = current.Next;
                }

                newMidiEvent.Next     = current;
                newMidiEvent.Previous = current.Previous;

                if (current.Previous != null)
                {
                    current.Previous.Next = newMidiEvent;
                }
                else
                {
                    head = newMidiEvent;
                }

                current.Previous = newMidiEvent;
            }

            count++;

            #region Invariant

            AssertValid();

            #endregion
        }
        /// <summary>
        /// Display the received MIDI message in a readable format
        /// </summary>
        /// <param name="sender">Element that fired the event</param>
        /// <param name="args">The received message</param>
        private async void MidiInputDevice_MessageReceived(MidiInPort sender, MidiMessageReceivedEventArgs args)
        {
            IMidiMessage receivedMidiMessage = args.Message;

            // Build the received MIDI message into a readable format
            StringBuilder outputMessage = new StringBuilder();

            outputMessage.Append(receivedMidiMessage.Timestamp.ToString()).Append(", Type: ").Append(receivedMidiMessage.Type);

            // Add MIDI message parameters to the output, depending on the type of message
            switch (receivedMidiMessage.Type)
            {
            case MidiMessageType.NoteOff:
                var noteOffMessage = (MidiNoteOffMessage)receivedMidiMessage;
                outputMessage.Append(", Channel: ").Append(noteOffMessage.Channel).Append(", Note: ").Append(noteOffMessage.Note).Append(", Velocity: ").Append(noteOffMessage.Velocity);
                break;

            case MidiMessageType.NoteOn:
                var noteOnMessage = (MidiNoteOnMessage)receivedMidiMessage;
                outputMessage.Append(", Channel: ").Append(noteOnMessage.Channel).Append(", Note: ").Append(noteOnMessage.Note).Append(", Velocity: ").Append(noteOnMessage.Velocity);
                break;

            case MidiMessageType.PolyphonicKeyPressure:
                var polyphonicKeyPressureMessage = (MidiPolyphonicKeyPressureMessage)receivedMidiMessage;
                outputMessage.Append(", Channel: ").Append(polyphonicKeyPressureMessage.Channel).Append(", Note: ").Append(polyphonicKeyPressureMessage.Note).Append(", Pressure: ").Append(polyphonicKeyPressureMessage.Pressure);
                break;

            case MidiMessageType.ControlChange:
                var controlChangeMessage = (MidiControlChangeMessage)receivedMidiMessage;
                outputMessage.Append(", Channel: ").Append(controlChangeMessage.Channel).Append(", Controller: ").Append(controlChangeMessage.Controller).Append(", Value: ").Append(controlChangeMessage.ControlValue);
                break;

            case MidiMessageType.ProgramChange:
                var programChangeMessage = (MidiProgramChangeMessage)receivedMidiMessage;
                outputMessage.Append(", Channel: ").Append(programChangeMessage.Channel).Append(", Program: ").Append(programChangeMessage.Program);
                break;

            case MidiMessageType.ChannelPressure:
                var channelPressureMessage = (MidiChannelPressureMessage)receivedMidiMessage;
                outputMessage.Append(", Channel: ").Append(channelPressureMessage.Channel).Append(", Pressure: ").Append(channelPressureMessage.Pressure);
                break;

            case MidiMessageType.PitchBendChange:
                var pitchBendChangeMessage = (MidiPitchBendChangeMessage)receivedMidiMessage;
                outputMessage.Append(", Channel: ").Append(pitchBendChangeMessage.Channel).Append(", Bend: ").Append(pitchBendChangeMessage.Bend);
                break;

            case MidiMessageType.SystemExclusive:
                var systemExclusiveMessage = (MidiSystemExclusiveMessage)receivedMidiMessage;
                outputMessage.Append(", ");

                // Read the SysEx bufffer
                var sysExDataReader = DataReader.FromBuffer(systemExclusiveMessage.RawData);
                while (sysExDataReader.UnconsumedBufferLength > 0)
                {
                    byte byteRead = sysExDataReader.ReadByte();
                    // Pad with leading zero if necessary
                    outputMessage.Append(byteRead.ToString("X2")).Append(" ");
                }
                break;

            case MidiMessageType.MidiTimeCode:
                var timeCodeMessage = (MidiTimeCodeMessage)receivedMidiMessage;
                outputMessage.Append(", FrameType: ").Append(timeCodeMessage.FrameType).Append(", Values: ").Append(timeCodeMessage.Values);
                break;

            case MidiMessageType.SongPositionPointer:
                var songPositionPointerMessage = (MidiSongPositionPointerMessage)receivedMidiMessage;
                outputMessage.Append(", Beats: ").Append(songPositionPointerMessage.Beats);
                break;

            case MidiMessageType.SongSelect:
                var songSelectMessage = (MidiSongSelectMessage)receivedMidiMessage;
                outputMessage.Append(", Song: ").Append(songSelectMessage.Song);
                break;

            case MidiMessageType.TuneRequest:
                var tuneRequestMessage = (MidiTuneRequestMessage)receivedMidiMessage;
                break;

            case MidiMessageType.TimingClock:
                var timingClockMessage = (MidiTimingClockMessage)receivedMidiMessage;
                break;

            case MidiMessageType.Start:
                var startMessage = (MidiStartMessage)receivedMidiMessage;
                break;

            case MidiMessageType.Continue:
                var continueMessage = (MidiContinueMessage)receivedMidiMessage;
                break;

            case MidiMessageType.Stop:
                var stopMessage = (MidiStopMessage)receivedMidiMessage;
                break;

            case MidiMessageType.ActiveSensing:
                var activeSensingMessage = (MidiActiveSensingMessage)receivedMidiMessage;
                break;

            case MidiMessageType.SystemReset:
                var systemResetMessage = (MidiSystemResetMessage)receivedMidiMessage;
                break;

            case MidiMessageType.None:
                throw new InvalidOperationException();

            default:
                break;
            }

            // Use the Dispatcher to update the messages on the UI thread
            await Dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
            {
                // Skip TimingClock and ActiveSensing messages to avoid overcrowding the list. Commment this check out to see all messages
                if ((receivedMidiMessage.Type != MidiMessageType.TimingClock) && (receivedMidiMessage.Type != MidiMessageType.ActiveSensing))
                {
                    this.inputDeviceMessages.Items.Add(outputMessage + "\n");
                    this.inputDeviceMessages.ScrollIntoView(this.inputDeviceMessages.Items[this.inputDeviceMessages.Items.Count - 1]);
                    this.rootPage.NotifyUser("Message received successfully!", NotifyType.StatusMessage);
                }
            });
        }
 public PadReleasedEventArgs(byte padNumber, IMidiMessage message)
     : base(padNumber, message)
 {
 }
        public MidiSequenceReader(string fileName)
        {
            Sequence midiSequence = new Sequence();

            midiSequence.Load(fileName);

            int           division     = midiSequence.Division;
            INote         previousNote = null;
            int           previousNoteAbsoluteTicks = 0;
            double        percentageOfBarReached    = 0;
            bool          startedNoteIsClosed       = true;
            TimeSignature previousTimeSignature     = null;

            Sequence.Symbols.Add(new Clef(ClefType.GClef));

            foreach (Track track in midiSequence)
            {
                foreach (MidiEvent midiEvent in track.Iterator())
                {
                    IMidiMessage midiMessage = midiEvent.MidiMessage;
                    switch (midiMessage.MessageType)
                    {
                    case MessageType.Meta:
                        MetaMessage metaMessage = midiMessage as MetaMessage;
                        switch (metaMessage.MetaType)
                        {
                        case MetaType.TimeSignature:
                            ITimeSignatureEvent timeSignatureEvent = new MidiTimeSignatureEvent(metaMessage);
                            Sequence.Symbols.Add(timeSignatureEvent.TimeSignature);
                            previousTimeSignature = timeSignatureEvent.TimeSignature;
                            break;

                        case MetaType.Tempo:
                            ITempoEvent tempoEvent = new MidiTempoEvent(metaMessage);
                            Sequence.BeatsPerMinute = tempoEvent.BeatsPerMinute;
                            break;

                        case MetaType.EndOfTrack:
                            break;
                        }
                        break;

                    case MessageType.Channel:
                        ChannelMessage channelMessage = midiEvent.MidiMessage as ChannelMessage;
                        if (channelMessage.Command == ChannelCommand.NoteOn)
                        {
                            INoteEvent noteEvent = new MidiNoteEvent(channelMessage);
                            INote      note      = noteEvent.Note;

                            if (note != null)
                            {
                                Sequence.Symbols.Add(note);

                                previousNote        = note;
                                startedNoteIsClosed = false;
                            }
                            else
                            {
                                // Previous note must be closed
                                IBarLineEvent barLineEvent = new MidiBarLineEvent(
                                    midiEvent, previousNote, ref startedNoteIsClosed,
                                    ref previousNoteAbsoluteTicks, division, previousTimeSignature,
                                    ref percentageOfBarReached);

                                if (barLineEvent.BarLine != null)     // End of bar has been reached, start a new one
                                {
                                    Sequence.Symbols.Add(barLineEvent.BarLine);
                                }
                            }
                        }
                        break;
                    }
                }
            }
        }
        /// <summary>
        /// Dispatches IMidiMessages to their corresponding sink.
        /// </summary>
        /// <param name="message">
        /// The IMidiMessage to dispatch.
        /// </param>
        public void Dispatch(IMidiMessage message)
        {
            #region Require

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            #endregion

            switch (message.MessageType)
            {
                case MessageType.Channel:
                    OnChannelMessageDispatched(new ChannelMessageEventArgs((ChannelMessage)message));
                    break;

                case MessageType.SystemExclusive:
                    OnSysExMessageDispatched(new SysExMessageEventArgs((SysExMessage)message));
                    break;

                case MessageType.Meta:
                    OnMetaMessageDispatched(new MetaMessageEventArgs((MetaMessage)message));
                    break;

                case MessageType.SystemCommon:
                    OnSysCommonMessageDispatched(new SysCommonMessageEventArgs((SysCommonMessage)message));
                    break;

                case MessageType.SystemRealtime:
                    switch (((SysRealtimeMessage)message).SysRealtimeType)
                    {
                        case SysRealtimeType.ActiveSense:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.ActiveSense);
                            break;

                        case SysRealtimeType.Clock:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Clock);
                            break;

                        case SysRealtimeType.Continue:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Continue);
                            break;

                        case SysRealtimeType.Reset:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Reset);
                            break;

                        case SysRealtimeType.Start:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Start);
                            break;

                        case SysRealtimeType.Stop:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Stop);
                            break;

                        case SysRealtimeType.Tick:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Tick);
                            break;
                    }

                    break;
            }
        }
 public MidiEvent Insert(int absoluteTicks, IMidiMessage ev)
 {
     return midiTrack.Insert(absoluteTicks, ev);
 }
예제 #31
0
        private bool IsTrackNameMetaMessage(IMidiMessage message)
        {
            // Guard.
            if(!(message is MetaMessage))
                return false;

            MetaMessage msg = (MetaMessage)message;

            if(msg.Type == MetaType.TrackName)
                return true;
            else
                return false;
        }
예제 #32
0
        protected void SendMessage(IMidiMessage message)
        {
            Type type = message.GetType();
            if (type == typeof(ChannelMessage))
                this._midiSender.Send((ChannelMessage)message);
            else if (type == typeof(SysExMessage))
                this._midiSender.Send((SysExMessage)message);

            if (TrackMessage!=null)
                TrackMessage(this, message);
        }
 public PadEventArgs(byte padNumber, IMidiMessage message)
 {
     PadNumber = padNumber;
     Message   = message;
 }
예제 #34
0
 public void SendMessage(IMidiMessage midiMessage)
 {
     throw new NotImplementedException();
 }
 public PadPressedEventArgs(byte padNumber, byte velocity, IMidiMessage message)
     : base(padNumber, message)
 {
     Velocity = velocity;
 }
예제 #36
0
파일: MidiEvent.cs 프로젝트: Jbtyson/cis598
        /// <summary>
        /// Initializes a new instance of the Midi event struct with the 
        /// specified Midi message and the number of ticks for this event.
        /// </summary>
        /// <param name="message">
        /// The Midi message for the event.
        /// </param>
        /// <param name="ticks">
        /// The delta tick value for the event.
        /// </param>
		public MidiEvent(IMidiMessage message, int ticks)
		{
            this.message = message;
            this.ticks = ticks;
		}  
        /// <summary>
        /// Dispatches IMidiMessages to their corresponding sink.
        /// </summary>
        /// <param name="message">
        /// The IMidiMessage to dispatch.
        /// </param>
        public void Dispatch(IMidiMessage message)
        {
            #region Require

            if(message == null)
            {
                throw new ArgumentNullException("message");
            }

            #endregion

            switch(message.MessageType)
            {
                case MessageType.Channel:
                    OnChannelMessageDispatched(new ChannelMessageEventArgs((ChannelMessage)message));
                    break;

                case MessageType.SystemExclusive:
                    OnSysExMessageDispatched(new SysExMessageEventArgs((SysExMessage)message));
                    break;

                case MessageType.Meta:
                    //OnMetaMessageDispatched(new MetaMessageEventArgs((MetaMessage)message));
                    //broke this so it would stop %$&^ing around after position data was changed. UNFORGIVABLE
                    break;

                case MessageType.SystemCommon:
                    OnSysCommonMessageDispatched(new SysCommonMessageEventArgs((SysCommonMessage)message));
                    break;

                case MessageType.SystemRealtime:
                    switch(((SysRealtimeMessage)message).SysRealtimeType)
                    {
                        case SysRealtimeType.ActiveSense:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.ActiveSense);
                            break;

                        case SysRealtimeType.Clock:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Clock);
                            break;

                        case SysRealtimeType.Continue:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Continue);
                            break;

                        case SysRealtimeType.Reset:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Reset);
                            break;

                        case SysRealtimeType.Start:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Start);
                            break;

                        case SysRealtimeType.Stop:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Stop);
                            break;

                        case SysRealtimeType.Tick:
                            OnSysRealtimeMessageDispatched(SysRealtimeMessageEventArgs.Tick);
                            break;
                    }

                    break;
            }
        }
예제 #38
0
        /// <summary>
        /// TODO: Create our own domain classes to be independent of external libraries/languages.
        /// </summary>
        /// <param name="sequence"></param>
        /// <returns></returns>
        public string LoadMidiIntoLilypond(Sequence sequence)
        {
            StringBuilder lilypondContent = new StringBuilder();

            lilypondContent.AppendLine("\\relative c' {");
            lilypondContent.AppendLine("\\clef treble");

            int    division                  = sequence.Division;
            int    previousMidiKey           = 60; // Central C;
            int    previousNoteAbsoluteTicks = 0;
            double percentageOfBarReached    = 0;
            bool   startedNoteIsClosed       = true;

            for (int i = 0; i < sequence.Count(); i++)
            {
                Track track = sequence[i];

                foreach (var midiEvent in track.Iterator())
                {
                    IMidiMessage midiMessage = midiEvent.MidiMessage;
                    // TODO: Split this switch statements and create separate logic.
                    // We want to split this so that we can expand our functionality later with new keywords for example.
                    // Hint: Command pattern? Strategies? Factory method?
                    switch (midiMessage.MessageType)
                    {
                    case MessageType.Meta:
                        var metaMessage = midiMessage as MetaMessage;
                        switch (metaMessage.MetaType)
                        {
                        case MetaType.TimeSignature:
                            byte[] timeSignatureBytes = metaMessage.GetBytes();
                            _beatNote    = timeSignatureBytes[0];
                            _beatsPerBar = (int)(1 / Math.Pow(timeSignatureBytes[1], -2));
                            lilypondContent.AppendLine($"\\time {_beatNote}/{_beatsPerBar}");
                            break;

                        case MetaType.Tempo:
                            byte[] tempoBytes = metaMessage.GetBytes();
                            int    tempo      = (tempoBytes[0] & 0xff) << 16 | (tempoBytes[1] & 0xff) << 8 | (tempoBytes[2] & 0xff);
                            _bpm = 60000000 / tempo;
                            lilypondContent.AppendLine($"\\tempo 4={_bpm}");
                            break;

                        case MetaType.EndOfTrack:
                            if (previousNoteAbsoluteTicks > 0)
                            {
                                // Finish the last notelength.
                                double percentageOfBar;
                                lilypondContent.Append(MidiToLilyHelper.GetLilypondNoteLength(previousNoteAbsoluteTicks, midiEvent.AbsoluteTicks, division, _beatNote, _beatsPerBar, out percentageOfBar));
                                lilypondContent.Append(" ");

                                percentageOfBarReached += percentageOfBar;
                                if (percentageOfBarReached >= 1)
                                {
                                    lilypondContent.AppendLine("|");
                                    percentageOfBar = percentageOfBar - 1;
                                }
                            }
                            break;

                        default: break;
                        }
                        break;

                    case MessageType.Channel:
                        var channelMessage = midiEvent.MidiMessage as ChannelMessage;
                        if (channelMessage.Command == ChannelCommand.NoteOn)
                        {
                            if (channelMessage.Data2 > 0)    // Data2 = loudness
                            {
                                // Append the new note.
                                lilypondContent.Append(MidiToLilyHelper.GetLilyNoteName(previousMidiKey, channelMessage.Data1));

                                previousMidiKey     = channelMessage.Data1;
                                startedNoteIsClosed = false;
                            }
                            else if (!startedNoteIsClosed)
                            {
                                // Finish the previous note with the length.
                                double percentageOfBar;
                                lilypondContent.Append(MidiToLilyHelper.GetLilypondNoteLength(previousNoteAbsoluteTicks, midiEvent.AbsoluteTicks, division, _beatNote, _beatsPerBar, out percentageOfBar));
                                previousNoteAbsoluteTicks = midiEvent.AbsoluteTicks;
                                lilypondContent.Append(" ");

                                percentageOfBarReached += percentageOfBar;
                                if (percentageOfBarReached >= 1)
                                {
                                    lilypondContent.AppendLine("|");
                                    percentageOfBarReached -= 1;
                                }
                                startedNoteIsClosed = true;
                            }
                            else
                            {
                                lilypondContent.Append("r");
                            }
                        }
                        break;
                    }
                }
            }

            lilypondContent.Append("}");

            return(lilypondContent.ToString());
        }
예제 #39
0
        public MidiEvent Insert(int position, IMidiMessage message)
        {
            var newMidiEvent = new MidiEvent(position, message);

            if (newMidiEvent.Command == ChannelCommand.NoteOn && newMidiEvent.Data2 == 0)
            {
                newMidiEvent.SetChanMessageData(ChannelMessage.PackCommand(newMidiEvent.MessageData, ChannelCommand.NoteOff));
            }

            var isAtEnd       = position >= Length - 1;
            var isChanMessage = newMidiEvent.MessageType == MessageType.Channel;

            if (isAtEnd)
            {
                AddEvent(newMidiEvent);
            }
            else
            {
                var after = eventList.SkipWhile(x => x.AbsoluteTicks < position).ToList();

                if (!after.Any())
                {
                    AddEvent(newMidiEvent);
                }
                else
                {
                    var eq = after.TakeWhile(x => x.AbsoluteTicks == position).ToList();
                    if (!eq.Any())
                    {
                        InsertAt(eventList.IndexOf(after.First()), newMidiEvent);
                    }
                    else
                    {
                        if (message.MessageType == MessageType.Channel)
                        {
                            var chanMess = (ChannelMessage)message;

                            var eqChan = eq.Where(x => x.MessageType == MessageType.Channel).ToList().Select(x => new ChannelMessage(x.MessageData)).ToList();

                            if (!eqChan.Any())
                            {
                                InsertAt(eventList.IndexOf(eq.First()), newMidiEvent);
                            }
                            else
                            {
                                if (chanMess.Command == ChannelCommand.NoteOff)
                                {
                                    InsertAt(eventList.IndexOf(eq.First()), newMidiEvent);
                                }
                                else
                                {
                                    InsertAt(eventList.IndexOf(eq.Last()) + 1, newMidiEvent);
                                }
                            }
                        }
                        else
                        {
                            InsertAt(eventList.IndexOf(eq.First()), newMidiEvent);
                        }
                    }
                }
            }

            Dirty = true;
            return(newMidiEvent);
        }
예제 #40
0
        private void tp_TrackMessage(object sender, IMidiMessage message)
        {
            if (!(message is Endogine.Midi.ChannelMessage)) //message.GetType() != typeof(Endogine.Midi.ChannelMessage))
                return;

            TrackPlayer tp = (TrackPlayer)sender;
            ChannelMessage cm = (ChannelMessage)message;
            if (cm.Command != ChannelCommand.NoteOn)
                return;
            if (cm.Data2 == 0)
                return;

            this._factory.CreateInteractor(tp, cm);
        }