Beispiel #1
0
        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);
        }
Beispiel #2
0
 protected MidiEventExecutorBase(MidiEventBase aMidiEvent)
 {
     midiEvent = aMidiEvent;
 }