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); }
/// <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); }