首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >爵士和弦的黑白键?

爵士和弦的黑白键?
EN

Code Golf用户
提问于 2015-02-05 21:09:37
回答 3查看 610关注 0票数 6

在弹钢琴的时候,我意识到要正确地弹奏和弦,我通常需要记住和弦的哪个音调是白色的,哪个是黑色的。其余的通常由“自动驾驶仪”处理。

让我们编写一个给定第七和弦的程序,它输出在黑色(字符^)和白键(字符-)上播放的音调。每个和弦名称都有一个根,它是大写字母A to G,可选地后面跟着b#,然后再加上其类型,如下所示。所有第七和弦都包含四个音符,公式用整数表示。

  • 7优势(0,4,7,10)
  • M7专业(0,4,7,11)
  • m7未成年人(0,3,7,10)
  • dim7减少(0,3,6,9)
  • m7b5半减(0,3,6,10)
  • -M7未成年人/专业(0,3,7,11)

整数表示法意味着你必须播放四个音符,这四个音符是(w,x,y,z)。(w是根,因此总是零。)

例如,对于输入Bb-M7,输出将是^^-- (对应于Bb)。

程序要么读取chord表单stdin并将结果输出到stdout,要么它应该是一个接受字符串并返回字符串的函数。

EN

回答 3

Code Golf用户

发布于 2015-02-06 17:56:50

C# 468

代码语言:javascript
复制
string f(string p){var x=new Dictionary<char,int>{{'C',1},{'D',3},{'E',5},{'F',6},{'G',8},{'A',10},{'B',12}};var y=new Dictionary<string,string>{{"7","0,4,7,10"},{"M7","0,4,7,11"},{"m7","0,3,7,10"},{"dim7","0,3,6,9"},{"m7b5","0,3,6,10"},{"-M7","0,3,7,11"}};var m="--^-^--^-^-^-";var r="";int j=1,i=0,k=0;if(p[1]=='b')i--;if(p[1]=='#')i++;if(i!=0)j=2;i=i+x[p[0]];var a=y[p.Substring(j)].Split(new char[]{','});for(;k<a.Length;k++)r+=m[(int.Parse(a[k])+i)%12];return r;}

对我来说没问题。我测试了它,但谁知道;)

我也认为这是因为

代码语言:javascript
复制
Bb-M7

你应该去

代码语言:javascript
复制
^^--
票数 2
EN

Code Golf用户

发布于 2015-02-07 05:14:01

Mathematica 296

代码语言:javascript
复制
f[s_]:=StringJoin[Mod[#3+#1+Switch[#2,"",0,"b",-1,"#",1],12]&@@StringSplit[s,Join[Thread@Rule[Characters["C D EF G A B"],Range[0,11]],{"7"->{0,4,7,10},"M7"->{0,4,7,11},"m7"->"0,3,7,10","dim7"->{0,3,6,9},"m7b5"->{0,3,6,10},"-M7"->{0,3,7,11}}]]/.Thread@Rule[Range[0,11],Characters["-^-^--^-^-^-"]]]

对于Cdim7 (<-我最喜欢的一个)

代码语言:javascript
复制
In:= f["Cdim7"]
Out= -^^-
票数 1
EN

Code Golf用户

发布于 2015-02-07 18:43:59

Java - 247

代码语言:javascript
复制
String j(String s){int i=2,t=0,x=s.charAt(0)*2-128,c=s.charAt(1);x-=x/6+(c==98?1:c==35?-1:(i=1)-1);while(i<s.length())t+=s.charAt(i++);int[]a={0,t%11>0?3:4,t%9>0?7:6,(t%9-t%5)/3+10};s="";for(i=0;i<4;)s+=(1717&1<<(x+a[i++])%12)>0?"-":"^";return s;}

基本上是我的CJam解决方案的翻译:)

格式更好的可执行程序:

代码语言:javascript
复制
public class J {
    String j(String s) {
        int i = 2, t = 0, x = s.charAt(0) * 2 - 128, c = s.charAt(1);
        x -= x / 6 + (c == 98 ? 1 : c == 35 ? -1 : (i = 1) - 1);
        while (i < s.length())
            t += s.charAt(i++);
        int[] a = { 0, t % 11 > 0 ? 3 : 4, t % 9 > 0 ? 7 : 6, (t % 9 - t % 5) / 3 + 10 };
        s = "";
        for (i = 0; i < 4;)
            s += (1717 & 1 << (x + a[i++]) % 12) > 0 ? "-" : "^";
        return s;
    }

    public static void main(final String... args) {
        System.out.println(new J().j("D#m7"));
    }
}

输出:

代码语言:javascript
复制
^^^^
票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/45415

复制
相关文章

相似问题

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