private static EventNoteData ReadEventNoteData([NotNull] string[] lines, ref int index) { index += 2; var result = new EventNoteData(); result.absTime = lines[index++].ConvDouble(20); result.selected = lines[index++].ConvBoolean(20); result.tick = lines[index++].ConvInt64(17); result.measure = lines[index++].ConvInt32(17); result.beat = lines[index++].ConvInt32(14); result.track = lines[index++].ConvInt32(15); result.type = lines[index++].ConvInt32(14); result.startPosx = lines[index++].ConvSingle(21); result.endPosx = lines[index++].ConvSingle(19); result.speed = lines[index++].ConvSingle(17); result.duration = lines[index++].ConvInt32(18); result.poly = ReadPolyPoints(lines, ref index); result.endType = lines[index++].ConvInt32(17); result.leadTime = lines[index++].ConvDouble(21); return(result); }
private static EventNoteData[] ReadEventNoteDataList([NotNull] string[] lines, ref int index) { index += 2; var evtsCount = lines[index++].ConvInt32(12); var result = new EventNoteData[evtsCount]; for (var i = 0; i < evtsCount; ++i) { var eventNoteData = ReadEventNoteData(lines, ref index); result[i] = eventNoteData; } return(result); }
private static SourceNote ToNote(EventNoteData noteData, int[] tracks) { var mltdNoteType = (MltdNoteType)noteData.Type; switch (mltdNoteType) { case MltdNoteType.PrimaryBeat: case MltdNoteType.SecondaryBeat: // We don't generate notes for these types. return(null); } var note = new SourceNote(); // MLTD tick is divided by 8. note.Ticks = noteData.Tick * (NoteBase.TicksPerBeat / 8); note.Measure = noteData.Measure - 1; note.Beat = noteData.Beat - 1; note.StartX = noteData.StartPositionX; note.EndX = noteData.EndPositionX; note.Speed = noteData.Speed; note.LeadTime = noteData.LeadTime; note.TrackIndex = noteData.Track - tracks[0]; switch (mltdNoteType) { case MltdNoteType.TapSmall: note.Type = NoteType.Tap; note.Size = NoteSize.Small; break; case MltdNoteType.TapLarge: note.Type = NoteType.Tap; note.Size = NoteSize.Large; break; case MltdNoteType.FlickLeft: note.Type = NoteType.Flick; note.FlickDirection = FlickDirection.Left; break; case MltdNoteType.FlickUp: note.Type = NoteType.Flick; note.FlickDirection = FlickDirection.Up; break; case MltdNoteType.FlickRight: note.Type = NoteType.Flick; note.FlickDirection = FlickDirection.Right; break; case MltdNoteType.HoldSmall: case MltdNoteType.HoldLarge: { note.Type = NoteType.Hold; note.Size = mltdNoteType == MltdNoteType.HoldSmall ? NoteSize.Small : NoteSize.Large; var n = new SourceNote(); var followingNotes = new[] { n }; n.StartX = note.StartX; n.EndX = note.EndX; // MLTD tick is divided by 8. n.Ticks = note.Ticks + noteData.Duration * (NoteBase.TicksPerBeat / 8); n.Speed = noteData.Speed; n.LeadTime = noteData.LeadTime; n.Type = note.Type; switch ((MltdNoteEndType)noteData.EndType) { case MltdNoteEndType.Tap: break; case MltdNoteEndType.FlickLeft: n.FlickDirection = FlickDirection.Left; break; case MltdNoteEndType.FlickUp: n.FlickDirection = FlickDirection.Up; break; case MltdNoteEndType.FlickRight: n.FlickDirection = FlickDirection.Right; break; default: throw new ArgumentOutOfRangeException(); } note.FollowingNotes = followingNotes; } break; case MltdNoteType.SlideSmall: { note.Type = NoteType.Slide; note.Size = NoteSize.Small; var followingNotes = new SourceNote[noteData.Polypoints.Length - 1]; for (var i = 1; i < noteData.Polypoints.Length; ++i) { var poly = noteData.Polypoints[i]; var followingNote = new SourceNote { StartX = noteData.Polypoints[i - 1].PositionX, EndX = poly.PositionX, // MLTD tick is divided by 8. Ticks = note.Ticks + poly.SubTick * (NoteBase.TicksPerBeat / 8), Speed = noteData.Speed, LeadTime = noteData.LeadTime, Type = note.Type }; if (i == noteData.Polypoints.Length - 1) { switch ((MltdNoteEndType)noteData.EndType) { case MltdNoteEndType.Tap: break; case MltdNoteEndType.FlickLeft: followingNote.FlickDirection = FlickDirection.Left; break; case MltdNoteEndType.FlickUp: followingNote.FlickDirection = FlickDirection.Up; break; case MltdNoteEndType.FlickRight: followingNote.FlickDirection = FlickDirection.Right; break; default: throw new ArgumentOutOfRangeException(); } } followingNotes[i - 1] = followingNote; } note.FollowingNotes = followingNotes; } break; case MltdNoteType.Special: note.Type = NoteType.Special; break; default: throw new ArgumentOutOfRangeException(); } return(note); }