public static void DrawChord( Graphics graphics, SheetMusicRenderSettings settings, Color color, Color fieldcolor, ChordLayout chord, bool drawfield, int width ) { var x = chord.X * width; var notewidth = chord.Width * width; foreach (var note in chord.Notes) { DrawNote( graphics, color, fieldcolor, note, chord.StemDirection, chord.StemSide, note.Transform, x, notewidth, settings.YVal(chord.StemStartHalfLines), drawfield, settings ); } DrawFlags( graphics, color, x, chord.FlagDirection, chord, chord.FlagLength, settings.YVal(chord.StemStartHalfLines), chord.FlagSlope, chord.TiedFlags, chord.FreeFlags, chord.StemDirection, chord.StemSide, settings, width, chord.Past2nd ); }
static void DrawFlags( Graphics gfx, Color color, float x, FlagDirection direction, ChordLayout chord, float length, float y_start, float slope, int flags_tied, int flags_free, NoteStemDirection stemdirection, NoteStemSide side, SheetMusicRenderSettings settings, int width, bool past2nd ) { var diff = stemdirection == NoteStemDirection.Down ? -1 : 1; var dir_scale = direction == FlagDirection.Left ? -1 : 1; var startX = x; // line / vpx -> px[y] / px[x] // multiply by (px/line) / (px/vpx) if (side == NoteStemSide.Left) { startX -= settings.NoteHeadRadius; } else if (side == NoteStemSide.Right) { startX += settings.NoteHeadRadius; } if (past2nd) { if (side == NoteStemSide.Left) { length += settings.NoteHeadRadius / width; } else if (side == NoteStemSide.Right) { length -= settings.NoteHeadRadius / width; } } if (flags_tied > 0) { for (int i = 0; i < flags_tied + flags_free; i++) { gfx.DrawLine( new Pen(color, 5.0f), startX, y_start + diff * i * settings.LinesBetweenFlags * settings.PixelsPerLine, x + length * dir_scale * width, y_start + diff * i * settings.LinesBetweenFlags * settings.PixelsPerLine + 0.5f * (slope * settings.PixelsPerLine) * ((startX - (x + length * dir_scale * width)) / width) ); if (i == flags_free && past2nd) { if (chord.LastLengthClass < chord.Length.Length) { length /= 2f; } } } } else if (flags_free > 0) { for (int i = 0; i < flags_free; i++) { gfx.DrawLine( new Pen(color, 5.0f), startX, y_start + diff * i * settings.LinesBetweenFlags * settings.PixelsPerLine, startX + diff * 15, y_start + diff * i * settings.LinesBetweenFlags * settings.PixelsPerLine + diff * 15 ); } } }
void DrawCaret( Graphics gfx, SheetMusicRenderSettings settings, bool active, MusicTrack track, float scrollX ) { var caretx = GetLeft(editor.Cursor.Caret.Focus, track) - scrollX; var caretunitx = GetLeft(editor.Cursor.Caret.Focus + editor.Cursor.Caret.Unit.Value, track) - scrollX; var caretstaff = track .Adornment .Staffs .Intersecting(editor.Cursor.Caret.Focus) .First() .Value; PitchTransform transform; var caretkey = track .Adornment .KeySignatures .Intersecting(editor.Cursor.Caret.Focus) .First() .Value .Key(editor.Cursor.Tone.Value, out transform); var carety = settings.YVal(caretstaff.GetHalfLine(caretkey)); var caret_pen_x = new Pen(Color.DarkSeaGreen, active ? 2.5f : 1.2f); var caret_pen_y = new Pen(Color.Red, active ? 3f : 1.4f); gfx .DrawLine( caret_pen_x, caretx, 0, caretx, settings.Height ); gfx .DrawLine( caret_pen_y, caretx, carety, caretunitx, carety ); var cursorcolor = active ? Color.FromArgb(200, Color.DeepSkyBlue) : Color.FromArgb(100, Color.Aquamarine); var cursor_focusduration = new Duration { Start = editor.Cursor.Caret.Focus, Length = editor.Cursor.Caret.Unit.Value }; var cursor_notelayout = new NoteLayout( new PerceptualNote( default(PerceptualNoteID), cursor_focusduration, PerceptualTime.Decompose(editor.Cursor.Caret.Unit.Value).First().Key, track.Rhythm.Intersecting(cursor_focusduration).First(), new Note( default(NoteID), cursor_focusduration, editor.Cursor.Tone.Value ) ), settings .Staff .GetHalfLine(caretkey), 0, 0, caretkey, transform ); var cursor_chordlayout = new ChordLayout(cursor_notelayout); if (cursor_chordlayout.Length.Length > LengthClass.Whole) { cursor_chordlayout.StemDirection = settings.Staff.GetStemDirection(cursor_notelayout.Key); cursor_chordlayout.StemSide = cursor_chordlayout.StemDirection == NoteStemDirection.Down ? NoteStemSide.Left : NoteStemSide.Right; cursor_chordlayout.StemStartHalfLines = cursor_chordlayout.StemDirection == NoteStemDirection.Down ? cursor_notelayout.HalfLine - 5 : cursor_notelayout.HalfLine + 5; } if (cursor_chordlayout.Length.Length > LengthClass.Quarter) { cursor_chordlayout.FreeFlags = cursor_chordlayout.Length.Length - LengthClass.Quarter; cursor_chordlayout.FlagDirection = cursor_chordlayout.StemDirection == NoteStemDirection.Down ? FlagDirection.Left : FlagDirection.Right; } gfx.TranslateTransform(caretx, 0); NoteRenderer .DrawChord( gfx, settings, cursorcolor, Color.SeaGreen, cursor_chordlayout, false, 500 ); gfx.TranslateTransform(-caretx, 0); }