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 (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; }
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; }
public bool PrepareSampleReading(int inStartSampleIndex, int inEndSampleIndex) { SampleStreamLocations = TrackFormat.PrepareSampleReading(inStartSampleIndex, inEndSampleIndex, ref lastEnd); return((SampleStreamLocations != null) && (SampleStreamLocations.Count > 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)); }