让我们来看看这些类型:
public enum KeyTone : int
{
C = 0,
Cs = 1,
D = 2,
Ds = 3,
E = 4,
F = 5,
Fs = 6,
G = 7,
Gs = 8,
A = 9,
As = 10,
H = 11
}
public class PianoKey
{
public KeyTone Tone { get; set; }
public int Octave { get; set; }
}PianoKey代表--嗯,你猜到了--钢琴上的键。我需要检查,有多少白键(例如,这些没有"s“后缀)是在两个指定的白键之间。问题是键盘不是规则的,从下一个八度开始,E和F之间没有黑色键,H和C之间也没有黑色键。
有一个明显的蛮力解决方案--跳到下一个白键,直到到达请求的第二个键。但是,也许还有更简单的方法来计算呢?
发布于 2016-02-23 15:29:13
首先,计算给定键的基本音调(我假设所有键都由它们的整数表示):
if tone <= KeyTone.E
baseTone = tone / 2
else
baseTone = (tone + 1) / 2然后,加上八度音阶:
baseTone += Octave * 7然后,您可以通过简单的减法找到白键中的不同之处:
diffInWhiteKeys = baseTone(key1) - baseTone(key2)例如,E2和G3的区别是:
baseTone(E2) = 4 / 2 + 2 * 7 = 16
baseTone(G3) = (7 + 1) / 2 + 3 * 7 = 25
diff = 24 - 16 = 9,这正是您必须从E2升级到G3的白键数。如果您对to键之间的白键数感兴趣,只需减去一个键即可。
发布于 2016-02-23 15:34:43
创建两个映射的静态数组
static int[] whiteLeft = new int[] {0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6};
static int[] whiteRight = new int[] {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6};然后,两个键之间的白键数可以简单地计算为
public static int WhiteKeysBetween(PianoKey left, PianoKey right)
{
int wl = whiteLeft[(int)left.Tone];
int wr = whiteRight[(int)right.Tone];
return (right.Octave - left.Octave) * 7 + (wr - wl - 1);
} 编辑:--这也适用于任意两个键(白色或黑色)之间的白键。我没有意识到问题陈述只要求白键之间的白键。
https://stackoverflow.com/questions/35580380
复制相似问题