예제 #1
0
        public static BeatNote CloneAsTied(this BeatNote note)
        {
            var clone = note.Clone();

            clone.IsTied = true;
            return(clone);
        }
예제 #2
0
        public bool ToDocumentElement(TablatureContext context, ILogger logger, VoicePart voicePart, out BeatNote element)
        {
            var documentState = context.DocumentState;

            if (this.Fret != null &&
                this.Fret.Value + documentState.MinimumCapoFret < (documentState.CapoFretOffsets?[this.String.Value - 1] ?? 0))
            {
                logger.Report(LogLevel.Warning, this.Fret.Range,
                              Messages.Warning_FretUnderCapo, this.String.Value,
                              this.Fret.Value);
            }

            element = new BeatNote
            {
                Range                    = this.Range,
                PreConnection            = this.PreConnection?.Value ?? PreNoteConnection.None,
                PostConnection           = this.PostConnection?.Value ?? PostNoteConnection.None,
                IsTied                   = this.Tie != null,
                TiePosition              = this.TiePosition?.Value,
                String                   = this.String.Value - 1,
                Fret                     = this.Fret?.Value ?? BeatNote.UnspecifiedFret,
                EffectTechnique          = this.EffectTechnique?.Value ?? NoteEffectTechnique.None,
                EffectTechniqueParameter = this.EffectTechniqueParameter?.Value,
                Accent                   = this.Accent?.Value ?? NoteAccent.Normal
            };

            if (!this.Validate(context, logger, voicePart, element))
            {
                return(false);
            }

            return(true);
        }
예제 #3
0
        public bool ValueEquals(BeatNote other)
        {
            if (other == null)
            {
                return(false);
            }

            if (this.String.Value - 1 != other.String)
            {
                return(false);
            }

            if ((this.Fret?.Value ?? BeatNote.UnspecifiedFret) != other.Fret)
            {
                return(false);
            }

            if ((this.EffectTechnique?.Value ?? NoteEffectTechnique.None) != other.EffectTechnique)
            {
                return(false);
            }

            if (this.EffectTechniqueParameter?.Value != other.EffectTechniqueParameter)
            {
                return(false);
            }

            if ((this.Accent?.Value ?? NoteAccent.Normal) != other.Accent)
            {
                return(false);
            }

            if ((this.Tie != null) != other.IsTied)
            {
                return(false);
            }

            if (this.TiePosition?.Value != other.TiePosition)
            {
                return(false);
            }

            if ((this.PreConnection?.Value ?? PreNoteConnection.None) != other.PreConnection)
            {
                return(false);
            }

            if ((this.PostConnection?.Value ?? PostNoteConnection.None) != other.PostConnection)
            {
                return(false);
            }

            return(true);
        }
예제 #4
0
        void NoteProcess(Collider2D[] colliders)
        {
            foreach (Collider2D collider in colliders)
            {
                BeatNote bn = collider.GetComponent <BeatNote>();

                if (bn)
                {
                    // Check
                    bn.CheckHit(inputRow);
                }

                TrickNote tn = collider.GetComponent <TrickNote>();

                if (tn)
                {
                    // Check
                    tn.CheckHit(inputRow);
                }
            }
        }
예제 #5
0
        private bool ValidateTie(TablatureContext context, ILogger logger, BeatNote element)
        {
            if (this.Tie == null)
            {
                return(true);
            }

            if (!this.RetrievePreConnectedNote(context, logger, element))
            {
                return(false);
            }

            if (this.Fret == null)
            {
                element.Fret = element.PreConnectedNote.Fret;
            }
            else if (this.Fret.Value != element.PreConnectedNote.Fret)
            {
                logger.Report(LogLevel.Warning, this.Fret.Range,
                              Messages.Warning_TiedNoteMismatch);
                element.PreConnection = PreNoteConnection.None;
            }
            return(true);
        }
