Exemple #1
0
        // 绘制符杠
        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;
                    }
                }
            }
        }