private void ImportNotes()
        {
            foreach (var midiEvent in fMidiEvents)
            {
                if (midiEvent is NoteOn)
                {
                    var noteOnEvent = (NoteOn)midiEvent;

                    this.AddNewNote(MidiEvent.GetNoteName(noteOnEvent.Note), noteOnEvent.DeltaTime, noteOnEvent.Velocity);
                }
                else if (midiEvent is NoteOff)
                {
                    var noteOffEvent = (NoteOff)midiEvent;

                    this.AddNewNote(MidiEvent.GetNoteName(noteOffEvent.Note), noteOffEvent.DeltaTime, 0);

                    //this.AddNewNote(MidiEvent.GetNoteName(noteOffEvent.Note), noteOffEvent.DeltaTime, noteOffEvent.Velocity);

                    //if (noteOffEvent.Velocity > 0)
                    //    this.AddNewNote(MidiEvent.GetNoteName(noteOffEvent.Note), 0, 0);
                }
            }
            var numberOfNotFinalizedNotes = fScoreNotes.Where(p => p.Value.DurationInTicks == null).Count();

            if (numberOfNotFinalizedNotes > 0)
            {
                throw new InvalidMidiEventsSequence(string.Format("Invalid MIDI event collection. "
                                                                  + "We found {0} not finalized notes.",
                                                                  numberOfNotFinalizedNotes));
            }
        }
            /// <summary>Generates a line of code to add the specified event to the "events" list.</summary>
            /// <param name="ev">The event to be added.</param>
            void GenerateAddEvent(MidiEvent ev)
            {
                string eventName   = ev.GetType().Name;
                string eventParams =
                    Case <BaseTextMetaMidiEvent>(ev, e => Commas(e.DeltaTime, TextString(e.Text))) ??
                    Case <NoteVoiceMidiEvent>(ev, e =>
                                              e.Channel == (byte)SpecialChannel.Percussion && Enum.IsDefined(typeof(GeneralMidiPercussion), e.Note) ?
                                              Commas(e.DeltaTime, "GeneralMidiPercussion." + (GeneralMidiPercussion)e.Note, e.Parameter2) :
                                              Commas(e.DeltaTime, e.Channel, "\"" + MidiEvent.GetNoteName(e.Note) + "\"", e.Parameter2)) ??
                    Case <ProgramChangeVoiceMidiEvent>(ev, e =>
                                                       Enum.IsDefined(typeof(GeneralMidiInstrument), e.Number) ?
                                                       Commas(e.DeltaTime, e.Channel, "GeneralMidiInstrument." + (GeneralMidiInstrument)e.Number) :
                                                       Commas(e.DeltaTime, e.Channel, e.Number)) ??
                    Case <SystemExclusiveMidiEvent>(ev, e => Commas(e.DeltaTime, ByteArrayCreationString(e.Data))) ??
                    Case <ChannelPrefixMetaMidiEvent>(ev, e => Commas(e.DeltaTime, e.Prefix)) ??
                    Case <EndOfTrackMetaMidiEvent>(ev, e => Commas(e.DeltaTime)) ??
                    Case <KeySignatureMetaMidiEvent>(ev, e => Commas(e.DeltaTime, "Key." + e.Key, "Tonality." + e.Tonality)) ??
                    Case <MidiPortMetaMidiEvent>(ev, e => Commas(e.DeltaTime, e.Port)) ??
                    Case <ProprietaryMetaMidiEvent>(ev, e => Commas(e.DeltaTime, ByteArrayCreationString(e.Data))) ??
                    Case <SequenceNumberMetaMidiEvent>(ev, e => Commas(e.DeltaTime, e.Number)) ??
                    Case <SMPTEOffsetMetaMidiEvent>(ev, e => Commas(e.DeltaTime, e.Hours, e.Minutes, e.Seconds, e.Frames, e.FractionalFrames)) ??
                    Case <TempoMetaMidiEvent>(ev, e => Commas(e.DeltaTime, e.Value)) ??
                    Case <TimeSignatureMetaMidiEvent>(ev, e => Commas(e.DeltaTime, e.Numerator, e.Denominator, e.MidiClocksPerClick, e.NumberOfNotated32nds)) ??
                    Case <UnknownMetaMidiEvent>(ev, e => Commas(e.DeltaTime, ByteArrayCreationString(e.Data))) ??
                    Case <ChannelPressureVoiceMidiEvent>(ev, e => Commas(e.DeltaTime, e.Channel, e.Pressure)) ??
                    Case <ControllerVoiceMidiEvent>(ev, e => Commas(e.DeltaTime, e.Channel, "Controller." + (Controller)e.Number, e.Value)) ??
                    Case <PitchWheelVoiceMidiEvent>(ev, e => Commas(e.DeltaTime, e.Channel, "PitchWheelStep." + (PitchWheelStep)e.Position)) ??
                    null;

                if (eventParams == null)
                {
                    throw new ArgumentException("Unknown MidiEvent");
                }
                Ln(EventsListName, ".Add(new ", eventName, "(", eventParams, "));");
            }