예제 #6
0
        private bool ValidatePreConnection(TablatureContext context, ILogger logger, VoicePart voicePart, BeatNote element)
        {
            if (this.PreConnection == null || this.PreConnection.Value == PreNoteConnection.None)
            {
                return(true);
            }

            if (this.PreConnection.Value == PreNoteConnection.SlideInFromHigher ||
                this.PreConnection.Value == PreNoteConnection.SlideInFromLower)
            {
                if (this.Fret == null)
                {
                    logger.Report(LogLevel.Error, this.PreConnection.Range,
                                  Messages.Error_FretMissingForSlideInNote);
                    return(false);
                }

                if (this.PreConnection.Value == PreNoteConnection.SlideInFromLower &&
                    this.Fret.Value <= context.DocumentState.CapoFretOffsets[this.String.Value - 1])
                {
                    logger.Report(LogLevel.Warning, this.Fret.Range,
                                  Messages.Warning_FretTooLowForSlideInNote);
                    element.PreConnection = PreNoteConnection.None;
                }

                return(true);
            }

            if (!this.RetrievePreConnectedNote(context, logger, element))
            {
                return(false);
            }

            switch (this.PreConnection.Value)
            {
            case PreNoteConnection.Slide:
                if (this.Fret == null)
                {
                    logger.Report(LogLevel.Error, this.PreConnection.Range,
                                  Messages.Error_FretMissingForSlideNote);
                    return(false);
                }
                if (this.Fret.Value == element.PreConnectedNote.Fret)
                {
                    logger.Report(LogLevel.Warning, this.PreConnection.Range,
                                  Messages.Warning_SlidingToSameFret);
                    element.PreConnection = PreNoteConnection.None;
                }
                return(true);

            case PreNoteConnection.Hammer:
                if (this.Fret == null)
                {
                    logger.Report(LogLevel.Error, this.PreConnection.Range,
                                  Messages.Error_FretMissingForHammerNote);
                    return(false);
                }

                if (this.Fret.Value == element.PreConnectedNote.Fret)
                {
                    logger.Report(LogLevel.Warning, this.Fret.Range,
                                  Messages.Warning_HammeringToSameFret);
                    element.PreConnection = PreNoteConnection.None;
                }
                else if (this.Fret.Value < element.PreConnectedNote.Fret)
                {
                    logger.Report(LogLevel.Warning, this.Fret.Range,
                                  Messages.Warning_HammeringFromHigherFret);
                    element.PreConnection = PreNoteConnection.Pull;
                }
                return(true);

            case PreNoteConnection.Pull:
                if (this.Fret == null)
                {
                    logger.Report(LogLevel.Error, this.PreConnection.Range,
                                  Messages.Error_FretMissingForPullNote);
                    return(false);
                }

                if (this.Fret.Value == element.PreConnectedNote.Fret)
                {
                    logger.Report(LogLevel.Warning, this.Fret.Range,
                                  Messages.Warning_PullingToSameFret);
                    element.PreConnection = PreNoteConnection.None;
                }
                else if (this.Fret.Value > element.PreConnectedNote.Fret)
                {
                    logger.Report(LogLevel.Warning, this.Fret.Range,
                                  Messages.Warning_PullingFromLowerFret);
                    element.PreConnection = PreNoteConnection.Hammer;
                }
                return(true);

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #7
0
        private bool ValidatePostConnection(TablatureContext context, ILogger logger, VoicePart voicePart, BeatNote element)
        {
            if (this.PostConnection == null || this.PostConnection.Value == PostNoteConnection.None)
            {
                return(true);
            }

            if (this.PostConnection.Value == PostNoteConnection.SlideOutToHigher ||
                this.PostConnection.Value == PostNoteConnection.SlideOutToLower)
            {
                if (this.Fret == null)
                {
                    logger.Report(LogLevel.Error, this.PreConnection.Range,
                                  Messages.Error_FretMissingForSlideOutNote);
                    return(false);
                }

                if (this.PostConnection.Value == PostNoteConnection.SlideOutToLower &&
                    this.Fret.Value <= context.DocumentState.GetCapoFretOffset(this.String.Value - 1))
                {
                    logger.Report(LogLevel.Warning, this.Fret.Range,
                                  Messages.Warning_FretTooLowForSlideOutNote);
                    element.PostConnection = PostNoteConnection.None;
                }
            }

            return(true);
        }
예제 #8
0
        private bool RetrievePreConnectedNote(TablatureContext context, ILogger logger, BeatNote element)
        {
            var lastNote = context.GetLastNoteOnString(this.String.Value - 1);

            if (lastNote == null)
            {
                logger.Report(LogLevel.Error, this.PreConnection.Range,
                              Messages.Error_ConnectionPredecessorNotExisted);
                return(false);
            }

            element.PreConnectedNote = lastNote;

            return(true);
        }
예제 #9
0
        private bool Validate(TablatureContext context, ILogger logger, VoicePart voicePart, BeatNote element)
        {
            if (!this.ValidateTie(context, logger, element))
            {
                return(false);
            }

            if (!this.ValidatePreConnection(context, logger, voicePart, element))
            {
                return(false);
            }

            if (!this.ValidatePostConnection(context, logger, voicePart, element))
            {
                return(false);
            }
            return(true);
        }