// 绘制和弦 private void DrawChord() { bool leftOrRight = _note.IsUpOrDown(); int headPosition = Start; int lastPosition = 0; // int chordPaintNum = 0; // 绘制和弦中的其他乐符(最后一个乐符即当前乐符,已经绘制),去掉和弦表中的最后一个乐符 for (int i = 0; i < _note.GetChordList().Count - 1; i++) { Note extraNote = _note.GetChordList()[i]; DrawShiftLine(extraNote.GetShift() / ParamsGetter.GetPitchPositionDiff()); int extraDuration = extraNote.GetType(); int extraPosition = extraNote.GetShift() + ParamsGetter.GetStaffCenterPosition(); if (Math.Abs(extraPosition - lastPosition) == ParamsGetter.GetPitchPositionDiff()) { if (leftOrRight) { headPosition += ParamsGetter.GetNoteHeadWidth(); } else { headPosition -= ParamsGetter.GetNoteHeadWidth(); } leftOrRight = !leftOrRight; } if (extraDuration == 1) // 全音符 { DrawSymbol("\uE12B", headPosition, extraPosition); continue; } else { if (extraDuration == 2) { DrawSymbol("\uE12C", headPosition, extraPosition); } else { DrawSymbol("\uE12D", headPosition, extraPosition); } } lastPosition = extraPosition; int temp; if (_note.IsUpOrDown()) { temp = extraPosition + ParamsGetter.GetNoteStemHeight(); } else { temp = extraPosition - ParamsGetter.GetNoteStemHeight(); } DrawLine(_stemX, extraPosition, _stemX, temp); } }
public void Operate() { int temp; Boolean upOrDown = _list[0].GetShift() < 0; // 从五线谱中心往下偏移,说明符干朝上 int stemEnd; if (upOrDown) { temp = GetHighestNote(); stemEnd = temp + _paramsGetter.GetStaffCenterPosition() + _paramsGetter.GetNoteStemHeight(); } else { temp = GetLowestNote(); stemEnd = temp + _paramsGetter.GetStaffCenterPosition() - _paramsGetter.GetNoteStemHeight(); } foreach (Note note in _list) { note.SetEnd(stemEnd); note.SetUpOrDown(upOrDown); } }
// 绘制符干 private void DrawStem() { if (_note.IsSlur()) { DrawLine(_stemX, _stemY, _stemX, _beamY); } else { if (_note.IsUpOrDown()) { DrawLine(_stemX, _stemY, _stemX, _stemY + ParamsGetter.GetNoteStemHeight()); } else { DrawLine(_stemX, _stemY, _stemX, _stemY - ParamsGetter.GetNoteStemHeight()); } } }
protected override void OnDraw() { // 绘制定位线 if (Cursor) { int tempStart = Start - 2 + Num * _note.GetSymbolWidth(); DrawLine(tempStart, 0, tempStart, ParamsGetter.GetTotalHeight()); } // 乐符纵坐标 int yPosition = ParamsGetter.GetStaffCenterPosition() + _note.GetShift(); int shift = _note.GetShift() / ParamsGetter.GetPitchPositionDiff(); // 偏移线,当超过6的时候会画线。传入参数为shift,因为以左下角为原点 DrawShiftLine(shift); // 绘制变音记号 DrawAccidental(_note.GetAccidental(), yPosition); if (_note.GetDot() == 1) { DrawPoint(Start + ParamsGetter.GetDotePosition(), yPosition); } if (Type == 1) // 全音符 { DrawSymbol("\uE12B", Start, yPosition); if (_note.HasChord()) { DrawChord(); } } else { if (Type == 2) // 二分之一音符 { DrawSymbol("\uE12C", Start, yPosition); } else // 其余的所有 { DrawSymbol("\uE12D", Start, yPosition); } if (_note.IsUpOrDown()) { _stemX = Start + ParamsGetter.GetNoteRightShift(); // 符干向上时横坐标向右偏移 _stemY = yPosition; // 符干向上时纵坐标与乐符中心纵坐标位置相同 _tailX = Start + ParamsGetter.GetNoteTailUpLandscapeShift(); _tailY = _stemY + ParamsGetter.GetNoteStemHeight() - ParamsGetter.GetNoteTailDownPortraitShift(); } else { _stemX = Start - ParamsGetter.GetNoteLeftShift(); // 符干向下时横坐标向左偏移 _stemY = yPosition - ParamsGetter.GetNoteStemDownShift(); // 符干向下时纵坐标与乐符中心纵坐标位置偏移 _tailX = Start - ParamsGetter.GetNoteTailDownLandscapeShift(); _tailY = _stemY - ParamsGetter.GetNoteStemHeight() + ParamsGetter.GetNoteTailDownPortraitShift(); } _beamX = _stemX; _beamY = _note.GetEnd(); if (_note.HasChord()) { if (_note.IsUpOrDown()) { int temp = _note.GetShift(); foreach (Note noteChord in _note.GetChordList()) { if (temp > noteChord.GetShift()) { temp = noteChord.GetShift(); } } _tailY = temp + ParamsGetter.GetNoteStemHeight(); } DrawChord(); } DrawStem(); // 画符干 if (_note.IsSlur()) { DrawBeam(); // 画符杠 } else { DrawTail(); } } }