public void MarkAs(Sign sign, Key.State state) { foreach (var key in keys) { if (key.note.InChord(sign)) key.MarkAs(state); } }
public double Show(Sign fromSign, out Sign nextSign) { // Rysuję klamrę. double braceRight = ShowBrace(); // Rysuję pięciolinie wiolinową i basową, klucze i znaki przykluczowe. double bottom = ShowStaffs(braceRight); // Rysuję nuty i inne znaki - tyle ile sie zmiesci. nextSign = ShowSigns(fromSign); // Rysuję znaki zmiany wysokości wykonania (ottava) ShowPerform(Staff.Type.Bass); ShowPerform(Staff.Type.Treble); // Zwracam pierwszą nutę do narysowania na następnym StaffGrand return bottom; }
private int HideToBeginOfMeasure(Sign fromSign) { List<Sign> signsForHide = new List<Sign>(); for (int idx = score.signs.IndexOf(fromSign) - 1; idx >= 0 ; idx--) { Sign sign = score.signs[idx]; if (sign is Bar) { // Jest znak taktu. Ukrywamy znaki i zwracamy jego index. signsForHide.ForEach(s => s.Hide(score)); return idx; } else { signsForHide.Add(sign); } } // Nie znaleziono znaku taktu. return -1; }
private Sign ShowSigns(Sign fromSign) { // Może nie być żadnych znaków do rysowania. if (fromSign == null) return null; firstSign = fromSign; for (int idx = score.signs.IndexOf(fromSign); idx < score.signs.Count; idx++) { Sign sign = score.signs[idx]; cursor = sign.Show(score, trebleStaff, bassStaff, cursor); // Czy znak zmieścil się na pieciolinii? if (cursor == -1) { // Nie - umieścimy go na kolejnym SraffGrand. // Wycofujemy też wszyskie znaki do początku taktu. int idxBar = HideToBeginOfMeasure(sign); if (idxBar == -1) { // Nie znaleziono znaku taktu. Nie robimy wycofywania. return sign; } lastSign = score.signs[idxBar]; Sign nextSign = score.signs[idxBar + 1]; return nextSign; } else { // Tak - zmieścił się. lastSign = sign; } } // Wszystkie zmieściły się. return null; }
public Note FindNextNote(Sign sign) { int idx = signs.IndexOf(sign); int idxNextNote = signs.FindIndex(idx, s => s is Note); return signs[idxNextNote] as Note; }
public void Add(Sign sign) { signs.Add(sign); }