我想写一个音乐节目已经有一段时间了,但是我对编程还不太了解,所以这可能不会发生。这个项目最初的目标是用字母名称表示吉他和弦(Ex: CMaj = CEG),可能有几种不同类型的和弦(大调、未成年人和弦、缩小和弦等)。为了使这是最简单的,我想我将从一个C大调开始,因为在那里没有高音或平底音。我的第一个和弦可能是C大调,它是量表的第1、第3和第5部分( C D E F G A B )。我的问题是,使用字符串和字符(或者其他一些方式,我有点猜测),是否有一种方法将C表示为String(?)C,其中C=1,D=2,E=3,..etc。所以当节目输入一个大和弦时,它要求第一、第三和第五个音阶?基本上,用户选择chord,它将转换为1,3,5,然后音阶被匹配,程序调用这个音阶的这3个特定的间隔。
任何帮助都将不胜感激,或者以一种完全不同的方式来思考这个问题。
利用我所掌握的很少的知识,我使用了神谕网站并找到了他们的枚举示例,并将其组合在一起:
public enum Chord {
CHORD, MAJOR, MINOR, DIMINISHED, BASS, BASS2}
public enum Scales {
C, D, E, F, G, A}
public class EnumTest {
Chord chord;
public EnumTest(Chord chord) {
this.chord = chord;
}
public void tellItLikeItIs() {
switch (chord) {
case MAJOR: System.out.println("C, E, G");
break;
case MINOR: System.out.println("C, Eb, G");
break;
default: System.out.println("I screwed up");
break;
}
}
public static void main(String[] args) {
EnumTest firstDay = new EnumTest(Chord.MAJOR);
firstDay.tellItLikeItIs();
EnumTest thirdDay = new EnumTest(Chord.MINOR);
thirdDay.tellItLikeItIs();
}}
我仍然不明白,使用Olivers的例子,当我做一个C大和弦时,我想要标尺枚举的第1、第3和第5值。我喜欢使用C中的半声调和建立每个和弦的想法,但我不知道如何将#s放入Scales类(非法字符)。基本上,我的问题是如何让Chord类从Scales类获得比例度,并将其插入到EnumTest类中?
(如果有别的地方,我可以去问一些愚蠢的问题,而不去打扰别人,我可以试着去问。)
发布于 2011-11-01 12:57:34
基本上,音符、和弦和和弦级数是枚举的组合。
我会这么做的:
首先是注解的精粹。用半色调而不是音符来思考要容易得多。
注{C (1),C# (2),D (3),D# (4),E (5),F (6),F# (7),G (8),G# (8),A (9),A# (10),B (11)}
Note.ordinal()的实现,如mishaddof所建议的那样
第二,我将有一个和弦枚举,包含所有可能的和弦类型,这给出了偏移的半色调,以添加到根音符。举个例子:
大调(4,7),小调(3,6)}
找到CMaj就像得到C注和在Notes中得到位于4 (E)和7 (G)半色调的注释一样简单。对于G#Maj(8),C(8+4 =12(-11)=1 ),D# (8+7=15-11=4)。对于Dmin,D(3),F(3+3 =6)和A#(3+7=9)
发布于 2011-11-01 12:31:55
如果需要有限的值集并将某些参数绑定到这些值,请使用埃努姆。
我第一次看到这个问题:
enum Note {
C, D, E, F, G, A, B
}
class Chord {
List<Note> notes;
}在这种情况下,便笺列表包含了插入顺序中的和弦音符。如果你不关心秩序,而且我认为和弦不可能包含类似的音符,那就用Set作为音符持有者。
此外,如果您需要代码,使用Note.ordinal()返回您的笔记代码。
https://stackoverflow.com/questions/7966315
复制相似问题