public void CombineTracks()
        {
            //create a new track of the appropriate size
            MidiTrack finalTrack = MergeTracks();

            MidiEvent[][] absevents = new MidiEvent[mTracks.Length][];
            //we have to convert delta times to absolute delta times
            for (int x = 0; x < absevents.Length; x++)
            {
                absevents[x] = new MidiEvent[mTracks[x].MidiEvents.Length];
                for (int x2 = 0, totalDeltaTime = 0; x2 < absevents[x].Length; x2++)
                {//create copies
                    absevents[x][x2]           = mTracks[x].MidiEvents[x2];
                    totalDeltaTime            += absevents[x][x2].DeltaTime;
                    absevents[x][x2].DeltaTime = totalDeltaTime;
                }
            }
            //sort by absolute delta time also makes sure events occur in order of track and when they are recieved.
            int eventcount = 0;
            int delta      = 0;
            int nextdelta  = int.MaxValue;

            int[] counters = new int[absevents.Length];
            while (eventcount < finalTrack.MidiEvents.Length)
            {
                for (int x = 0; x < absevents.Length; x++)
                {
                    while (counters[x] < absevents[x].Length && absevents[x][counters[x]].DeltaTime == delta)
                    {
                        finalTrack.MidiEvents[eventcount] = absevents[x][counters[x]];
                        eventcount++;
                        counters[x]++;
                    }
                    if (counters[x] < absevents[x].Length && absevents[x][counters[x]].DeltaTime < nextdelta)
                    {
                        nextdelta = absevents[x][counters[x]].DeltaTime;
                    }
                }
                delta     = nextdelta;
                nextdelta = int.MaxValue;
            }
            //set total time
            finalTrack.EndTime = finalTrack.MidiEvents[finalTrack.MidiEvents.Length - 1].DeltaTime;
            //put back into regular delta time
            for (int x = 0, deltadiff = 0; x < finalTrack.MidiEvents.Length; x++)
            {
                int oldtime = finalTrack.MidiEvents[x].DeltaTime;
                finalTrack.MidiEvents[x].DeltaTime -= deltadiff;
                deltadiff = oldtime;
            }
            this.mTracks      = new MidiTrack[] { finalTrack };
            this.mTrackFormat = TrackFormat.SingleTrack;
        }
Example #2
0
        private void ReadHeader(BinaryReader reader)
        {
            if (ReadInt(reader) != 6) //midi header should be 6 bytes long
            {
                throw new InvalidDataException("Midi header is invalid.");
            }
            mTrackFormat = (TrackFormat)ReadShort(reader);
            mTracks      = new MidiTrack[ReadShort(reader)];
            int div = ReadShort(reader);

            mDivision   = div & 0x7FFF;
            mTimeFormat = ((div & 0x8000) > 0) ? TimeFormat.FamesPerSecond : TimeFormat.TicksPerBeat;
        }
        private void ReadHeader(BinaryReader reader)
        {
            if (BigEndianHelper.ReadInt32(reader) != 6) //midi header should be 6 bytes long
            {
                throw new Exception("Midi header is invalid.");
            }
            mTrackFormat = (TrackFormat)BigEndianHelper.ReadInt16(reader);
            mTracks      = new MidiTrack[BigEndianHelper.ReadInt16(reader)];
            int div = BigEndianHelper.ReadInt16(reader);

            mDivision   = div & 0x7FFF;
            mTimeFormat = ((div & 0x8000) > 0) ? TimeFormat.FamesPerSecond : TimeFormat.TicksPerBeat;
        }
Example #4
0
 public void SetUp()
 {
     _uut           = new TrackFormat();
     _trackprint    = Substitute.For <TrackPrint>();
     _fakeTrackList = new List <Track>();
 }
 public void CombineTracks()
 {
     //create a new track of the appropriate size
     MidiTrack finalTrack = MergeTracks();
     MidiEvent[][] absevents = new MidiEvent[mTracks.Length][];
     //we have to convert delta times to absolute delta times
     for (int x = 0; x < absevents.Length; x++)
     {
         absevents[x] = new MidiEvent[mTracks[x].MidiEvents.Length];
         for (int x2 = 0, totalDeltaTime = 0; x2 < absevents[x].Length; x2++)
         {//create copies
             absevents[x][x2] = mTracks[x].MidiEvents[x2];
             totalDeltaTime += absevents[x][x2].DeltaTime;
             absevents[x][x2].DeltaTime = totalDeltaTime;
         }
     }
     //sort by absolute delta time also makes sure events occur in order of track and when they are recieved. 
     int eventcount = 0;
     int delta = 0;
     int nextdelta = int.MaxValue;
     int[] counters = new int[absevents.Length];
     while (eventcount < finalTrack.MidiEvents.Length)
     {
         for (int x = 0; x < absevents.Length; x++)
         {
             while (counters[x] < absevents[x].Length && absevents[x][counters[x]].DeltaTime == delta)
             {
                 finalTrack.MidiEvents[eventcount] = absevents[x][counters[x]];
                 eventcount++;
                 counters[x]++;
             }
             if (counters[x] < absevents[x].Length && absevents[x][counters[x]].DeltaTime < nextdelta)
                 nextdelta = absevents[x][counters[x]].DeltaTime;
         }
         delta = nextdelta;
         nextdelta = int.MaxValue;
     }
     //set total time
     finalTrack.EndTime = finalTrack.MidiEvents[finalTrack.MidiEvents.Length - 1].DeltaTime;
     //put back into regular delta time
     for (int x = 0, deltadiff = 0; x < finalTrack.MidiEvents.Length; x++)
     {
         int oldtime = finalTrack.MidiEvents[x].DeltaTime;
         finalTrack.MidiEvents[x].DeltaTime -= deltadiff;
         deltadiff = oldtime;
     }
     this.mTracks = new MidiTrack[] { finalTrack };
     this.mTrackFormat = TrackFormat.SingleTrack;
 }
 private void ReadHeader(BinaryReader reader)
 {
     if (BigEndianHelper.ReadInt32(reader) != 6) //midi header should be 6 bytes long
         throw new Exception("Midi header is invalid.");
     mTrackFormat = (TrackFormat)BigEndianHelper.ReadInt16(reader);
     mTracks = new MidiTrack[BigEndianHelper.ReadInt16(reader)];
     int div = BigEndianHelper.ReadInt16(reader);
     mDivision = div & 0x7FFF;
     mTimeFormat = ((div & 0x8000) > 0) ? TimeFormat.FamesPerSecond : TimeFormat.TicksPerBeat;
 }
Example #7
0
 public bool PrepareSampleReading(int inStartSampleIndex, int inEndSampleIndex)
 {
     SampleStreamLocations = TrackFormat.PrepareSampleReading(inStartSampleIndex, inEndSampleIndex, ref lastEnd);
     return((SampleStreamLocations != null) && (SampleStreamLocations.Count > 0));
 }
Example #8
0
 /// <summary>
 /// PrepareSampleReading
 /// If what the time span the user is asking for is beyond the contents of the track, this method returns false.
 /// </summary>
 /// <param name="inStartSampleTime">in milliseconds</param>
 /// <param name="inEndSampleTime">in milliseconds</param>
 /// <returns>Returns false when inStartSampleTime is beyond duration of fragment/stream.</returns>
 public bool PrepareSampleReading(UInt64 inStartSampleTime, UInt64 inEndSampleTime)
 {
     SampleStreamLocations = TrackFormat.PrepareSampleReading(inStartSampleTime, inEndSampleTime, ref lastEnd);
     return((SampleStreamLocations != null) && (SampleStreamLocations.Count > 0));
 }