2011-11-01 19 views
0

我一直想写一段音乐程序,但是我对编程不是很了解,所以可能不会发生。首先这个程序的目标是代表带有字母名称的吉他和弦(例如:CMaj = CEG),并且可能有几种不同类型的和弦(专业,未成年人,减少等等)。为了使这个最简单,我我认为我要从C大调开始,因为那里没有任何利器或单位。我的第一个和弦可能是一个C大调,它是刻度的第一,第三和第五(C D E F G A B)。我的问题是,使用字符串和字符(或其他方式,我有点猜测),有没有办法将C表示为String(?)C,其中C = 1,D = 2,E = 3。 。等等。这样当节目输入一个大和弦时,它会请求相应音阶的第1,3,5个位置? 因此,基本上用户选择和弦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中的半音并构建每个和弦的想法,但我无法弄清楚如何将#放入Scales类(非法字符)中。所以基本上我的问题是如何获得Chord类从Scales类获取缩放比例并将其插入EnumTest类中?

(如果有别的地方我可以去,问愚蠢的问题没有窃听的人,我可以试着问有= P)

+0

你只是试图做出一个界面,告诉用户什么音符是和弦的一部分,或者你想实际播放声音吗? – Shaded

+0

我想让用户选择C从下拉菜单中选择,然后使用和弦的音阶程序将返回1,3,5(或C,E,G) – cutrightjm

+0

我会尽量在接下来的几天里找到一两个小时给你“我的”完全实现你的问题,如果你愿意的话);现在谈到Scale和degree,就代码实现而言,这只是令人困惑,你不应该关心它。对于非法的#字符,请命名为C#CSharp,它也可以执行此操作;) – Olivier

回答

2

基本上,音符,和弦和和弦进程是枚举的组合。

我会为此:

首先,一个注释的枚举。用半色调而不是笔记来思考要容易得多。(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

其次的建议,我将有包含所有和弦枚举可能的和弦类型,它给出了添加到根音的半音的偏移量。对于为例:

枚举和弦{ MAJOR(4,7),MINOR(3,6)}

查找CMAJ是作为得到C注意和获得该介于4注释一样简单(E)和Note(枚举)中的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)

3

如果您需要设定限定值及能力,结合一些参数这些值,使用Enums

我第一次看这个问题:

enum Note { 
C, D, E, F, G, A, B 
} 

class Chord { 
    List<Note> notes; 
} 

在这种情况下笔记列表中包含您的笔记中插入顺序和弦。如果您不关心订单,并且我想和弦不能包含类似的音符,请使用Set for notes holder。

此外,如果您需要使用代码,请使用Note.ordinal()返回您的笔记的代码。

+0

我会给你upvote,但我现在没有能力= p谢谢你的帮助,这给了我一个好主意,如何做到这一点。 – cutrightjm

+0

使用笔记列表,您必须手动定义每个和弦的所有笔记,而不是计算它们。 “魔法数字”,不是很好:( – Olivier

+0

当然,但没有一般的计算和弦的方法,无论如何我们应该根据和弦定义一组音符 – mishadoff

相关问题