예제 #1
0
        public static async Task <Rect> DrawConnection(IRootElementRenderer rootRenderer, NoteConnection connection, Beat from, Beat to, IEnumerable <int> stringIndices, Core.Style.VerticalDirection tiePosition)
        {
            switch (connection)
            {
            case NoteConnection.Slide:
            case NoteConnection.Hammer:
            case NoteConnection.Pull:
                return(await NoteConnectionRenderer.DrawTie(rootRenderer, @from, to, stringIndices, tiePosition));

            case NoteConnection.SlideInFromHigher:
            case NoteConnection.SlideInFromLower:
                return(await NoteConnectionRenderer.DrawGliss(rootRenderer, to, stringIndices, (GlissDirection)connection));

            case NoteConnection.SlideOutToHigher:
            case NoteConnection.SlideOutToLower:
                return(await NoteConnectionRenderer.DrawGliss(rootRenderer, from, stringIndices, (GlissDirection)connection));
            }

            return(default(Rect));
        }
예제 #2
0
 public static async Task DrawTie(IRootElementRenderer rootRenderer, Beat from, Beat to, int stringIndex, Core.Style.VerticalDirection tiePosition)
 {
     await NoteConnectionRenderer.DrawTie(rootRenderer, from, to, new[] { stringIndex }, tiePosition);
 }
예제 #3
0
        /// <remarks>
        /// <para>beat</para> could be different than <c>this.OwnerBeat</c> because we may draw for tied beats
        /// </remarks>
        public async Task Render(BeamSlope beamSlope)
        {
            var x = this.OwnerBeat.GetNoteRenderingPosition(this.Element.String);

            var flags = this.GetNoteRenderingFlags();

            Rect bounds;

            if (this.Element.EffectTechnique == NoteEffectTechnique.DeadNote)
            {
                bounds = await this.RenderingContext.Owner.DrawNoteFretting(this.Element.String, "dead", x, flags);
            }
            else if (this.Element.Fret == BeatNote.UnspecifiedFret)
            {
                bounds = await this.RenderingContext.Owner.DrawNoteFretting(this.Element.String, "asChord", x, flags);
            }
            else
            {
                bounds =
                    await
                    this.RenderingContext.Owner.DrawNoteFretting(this.Element.String, this.Element.Fret.ToString(),
                                                                 x, flags);
            }

            if (!this.IsTied && this.Element.EffectTechnique == NoteEffectTechnique.ArtificialHarmonic)
            {
                this.RenderingContext.AddArtificialHarmonic(this.Element.String,
                                                            this.Element.Fret,
                                                            this.Element.EffectTechniqueParameter == null
                                                                ? this.Element.Fret + 12
                                                                : (int)this.Element.EffectTechniqueParameter);
            }

            this.RenderingContext.Owner.SetNoteBoundingBox(this.OwnerBeat.Element.OwnerColumn.ColumnIndex, this.Element.String,
                                                           bounds);

            if (this.OwnerBeat.Element.NoteValue.Augment != NoteValueAugment.None)
            {
                var spaceOffset = this.OwnerBeat.Element.GetStemRenderVoicePart() == VoicePart.Treble ? 0 : 1;
                this.RenderingContext.Owner.DrawNoteValueAugment(this.OwnerBeat.Element.NoteValue,
                                                                 bounds.Right - this.RenderingContext.Owner.Location.X,
                                                                 this.Element.String + spaceOffset);
            }

            if (this.IsTied)
            {
                var tiePosition = this.Element.TiePosition ?? this.OwnerBeat.Element.GetRenderTiePosition();

                if (this.OwnerBeat.Element.IsTied)
                {
                    await NoteConnectionRenderer.DrawTie(this.Root, this.OwnerBeat.Element.PreviousBeat,
                                                         this.OwnerBeat.Element, this.Element.String, tiePosition);
                }
                else
                {
                    Debug.Assert(this.OwnerBeat.Element == this.Element.OwnerBeat);

                    if (this.Element.IsTied)
                    {
                        await NoteConnectionRenderer.DrawTie(this.Root, this.Element.PreConnectedNote?.OwnerBeat,
                                                             this.OwnerBeat.Element, this.Element.String, tiePosition);
                    }
                    else
                    {
                        var preConnection = this.Element.PreConnection == PreNoteConnection.None
                            ? (NoteConnection)this.Element.OwnerBeat.PreConnection
                            : (NoteConnection)this.Element.PreConnection;

                        if (preConnection != NoteConnection.None)
                        {
                            await this.RenderingContext.DrawConnection(this.Root, preConnection,
                                                                       this.Element.PreConnectedNote?.OwnerBeat,
                                                                       this.OwnerBeat.Element, this.Element.String,
                                                                       tiePosition);
                        }
                    }

                    var postConnection = this.Element.PostConnection == PostNoteConnection.None
                        ? (NoteConnection)this.Element.OwnerBeat.PostConnection
                        : (NoteConnection)this.Element.PostConnection;

                    if (postConnection != NoteConnection.None)
                    {
                        await this.RenderingContext.DrawConnection(this.Root, postConnection, this.OwnerBeat.Element, null, this.Element.String, tiePosition);
                    }
                }
            }
        }
