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!"); }