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);
        }
示例#3
0
        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);
        }