Vibrato GetVibratoInfo(IVSNote note, int partTick, double noteLength, RangeDictionary <int, Tempo> tempo) { var vibDepth = GetNoteStyle(note, "vibDep", partTick, tempo); var vibRate = GetNoteStyle(note, "vibRate", partTick, tempo); var vibLength = note.NStyle.Attrs.FirstOrDefault((st) => st.ID == "vibLen")?.Value ?? 0; var vibType = note.NStyle.Attrs.FirstOrDefault((st) => st.ID == "vibType")?.Value ?? 0; return(new Vibrato(vibType, vibLength * 0.01 * noteLength, vibDepth, vibRate)); }
RangeDictionary <double, int> GetNoteStyle(IVSNote note, string styleName, int partTick, RangeDictionary <int, Tempo> tempo) { var partStartTime = tempo[partTick].TickToTime(partTick); var styleTickRate = note.Duration / (double)(1 << 16); return(note.NStyle.Sequence? .FirstOrDefault((s) => s.ID == styleName)?.CC .Select((c) => new { Tick = partTick + (int)(c.Position * styleTickRate), Value = c.Value }) .ToRangeDictionary((c) => tempo[c.Tick].TickToTime(c.Tick) - partStartTime, (c) => c.Value, IntervalMode.OpenInterval) ?? new RangeDictionary <double, int>(IntervalMode.OpenInterval, new Dictionary <double, int>() { [0.0] = 0 })); }