Beispiel #3
0
        public void CheckTheFirstChord()
        {
            var sequence     = MidiSequence.Import(MIDI_for_whom_the_bell_tolls);
            var guitar1Track = sequence.GetTracks()[2];

            var           listOfChords = new List <List <NoteOn> >();
            List <NoteOn> chordNotes   = null;
            bool          isPause      = false;

            foreach (MidiEvent midiEvent in guitar1Track.Events)
            {
                if (midiEvent is NoteOn)
                {
                    var note = (NoteOn)midiEvent;
                    if (note.DeltaTime > 0)
                    {
                        if ((chordNotes != null) && (chordNotes.Count > 0))
                        {
                            listOfChords.Add(chordNotes);
                        }

                        chordNotes = new List <NoteOn>();

                        isPause = (note.Velocity == 0); //used for the next notes of the acord (same time)
                    }

                    if ((note.Velocity > 0) && (!isPause))
                    {
                        chordNotes.Add(note);
                    }
                }
            }

            //start on 1680 from the beggining
            {
                var chord = listOfChords[0];

                Assert.AreEqual(3, chord.Count);

                Assert.AreEqual(1680, chord[0].DeltaTime);
                Assert.AreEqual(100, chord[0].Velocity);

                Assert.AreEqual("C#4", MidiEvent.GetNoteName(chord[0].Note));
                Assert.AreEqual("F#4", MidiEvent.GetNoteName(chord[1].Note));
                Assert.AreEqual("F#3", MidiEvent.GetNoteName(chord[2].Note));
            }

            //start on 40 after the last event
            {
                var chord = listOfChords[1];

                Assert.AreEqual(3, chord.Count);

                Assert.AreEqual(40, chord[0].DeltaTime);
                Assert.AreEqual(100, chord[0].Velocity);

                Assert.AreEqual("C#4", MidiEvent.GetNoteName(chord[0].Note));
                Assert.AreEqual("F#4", MidiEvent.GetNoteName(chord[1].Note));
                Assert.AreEqual("F#3", MidiEvent.GetNoteName(chord[2].Note));
            }

            //and so on...

            /*
             *      track.Events.Add(new NoteOn(1680, 1, "C#4", 100));
             *      track.Events.Add(new NoteOn(0, 1, "F#4", 100));
             *      track.Events.Add(new NoteOn(0, 1, "F#3", 100));
             *      track.Events.Add(new NoteOn(40, 1, "F#3", 0));
             *      track.Events.Add(new NoteOn(0, 1, "F#4", 0));
             *      track.Events.Add(new NoteOn(0, 1, "C#4", 0));
             *      track.Events.Add(new NoteOn(0, 1, "C#4", 100));
             *      track.Events.Add(new NoteOn(0, 1, "F#4", 100));
             *      track.Events.Add(new NoteOn(0, 1, "F#3", 100));
             *      track.Events.Add(new NoteOn(40, 1, "F#3", 0));
             *      track.Events.Add(new NoteOn(0, 1, "F#4", 0));
             *      track.Events.Add(new NoteOn(0, 1, "C#4", 0));
             *      track.Events.Add(new NoteOn(40, 1, "C#4", 100));
             *      track.Events.Add(new NoteOn(0, 1, "F#4", 100));
             *      track.Events.Add(new NoteOn(0, 1, "F#3", 100));
             */
        }
