2011-11-01 174 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

相關問題