Esempio n. 1
0
        public void TestDraw()
        {
            var helper = new PianoDraw()
            {
                BoxWidth       = 200,
                BoxHeight      = 200,
                BlackKeyHeight = 50,
                WhiteKeyHeight = 100,
                WhiteKeyWidth  = 60,
                BlackKeyWidth  = 30,
                Min            = PianoKey.Create127(0),
                Max            = PianoKey.Create127(131),
                Offset         = -61
            };
            var key = helper.Get(0);

            Assert.AreEqual(key.ToKey127(), (byte)1);
        }
Esempio n. 2
0
        /// <summary>
        /// 这是获取当前位置
        /// </summary>
        /// <param name="offset"></param>
        /// <param name="isRelative">是否是相对坐标</param>
        /// <returns></returns>
        public PianoKey Get(double offset, bool isRelative = true)
        {
            Invalidate();
            if (isRelative)
            {
                offset += Offset;
            }
            if (IsVertical)
            {
                offset = BarLength - offset;
            }
            if (IsSameGap)
            {
                return(PianoKey.Create127(Convert.ToInt32(offset / BlackKeyWidth)
                                          - (IsVertical ? 1 : 0)));
            }
            var w     = WhiteKeyWidth;
            var index = offset / w;
            var key   = new PianoKey
            {
                Beat = Convert.ToInt16(index / 7 - 4),
                Code = Convert.ToUInt16(index % 7 + 1)
            };

            if (key.ToKey127() > 0)
            {
                var pre = key - 1;
                if (pre.Scale > 0 && GetOffsetFromMin(pre) + BlackKeyWidth > offset)
                {
                    return(pre);
                }
            }
            var next = key + 1;

            if (next.Scale > 0 && GetOffsetFromMin(next) <= offset)
            {
                return(next);
            }
            return(key);
        }