private static float GetBars(ulong beats, Midi mid) { Midi.TimeSignatureEvent previous = new Midi.TimeSignatureEvent(0, 4, 2, 24, 8); Midi.TimeSignatureEvent next; int index = -1; ulong t; float bars = 0; while (beats > 0) { if (index + 1 == mid.Signature.Count) { next = new Midi.TimeSignatureEvent(ulong.MaxValue, 0, 0, 0, 0); } else { next = mid.Signature[++index]; } t = Math.Min(next.Time - previous.Time, beats); beats -= t; bars += (float)t / previous.Numerator; previous = next; } return(bars); }
public static void FillSections(NoteChart chart, int length, int gap, int start, List <NoteChart.Note> notes, List <NoteChart.Note> overlap) { Midi.TimeSignatureEvent previous = new Midi.TimeSignatureEvent(0, 4, 0, 0, 0); Midi.TimeSignatureEvent next; int index = -1; ulong time = chart.FindLastNote(); long t2; while (time > 0) { try { next = chart.Signature[++index]; } catch (ArgumentOutOfRangeException) { next = new Midi.TimeSignatureEvent(ulong.MaxValue, 4, 0, 0, 0); } long measuresize = chart.Division.TicksPerBeat * (long)previous.Numerator; t2 = (long)Math.Min(next.Time - previous.Time, time); for (long t1 = measuresize * start; t2 - t1 >= measuresize * length; t1 += measuresize * gap) { bool collide = false; NoteChart.Note note = new NoteChart.Note(previous.Time + (ulong)t1, (ulong)measuresize * (ulong)length); if (overlap != null) { foreach (NoteChart.Note n in overlap) { if (note.IsUnderNote(n, true)) { collide = true; break; } } } if (!collide) { notes.Add(note); } } time -= (ulong)t2; previous = next; } }