// 绘制符杠 private void DrawBeam() { // 绘制符杠,根据之前计算出来的起始x坐标和起始y坐标,画到下一个连音符的x坐标,划的长度为乐符之间的间隔width // 两条符杠之间的间隔 int beamDiff = -ParamsGetter.GetNoteBeamDiff(_note.IsUpOrDown()); if (_note.IsLast()) { switch (_note.GetLastNote().GetType()) { case 8: DrawLine(_beamX, _beamY, 0, _beamY, 2); break; case 16: DrawLine(_beamX, _beamY, 0, _beamY, 2); DrawLine(_beamX, _beamY + beamDiff, 0, _beamY + beamDiff, 2); break; case 64: DrawLine(_beamX, _beamY, 0, _beamY, 2); DrawLine(_beamX, _beamY + beamDiff, 0, _beamY + beamDiff, 2); DrawLine(_beamX, _beamY + 2 * beamDiff, 0, _beamY + 2 * beamDiff, 2); break; default: break; } if (_note.GetLastNote().GetDot() != 0) { switch ((int)(_note.GetLastNote().GetType() * Math.Pow(2, _note.GetLastNote().GetDot()))) { case 16: DrawLine(_beamX, _beamY + beamDiff, 0, _beamY + beamDiff, 2); break; case 32: DrawLine(_beamX, _beamY + beamDiff, 0, _beamY + beamDiff, 2); DrawLine(_beamX, _beamY + 2 * beamDiff, 0, _beamY + 2 * beamDiff, 2); break; default: break; } } } if (_note.IsNext()) { switch (_note.GetType()) { case 8: DrawLine(_beamX - 1, _beamY, Width, _beamY, 2); break; case 16: DrawLine(_beamX - 1, _beamY, Width, _beamY, 2); DrawLine(_beamX - 1, _beamY + beamDiff, Width, _beamY + beamDiff, 2); break; case 32: DrawLine(_beamX - 1, _beamY, Width, _beamY, 2); DrawLine(_beamX - 1, _beamY + beamDiff, Width, _beamY + beamDiff, 2); DrawLine(_beamX - 1, _beamY + 2 * beamDiff, Width, _beamY + 2 * beamDiff, 2); break; default: break; } if (_note.GetDot() != 0) { int temp = (int)Math.Pow(2, _note.GetDot()); int start = (2 * temp - 1) * Width / (2 * temp); switch (_note.GetType() * temp) { case 16: DrawLine(start, _beamY + beamDiff, Width, _beamY + beamDiff, 2); break; case 32: DrawLine(start, _beamY + beamDiff, Width, _beamY + beamDiff, 2); DrawLine(start, _beamY + 2 * beamDiff, Width, _beamY + 2 * beamDiff, 2); break; default: break; } } } }