Пример #1
0
 public void ProcessMidiEvent(MidiSequencerEvent seqEvent)
 {
     for (int i = 0; i < seqEvent.Events.Count; i++)
     {
         MidiEvent midiEvent = seqEvent.Events[i];
         if (midiEvent.midiChannelEvent != 0)
         {
             if (this.MidiEvent != null)
             {
                 this.MidiEvent(seqEvent.component, midiEvent, midiEvent.dspTime);
             }
             continue;
         }
         MidiHelper.MidiMetaEvent midiMetaEvent = midiEvent.midiMetaEvent;
         if (midiMetaEvent == MidiHelper.MidiMetaEvent.Tempo && midiEvent.Parameters[0] != null)
         {
             BeatsPerMinute = 60000000u / Convert.ToUInt32(midiEvent.Parameters[0]);
         }
     }
 }
Пример #2
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();
            }
            for (int i = 0; i < num; i++)
            {
                MidiTrack          midiTrack          = null;
                MidiSequencerEvent midiSequencerEvent = null;
                if (flag)
                {
                    midiTrack = new MidiTrack();
                    tracks.Add(midiTrack);
                    midiSequencerEvent = new MidiSequencerEvent();
                    seqEvt.Events.Add(midiSequencerEvent);
                }
                else
                {
                    midiTrack           = tracks[i];
                    midiTrack.TotalTime = 0uL;
                    midiSequencerEvent  = seqEvt.Events[i];
                }
                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")
                {
                    throw new Exception("Invalid track!");
                }
                stream.Read(array, 0, 4);
                Array.Reverse(array);
                int num3 = BitConverter.ToInt32(array, 0);
                array = new byte[num3];
                stream.Read(array, 0, num3);
                int       j    = 0;
                byte      b    = 0;
                int       num4 = 0;
                MidiEvent midiEvent;
                for (; j < array.Length; list3.Add(midiEvent), tracks[i].TotalTime = tracks[i].TotalTime + midiEvent.deltaTime)
                {
                    ushort numOfBytes = 0;
                    uint   data       = BitConverter.ToUInt32(array, j);
                    midiEvent           = new MidiEvent();
                    midiEvent.deltaTime = GetTime(data, ref numOfBytes);
                    j += 4 - (4 - numOfBytes);
                    byte b2   = array[j];
                    int  num5 = GetChannel(b2);
                    if (b2 < 128)
                    {
                        b2   = b;
                        num5 = num4;
                        j--;
                    }
                    if (b2 != byte.MaxValue)
                    {
                        b2 = (byte)(b2 & 0xF0u);
                    }
                    b    = b2;
                    num4 = num5;
                    switch (b2)
                    {
                    case 128:
                        midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Note_Off;
                        j++;
                        midiEvent.channel       = (byte)num5;
                        midiEvent.Parameters[0] = midiEvent.channel;
                        midiEvent.parameter1    = array[j++];
                        midiEvent.parameter2    = array[j++];
                        midiEvent.Parameters[1] = midiEvent.parameter1;
                        midiEvent.Parameters[2] = midiEvent.parameter2;
                        continue;

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

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

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

                    case 192:
                        midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Program_Change;
                        midiEvent.channel          = (byte)num5;
                        midiEvent.Parameters[0]    = midiEvent.channel;
                        j++;
                        midiEvent.parameter1    = array[j++];
                        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)num5;
                        midiEvent.Parameters[0]    = midiEvent.channel;
                        j++;
                        midiEvent.parameter1 = array[++j];
                        continue;

                    case 224:
                    {
                        midiEvent.midiChannelEvent = MidiHelper.MidiChannelEvent.Pitch_Bend;
                        midiEvent.channel          = (byte)num5;
                        midiEvent.Parameters[0]    = midiEvent.channel;
                        j++;
                        midiEvent.parameter1 = array[++j];
                        midiEvent.parameter2 = array[++j];
                        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[++j])
                        {
                        case 0:
                            midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Sequence_Number;
                            j++;
                            break;

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

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

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

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

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

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

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

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

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

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

                        case 84:
                        {
                            midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Smpte_Offset;
                            j++;
                            int num7 = array[j++];
                            if (num7 >= 4)
                            {
                                for (int num8 = 0; num8 < 4; num8++)
                                {
                                    midiEvent.Parameters[num8] = array[j++];
                                }
                            }
                            else
                            {
                                for (int num9 = 0; num9 < num7; num9++)
                                {
                                    midiEvent.Parameters[num9] = array[j++];
                                }
                            }
                            for (int num10 = 4; num10 < num7; num10++)
                            {
                                j++;
                            }
                            break;
                        }

                        case 88:
                        {
                            midiEvent.midiMetaEvent = MidiHelper.MidiMetaEvent.Time_Signature;
                            j++;
                            int num11 = array[j++];
                            if (num11 >= 4)
                            {
                                for (int num12 = 0; num12 < 4; num12++)
                                {
                                    midiEvent.Parameters[num12] = array[j++];
                                }
                            }
                            else
                            {
                                for (int num13 = 0; num13 < num11; num13++)
                                {
                                    midiEvent.Parameters[num13] = array[j++];
                                }
                            }
                            for (int num14 = 4; num14 < num11; num14++)
                            {
                                j++;
                            }
                            break;
                        }

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

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

                    case 240:
                        break;

                    default:
                        continue;
                    }
                    for (; array[j] != 247; j++)
                    {
                    }
                    j++;
                }
                tracks[i].Programs     = list.ToArray();
                tracks[i].DrumPrograms = list2.ToArray();
                tracks[i].MidiEvents   = list3.ToArray();
            }
        }