JFugue更改笔记无法正常工作

时间:2018-11-06 09:56:45

标签: java jfugue

我正在尝试移调音符,但是它返回的结果不是应该的。您能检查我的代码并告诉我哪里错了吗?

public int changeTone(String chord) {
            int changeTone = 0;
            switch(chord) {
            case "I":
            changeTone = 0;
            break;
        case "II":
            changeTone = 1;
            break;
        case "III":
            changeTone = 2;
            break;
        case "IV":
            changeTone = 3;
            break;
        case "V":
            changeTone = 4;
            break;
        case "VI":
            changeTone = 5;
            break;
        case "VII":
            changeTone = 6;
            break;
        case "i":
            changeTone = 0;
            break;
        case "ii":
            changeTone = 2;
            break;
        case "iii":
            changeTone = 4;
            break;
        case "iv":
            changeTone = 5;
            break;
        case "v":
            canviDeTo = 7;
            break;
        case "vi":
            changeTone = 9;
            break;
        case "vii":
            changeTone = 11;
            break;
        default:
            System.out.println("Vaya"); 
            break;

        }
        return changeTone ;
    }

public String getChord(int interval) {
    String chord = "";

    switch(interval) {
            case "0":
                chord = "C";
                break;
            case "2":
                chord = "D";
                break;
            case "4":
                chord = "E";
                break;
            case "5":
                chord = "F";
                break;
            case "7":
                chord = "G";
                break;
            case "9":
                chord = "A";
                break;
            case "11":
                chord = "B";
}
return chord;
}

public String WriteChord(String chords, String tone) {
    String finalChord;
    String[] chordArray = chords.split("-");
    for(int i=0; i < chordArray.length; i++){
        String chord = chordArray[i];
        int interval = changeTone(chord);
        chord = getChord(interval);
        Note note = new Note(chord);
        finalChord += note.changeValue(interval).toString() += "-";
    }
return finalChord;

}


好的,因此,这样做的尝试是在给定间隔的和弦进行过程中更改和弦的值。像I-III-IV-iv。用户将选择一个音调(我的音色为音调),并以该音符为参考来更改和弦。因此,例如,运行代码应执行以下操作:

  • 用户选择一个音调,说“ E”。
  • 代码生成和弦进行过程,例如“ I-III-IV-iv”。
  • 代码获取I与III,I与IV以及I与iv之间的间隔。
  • 初始音符“ E”随时间间隔改变其值。

预期输出为: E-G#-A#-A# 实际输出为: C-G#-G#-Bb

为什么这行不通?我简化了我的代码,所以如果您需要更多信息,请告诉我!预先感谢。

编辑:我已经更正了代码,并添加了预期/获得的输出。

1 个答案:

答案 0 :(得分:1)

JFugue已经支持音程和和弦进行。我希望以下代码能够满足您的需求:

import org.jfugue.theory.ChordProgression;

public static void main(String[] args) {
    ChordProgression cp = new ChordProgression("I-III-IV-iv").setKey("E");
    System.out.println(cp);
}

此代码的输出为:

E4MAJ G#4MAJ A4MAJ A4MIN

您可以直接在播放器中播放

Player player = new Player();  // Don't forget to import org.jfugue.player.Player
player.play(cp);

如果由于默认的四分音符持续时间而对您来说演奏速度太快,您可以将每个和弦演奏的时间更长一些,例如说整个音符:

player.play(cp.eachChordAs("$!w"));

如果您只想要[E,G#,A,A]的根,(如果您发现我的音乐理论有误,请告诉我),您可以使用:

cp.eachChordAs("$0");

http://www.jfugue.org/examples.html上有几个和弦进行音的例子