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, "));"); }
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)); */ }
/// <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); }
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)); } } } } }