首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两把钥匙之间有多少把白钥匙?

两把钥匙之间有多少把白钥匙?
EN

Stack Overflow用户
提问于 2016-02-23 14:37:48
回答 2查看 122关注 0票数 0

让我们来看看这些类型:

代码语言:javascript
复制
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之间也没有黑色键。

有一个明显的蛮力解决方案--跳到下一个白键,直到到达请求的第二个键。但是,也许还有更简单的方法来计算呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-23 15:29:13

首先,计算给定键的基本音调(我假设所有键都由它们的整数表示):

代码语言:javascript
复制
if tone <= KeyTone.E
    baseTone = tone / 2
else 
    baseTone = (tone + 1) / 2

然后,加上八度音阶:

代码语言:javascript
复制
baseTone += Octave * 7

然后,您可以通过简单的减法找到白键中的不同之处:

代码语言:javascript
复制
 diffInWhiteKeys = baseTone(key1) - baseTone(key2)

例如,E2和G3的区别是:

代码语言:javascript
复制
baseTone(E2) = 4 / 2 + 2 * 7 = 16
baseTone(G3) = (7 + 1) / 2 + 3 * 7 = 25
diff = 24 - 16 = 9

,这正是您必须从E2升级到G3的白键数。如果您对to键之间的白键数感兴趣,只需减去一个键即可。

票数 2
EN

Stack Overflow用户

发布于 2016-02-23 15:34:43

创建两个映射的静态数组

  • 左或右下一个白键的每一个黑键,
  • 每一把白色的钥匙,
  • 将白键编号从0到6。
代码语言:javascript
复制
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};

然后,两个键之间的白键数可以简单地计算为

代码语言:javascript
复制
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);
}       

编辑:--这也适用于任意两个键(白色或黑色)之间的白键。我没有意识到问题陈述只要求白键之间的白键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35580380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档