Example #1
0
    private void loadStream(Stream stream, bool reloading = false)
    {
        byte[] array = new byte[4];
        stream.Read(array, 0, 4);
        if (Encoding.UTF8.GetString(array, 0, array.Length) != "MThd")
        {
            return;
        }
        midiHeader = new MidiHeader();
        stream.Read(array, 0, 4);
        Array.Reverse(array);
        BitConverter.ToInt32(array, 0);
        array = new byte[2];
        stream.Read(array, 0, 2);
        Array.Reverse(array);
        midiHeader.setMidiFormat(BitConverter.ToInt16(array, 0));
        stream.Read(array, 0, 2);
        Array.Reverse(array);
        int num = BitConverter.ToInt16(array, 0);

        stream.Read(array, 0, 2);
        Array.Reverse(array);
        int num2 = BitConverter.ToInt16(array, 0);

        midiHeader.DeltaTiming = (num2 & 0x7FFF);
        midiHeader.TimeFormat  = (((num2 & 0x8000) > 0) ? MidiHelper.MidiTimeFormat.FamesPerSecond : MidiHelper.MidiTimeFormat.TicksPerBeat);
        bool flag = (!reloading || tracks.Count != num) ? true : false;

        if (flag)
        {
            tracks.Clear();
            seqEvt.Events.Clear();
        }
        int num3 = 0;

        while (true)
        {
            if (num3 >= num)
            {
                return;
            }
            MidiTrack          midiTrack          = null;
            MidiSequencerEvent midiSequencerEvent = null;
            if (flag)
            {
                midiTrack = new MidiTrack();
                tracks.Add(midiTrack);
                midiSequencerEvent = new MidiSequencerEvent();
                seqEvt.Events.Add(midiSequencerEvent);
            }
            else
            {
                midiTrack           = tracks[num3];
                midiTrack.TotalTime = 0uL;
                midiSequencerEvent  = seqEvt.Events[num3];
            }
            List <byte>      list  = new List <byte>();
            List <byte>      list2 = new List <byte>();
            List <MidiEvent> list3 = new List <MidiEvent>();
            list.Add(0);
            list2.Add(0);
            array = new byte[4];
            stream.Read(array, 0, 4);
            if (Encoding.UTF8.GetString(array, 0, array.Length) != "MTrk")
            {
                break;
            }
            stream.Read(array, 0, 4);
            Array.Reverse(array);
            int num4 = BitConverter.ToInt32(array, 0);
            array = new byte[num4];
            stream.Read(array, 0, num4);
            int       i    = 0;
            byte      b    = 0;
            int       num5 = 0;
            MidiEvent midiEvent;
            for (; i < array.Length; list3.Add(midiEvent), tracks[num3].TotalTime = tracks[num3].TotalTime + midiEvent.deltaTime)
            {
                ushort numOfBytes = 0;
                uint   data       = BitConverter.ToUInt32(array, i);
                midiEvent           = new MidiEvent();
                midiEvent.deltaTime = GetTime(data, ref numOfBytes);
                i += 4 - (4 - numOfBytes);
                byte b2   = array[i];
                int  num6 = GetChannel(b2);
                if (b2 < 128)
                {
                    b2   = b;
                    num6 = num5;
                    i--;
                }
                if (b2 != byte.MaxValue)
                {
                    b2 = (byte)(b2 & 0xF0);
                }
                b    = b2;
                num5 = num6;
                switch (b2)
                {
                case 128:
                    midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_Off;
                    i++;
                    midiEvent.channel       = (byte)num6;
                    midiEvent.Parameters[0] = midiEvent.channel;
                    midiEvent.parameter1    = array[i++];
                    midiEvent.parameter2    = array[i++];
                    midiEvent.Parameters[1] = midiEvent.parameter1;
                    midiEvent.Parameters[2] = midiEvent.parameter2;
                    continue;

                case 144:
                    midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_On;
                    i++;
                    midiEvent.channel       = (byte)num6;
                    midiEvent.Parameters[0] = midiEvent.channel;
                    midiEvent.parameter1    = array[i++];
                    midiEvent.parameter2    = array[i++];
                    midiEvent.Parameters[1] = midiEvent.parameter1;
                    midiEvent.Parameters[2] = midiEvent.parameter2;
                    if (midiEvent.parameter2 == 0)
                    {
                        midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_Off;
                    }
                    tracks[num3].NotesPlayed++;
                    continue;

                case 160:
                    midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_Aftertouch;
                    midiEvent.channel          = (byte)num6;
                    midiEvent.Parameters[0]    = midiEvent.channel;
                    i++;
                    midiEvent.parameter1 = array[++i];
                    midiEvent.parameter2 = array[++i];
                    continue;

                case 176:
                    midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Controller;
                    midiEvent.channel          = (byte)num6;
                    midiEvent.Parameters[0]    = midiEvent.channel;
                    i++;
                    midiEvent.parameter1    = array[i++];
                    midiEvent.parameter2    = array[i++];
                    midiEvent.Parameters[1] = midiEvent.parameter1;
                    midiEvent.Parameters[2] = midiEvent.parameter2;
                    continue;

                case 192:
                    midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Program_Change;
                    midiEvent.channel          = (byte)num6;
                    midiEvent.Parameters[0]    = midiEvent.channel;
                    i++;
                    midiEvent.parameter1    = array[i++];
                    midiEvent.Parameters[1] = midiEvent.parameter1;
                    if (midiEvent.channel != 9)
                    {
                        if (!list.Contains(midiEvent.parameter1))
                        {
                            list.Add(midiEvent.parameter1);
                        }
                    }
                    else if (!list2.Contains(midiEvent.parameter1))
                    {
                        list2.Add(midiEvent.parameter1);
                    }
                    continue;

                case 208:
                    midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Channel_Aftertouch;
                    midiEvent.channel          = (byte)num6;
                    midiEvent.Parameters[0]    = midiEvent.channel;
                    i++;
                    midiEvent.parameter1 = array[++i];
                    continue;

                case 224:
                {
                    midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Pitch_Bend;
                    midiEvent.channel          = (byte)num6;
                    midiEvent.Parameters[0]    = midiEvent.channel;
                    i++;
                    midiEvent.parameter1 = array[++i];
                    midiEvent.parameter2 = array[++i];
                    ushort parameter = midiEvent.parameter1;
                    parameter = (ushort)(parameter << 7);
                    parameter = (ushort)(parameter | midiEvent.parameter2);
                    midiEvent.Parameters[1] = ((double)(int)parameter - 8192.0) / 8192.0;
                    continue;
                }

                case byte.MaxValue:
                    switch (array[++i])
                    {
                    case 0:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Sequence_Number;
                        i++;
                        break;

                    case 1:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Text_Event;
                        i++;
                        midiEvent.parameter1    = array[i++];
                        midiEvent.Parameters[0] = midiEvent.parameter1;
                        midiEvent.Parameters[1] = Encoding.UTF8.GetString(array, i, array[i - 1]);
                        i += array[i - 1];
                        break;

                    case 2:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Copyright_Notice;
                        i++;
                        midiEvent.parameter1    = array[i++];
                        midiEvent.Parameters[0] = midiEvent.parameter1;
                        midiEvent.Parameters[1] = Encoding.UTF8.GetString(array, i, array[i - 1]);
                        i += array[i - 1];
                        break;

                    case 3:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Sequence_Or_Track_Name;
                        i++;
                        midiEvent.parameter1    = array[i++];
                        midiEvent.Parameters[0] = midiEvent.parameter1;
                        midiEvent.Parameters[1] = Encoding.UTF8.GetString(array, i, array[i - 1]);
                        i += array[i - 1];
                        break;

                    case 4:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Instrument_Name;
                        i++;
                        midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]);
                        i += array[i] + 1;
                        break;

                    case 5:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Lyric_Text;
                        i++;
                        midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]);
                        i += array[i] + 1;
                        break;

                    case 6:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Marker_Text;
                        i++;
                        midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]);
                        i += array[i] + 1;
                        break;

                    case 7:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Cue_Point;
                        i++;
                        midiEvent.Parameters[0] = Encoding.UTF8.GetString(array, i + 1, array[i]);
                        i += array[i] + 1;
                        break;

                    case 32:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Midi_Channel_Prefix_Assignment;
                        i++;
                        midiEvent.parameter1    = array[i++];
                        midiEvent.Parameters[0] = midiEvent.parameter1;
                        midiEvent.Parameters[1] = array[i++];
                        break;

                    case 47:
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.End_of_Track;
                        i += 2;
                        break;

                    case 81:
                    {
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Tempo;
                        i++;
                        midiEvent.Parameters[4] = array[i++];
                        byte[] array3 = new byte[4];
                        for (int num29 = 0; num29 < 3; num29++)
                        {
                            array3[num29 + 1] = array[num29 + i];
                        }
                        i += 3;
                        byte[] array4 = new byte[4];
                        for (int num30 = 0; num30 < 4; num30++)
                        {
                            array4[3 - num30] = array3[num30];
                        }
                        uint num31 = BitConverter.ToUInt32(array4, 0);
                        midiEvent.Parameters[0] = num31;
                        break;
                    }

                    case 84:
                    {
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Smpte_Offset;
                        i++;
                        int num16 = array[i++];
                        if (num16 >= 4)
                        {
                            for (int n = 0; n < 4; n++)
                            {
                                midiEvent.Parameters[n] = array[i++];
                            }
                        }
                        else
                        {
                            for (int num18 = 0; num18 < num16; num18++)
                            {
                                midiEvent.Parameters[num18] = array[i++];
                            }
                        }
                        for (int num20 = 4; num20 < num16; num20++)
                        {
                            i++;
                        }
                        break;
                    }

                    case 88:
                    {
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Time_Signature;
                        i++;
                        int num22 = array[i++];
                        if (num22 >= 4)
                        {
                            for (int num23 = 0; num23 < 4; num23++)
                            {
                                midiEvent.Parameters[num23] = array[i++];
                            }
                        }
                        else
                        {
                            for (int num25 = 0; num25 < num22; num25++)
                            {
                                midiEvent.Parameters[num25] = array[i++];
                            }
                        }
                        for (int num27 = 4; num27 < num22; num27++)
                        {
                            i++;
                        }
                        break;
                    }

                    case 89:
                    {
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Key_Signature;
                        i++;
                        int num10 = array[i++];
                        if (num10 >= 4)
                        {
                            for (int k = 0; k < 4; k++)
                            {
                                midiEvent.Parameters[k] = array[i++];
                            }
                        }
                        else
                        {
                            for (int l = 0; l < num10; l++)
                            {
                                midiEvent.Parameters[l] = array[i++];
                            }
                        }
                        for (int m = 4; m < num10; m++)
                        {
                            i++;
                        }
                        break;
                    }

                    case 127:
                    {
                        midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Sequencer_Specific_Event;
                        i++;
                        midiEvent.Parameters[4] = array[i++];
                        byte[] array2 = new byte[(byte)midiEvent.Parameters[4]];
                        for (int j = 0; j < array2.Length; j++)
                        {
                            array2[j] = array[i++];
                        }
                        midiEvent.Parameters[0] = array2;
                        break;
                    }
                    }
                    continue;

                case 240:
                    break;

                default:
                    continue;
                }
                for (; array[i] != 247; i++)
                {
                }
                i++;
            }
            tracks[num3].Programs     = list.ToArray();
            tracks[num3].DrumPrograms = list2.ToArray();
            tracks[num3].MidiEvents   = list3.ToArray();
            num3++;
        }
        throw new Exception("Invalid track!");
    }