private Dictionary <int, List <MidiEventExecutorBase> > ReadMidiTrack(List <MidiEventBase> aMidiEventList) { Dictionary <int, List <MidiEventExecutorBase> > lListDictionary = new Dictionary <int, List <MidiEventExecutorBase> >(); for (int i = 0; i < aMidiEventList.Count; i++) { MidiEventBase lMidiEvent = aMidiEventList[i]; MidiEventExecutorBase lEventAffecter = null; if (lListDictionary.ContainsKey(lMidiEvent.GetDelta()) == false) { lListDictionary.Add(lMidiEvent.GetDelta(), new List <MidiEventExecutorBase>()); } switch (lMidiEvent.GetType().ToString()) { case "Curan.Common.FormalizedData.File.Midi.MidiEventNoteOff": lEventAffecter = new MidiEventExecutorNoteOff(( MidiEventNoteOff )lMidiEvent); break; case "Curan.Common.FormalizedData.File.Midi.MidiEventNoteOn": byte lVelocity = lMidiEvent.GetData2(); if (lVelocity != 0) { int lDelta = lMidiEvent.GetDelta(); byte lChannel = lMidiEvent.GetChannel(); byte lNote = lMidiEvent.GetData1(); // オートオン情報を取得する. for (int j = i + 1; j < aMidiEventList.Count; j++) { MidiEventBase lMidiEventNext = aMidiEventList[j]; int lDeltaNext = lMidiEventNext.GetDelta(); byte lStateNext = lMidiEventNext.GetState(); byte lChannelNext = lMidiEventNext.GetChannel(); byte lNoteNext = lMidiEventNext.GetData1(); byte lVelocityNext = lMidiEventNext.GetData2(); if (lDeltaNext != lDelta) { // 次にノートオフされるまでの長さを取得する. // ノートオフまたはVelocity0のノートオンメッセージの時. if (lChannelNext == lChannel && lNoteNext == lNote && (lStateNext == 0x80 || (lStateNext == 0x90 && lVelocityNext == 0))) { int lLength = lDeltaNext - lDelta; lEventAffecter = new MidiEventExecutorNoteOn(( MidiEventNoteOn )lMidiEvent, lLength); break; } } } } break; case "Curan.Common.FormalizedData.File.Midi.MidiEventControlChange": lEventAffecter = new MidiEventExecutorControlChange(( MidiEventControlChange )lMidiEvent); break; case "Curan.Common.FormalizedData.File.Midi.MidiEventProgramChange": lEventAffecter = new MidiEventExecutorProgramChange(( MidiEventProgramChange )lMidiEvent); break; case "Curan.Common.FormalizedData.File.Midi.MidiEventKeyPressure": lEventAffecter = new MidiEventExecutorKeyPressure(( MidiEventKeyPressure )lMidiEvent); break; case "Curan.Common.FormalizedData.File.Midi.MidiEventPitchWheelChange": lEventAffecter = new MidiEventExecutorPitchWheelChange(( MidiEventPitchWheelChange )lMidiEvent); break; case "Curan.Common.FormalizedData.File.Midi.MidiEventSystemExclusive": lEventAffecter = new MidiEventExecutorSystemExclusive(( MidiEventSystemExclusive )lMidiEvent); break; default: Logger.LogWarning("Null"); break; } lListDictionary[lMidiEvent.GetDelta()].Add(lEventAffecter); } return(lListDictionary); }
public int GetState() { return(midiEvent.GetState()); }