예제 #4
0
        public async Task PreRender()
        {
            var columnInfo = this.RenderingContext.ColumnRenderingInfos[this.Element.ColumnIndex];

            if (columnInfo.HasBrushlikeTechnique)
            {
                var beat = this.Element.VoiceBeats[0];
                int minString = int.MaxValue, maxString = int.MinValue;
                foreach (var note in this.Element.VoiceBeats.SelectMany(b => b.Notes))
                {
                    if (note.IsTied)
                    {
                        continue;
                    }

                    if (note.String < minString)
                    {
                        minString = note.String;
                    }
                    if (note.String > maxString)
                    {
                        maxString = note.String;
                    }
                }

                if (minString == int.MaxValue || maxString == int.MinValue)
                {
                    var chord = this.Element.Chord.Resolve(this.Element.OwnerBar.DocumentState);
                    if (chord != null)
                    {
                        var notes             = chord.Fingering.Notes.ToArray();
                        var noteOfFirstString =
                            notes.FirstOrDefault(n => n.Fret != Chord.FingeringSkipString);

                        if (noteOfFirstString != null)
                        {
                            var noteOfLastString =
                                notes.LastOrDefault(n => n.Fret != Chord.FingeringSkipString);

                            // string index here is inverted
                            minString = this.RenderingContext.Style.StringCount - Array.IndexOf(notes, noteOfLastString) - 1;
                            maxString = this.RenderingContext.Style.StringCount - Array.IndexOf(notes, noteOfFirstString) - 1;
                        }
                    }
                }

                if (minString == int.MaxValue || maxString == int.MinValue)
                {
                    return;
                }

                double size;

                switch (beat.StrumTechnique)
                {
                case StrumTechnique.BrushDown:
                    size = await this.RenderingContext.DrawInlineBrushDown(this.Element.ColumnIndex, minString, maxString);

                    break;

                case StrumTechnique.BrushUp:
                    size = await this.RenderingContext.DrawInlineBrushUp(this.Element.ColumnIndex, minString, maxString);

                    break;

                case StrumTechnique.ArpeggioDown:
                    size = await this.RenderingContext.DrawInlineArpeggioDown(this.Element.ColumnIndex, minString, maxString);

                    break;

                case StrumTechnique.ArpeggioUp:
                    size = await this.RenderingContext.DrawInlineArpeggioUp(this.Element.ColumnIndex, minString, maxString);

                    break;

                case StrumTechnique.Rasgueado:
                    size = await this.RenderingContext.DrawInlineRasgueado(this.Element.ColumnIndex, minString, maxString);

                    break;

                case StrumTechnique.None:
                case StrumTechnique.PickstrokeDown:
                case StrumTechnique.PickstrokeUp:
                    throw new NotSupportedException();

                default:
                    throw new NotSupportedException();
                }

                columnInfo.BrushlikeTechniqueSize = size;

                if (beat.IsTied)
                {
                    await NoteConnectionRenderer.DrawTie(this.Root, beat.PreviousBeat, beat, beat.GetOutmostStringIndex(beat.GetRenderTieVoicePart()),
                                                         beat.GetRenderTiePosition());
                }
            }
        }