Beispiel #4
0
        /// <summary>Creates an object creation expression for an event.</summary>
        /// <param name="ev">The event to create.</param>
        /// <returns>The object creation expression for the event.</returns>
        private static CodeObjectCreateExpression CreateVoiceEvent(MidiEvent ev)
        {
            CodeObjectCreateExpression newEvent = null;
            CodeExpression             delta    = new CodePrimitiveExpression(ev.DeltaTime);

            // NOTE ON
            if (ev is NoteOn)
            {
                NoteOn midiEvent = (NoteOn)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(NoteOn),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Channel),
                    new CodePrimitiveExpression(MidiEvent.GetNoteName(midiEvent.Note)),
                    new CodePrimitiveExpression(midiEvent.Velocity)
                });
            }

            // NOTE OFF
            else if (ev is NoteOff)
            {
                NoteOff midiEvent = (NoteOff)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(NoteOff),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Channel),
                    new CodePrimitiveExpression(MidiEvent.GetNoteName(midiEvent.Note)),
                    new CodePrimitiveExpression(midiEvent.Velocity)
                });
            }

            // AFTERTOUCH
            else if (ev is Aftertouch)
            {
                Aftertouch midiEvent = (Aftertouch)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Aftertouch),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Channel),
                    new CodePrimitiveExpression(MidiEvent.GetNoteName(midiEvent.Note)),
                    new CodePrimitiveExpression(midiEvent.Pressure)
                });
            }

            // PROGRAM CHANGE
            else if (ev is ProgramChange)
            {
                ProgramChange midiEvent = (ProgramChange)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(ProgramChange),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Channel),
                    new CodeCastExpression(typeof(GeneralMidiInstruments), new CodePrimitiveExpression(midiEvent.Number))
                });
            }

            // CONTROLLER
            else if (ev is Controller)
            {
                Controller midiEvent = (Controller)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(Controller),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Channel),
                    new CodeCastExpression(typeof(Controllers), new CodePrimitiveExpression(midiEvent.Number)),
                    new CodePrimitiveExpression(midiEvent.Value),
                });
            }

            // CHANNEL PRESSURE
            else if (ev is ChannelPressure)
            {
                ChannelPressure midiEvent = (ChannelPressure)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(ChannelPressure),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Channel),
                    new CodePrimitiveExpression(midiEvent.Pressure)
                });
            }

            // PITCH WHEEL
            else if (ev is PitchWheel)
            {
                PitchWheel midiEvent = (PitchWheel)ev;
                newEvent = new CodeObjectCreateExpression(
                    typeof(PitchWheel),
                    new CodeExpression[] {
                    delta,
                    new CodePrimitiveExpression(midiEvent.Channel),
                    new CodePrimitiveExpression(midiEvent.UpperBits),
                    new CodePrimitiveExpression(midiEvent.LowerBits)
                });
            }

            // Return the event
            return(newEvent);
        }
Beispiel #5
0
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Obtain the number of bytes waiting in the port's buffer
            int bytes = comport.BytesToRead;

            // Create a byte array buffer to hold the incoming data
            byte[] buffer = new byte[bytes];
            comport.Read(buffer, 0, bytes);
            for (int c = 0; c < bytes; c++)
            {
                midiQueue.Enqueue(buffer[c]);
            }
            if (CurrentDataMode == DataMode.Hex)
            {
                Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
            }
            while (midiQueue.Count > 0)
            {
                midiMsg.Enqueue(midiQueue.Dequeue());
                if (midiMsg.Count == 3)
                {
                    byte byteOne   = midiMsg.Dequeue();
                    byte byteTwo   = midiMsg.Dequeue();
                    byte byteThree = midiMsg.Dequeue();
                    // sanatize everything for MidiPlayer
                    if (byteTwo > 127)
                    {
                        byteTwo = 127;
                    }
                    if (byteThree > 127)
                    {
                        byteThree = 127;
                    }

                    if (byteOne >= 0x90 && byteOne <= 0x9F)
                    {
                        byteOne -= 0x90;
                        MidiPlayer.Play(new NoteOn(1, byteOne, byteTwo, byteThree));
                        if (CurrentDataMode == DataMode.Text)
                        {
                            Log(LogMsgType.Normal, String.Format("Channel: {1} Note: {0} Velocity: {2}", MidiEvent.GetNoteName(byteTwo), byteOne + 1, byteThree));
                        }
                    }
                    else if (byteOne >= 0xB0 && byteOne <= 0xBF)
                    {
                        byteOne -= 0xB0;
                        MidiPlayer.Play(new Controller(0, byteOne, byteTwo, byteThree));
                        if (CurrentDataMode == DataMode.Text)
                        {
                            Log(LogMsgType.Normal, String.Format("Channel: {0} CC: {1} Value: {2}", byteOne + 1, byteTwo, byteThree));
                        }
                    }
                }
            }
        }