public async Task DrawConnection(IRootElementRenderer rootRenderer, NoteConnection connection, Beat from, Beat to, int stringIndex, Core.Style.VerticalDirection tiePosition) { var bounds = await NoteConnectionRenderer.DrawConnection(rootRenderer, connection, from, to, stringIndex, tiePosition); var instructionPosition = (bounds.Left + bounds.Right) / 2; switch (connection) { case NoteConnection.Slide: this.AddConnectionInstruction(stringIndex, instructionPosition, "sl."); break; case NoteConnection.SlideInFromHigher: case NoteConnection.SlideInFromLower: case NoteConnection.SlideOutToHigher: case NoteConnection.SlideOutToLower: this.AddConnectionInstruction(stringIndex, instructionPosition, "gl."); break; case NoteConnection.Hammer: this.AddConnectionInstruction(stringIndex, instructionPosition, "h."); break; case NoteConnection.Pull: this.AddConnectionInstruction(stringIndex, instructionPosition, "p."); break; } }
public static async Task DrawPostConnection(IRootElementRenderer rootRenderer, PostNoteConnection postConnection, Beat beat, IEnumerable <int> stringIndices) { switch (postConnection) { case PostNoteConnection.SlideOutToHigher: await NoteConnectionRenderer.DrawGliss(rootRenderer, beat, stringIndices, GlissDirection.ToHigher); break; case PostNoteConnection.SlideOutToLower: await NoteConnectionRenderer.DrawGliss(rootRenderer, beat, stringIndices, GlissDirection.ToLower); break; } }
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)); }
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); }
public static async Task DrawPostConnection(IRootElementRenderer rootRenderer, PostNoteConnection postConnection, Beat beat, int stringIndex) { await NoteConnectionRenderer.DrawPostConnection(rootRenderer, postConnection, beat, new[] { stringIndex }); }
public static Task <Rect> DrawConnection(IRootElementRenderer rootRenderer, NoteConnection connection, Beat from, Beat to, int stringIndex, Core.Style.VerticalDirection tiePosition) { return(NoteConnectionRenderer.DrawConnection(rootRenderer, connection, from, to, new[] { stringIndex }, tiePosition)); }
/// <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); } } } }
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()); } } }