我一直想写一段音乐程序,但我对编程知之甚少,所以可能不会发生。这个程序的目标首先是用字母名称代表吉他和弦(例如:CMaj = CEG),并且可能有几种不同类型的和弦(专业,未成年人,减少等)为了使这最简单,我我想我会从C大调开始,因为没有尖锐或平底。我的第一个和弦可能是C大调,这是第一,第三和第五的音阶( C D E F G AB )。我的问题是,使用字符串和字符(或其他方式,我有点猜测),有没有办法将C表示为字符串(?)C,其中C = 1,D = 2,E = 3,。 。等等。所以当节目输入一个大和弦时,它会要求相应音阶的第一,第三和第五? 所以基本上用户选择和弦C Maj,它转换为1,3,5,然后比例尺匹配,程序调用该比例的3个特定间隔。
任何帮助都会受到赞赏,或者以不同的方式完全考虑这一点。
利用我所拥有的一点点知识,我使用了Oracles网站并找到了他们的枚举示例并将其整合在一起:
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大调和弦,我想要Scales枚举的第1,第3和第5个值。我喜欢使用C语言中的半音和构建每个和弦的想法,但我无法弄清楚如何将#s放入Scales类(非法字符)..所以基本上我的问题是如何获得Chord类从Scales类中获取scale度并将其插入到EnumTest类中?
(如果还有其他地方我可以去问一些愚蠢的问题而不会惹恼别人我可以尝试问那里= p)
答案 0 :(得分:3)
如果您需要有限的一组值和功能将某些参数绑定到这些值,请使用Enums。
我第一次看到这个问题:
enum Note {
C, D, E, F, G, A, B
}
class Chord {
List<Note> notes;
}
在这种情况下,备注列表包含您在插入顺序中的和弦注释。如果您不关心顺序,并且我认为和弦不能包含类似的音符,请使用Set for notes holder。
此外,如果您需要使用代码,请使用Note.ordinal()
返回笔记代码。
答案 1 :(得分:2)
基本上,音符,和弦和和弦的进展都是枚举的组合。
我会这样做:
首先,注释的枚举。用半音而不是音符来思考要容易得多。
枚举注意{ C(1),C#(2),D(3),D#(4),E(5),F(6),F#(7),G(8),G#(8),A(9), A#(10),B(11)}
按照mishaddof
的建议实现Note.ordinal()其次,我将有一个包含所有可能的和弦类型的和弦枚举,它给出了添加到根音的半音的偏移量。例如:
enum Chord { 主要(4,7),少数(3,6)}
查找CMaj就像获取C Note并在Note枚举中获得4(E)和7(G)半音的Notes一样简单。对于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)