我试着转调一个音符,但是它返回的结果不是它应该的结果。你能检查一下我的密码并告诉我哪里错了吗?
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;}
好的,这是要做的是改变一个和弦的值给定一个和弦的进度与间隔。就像III iv-iv。用户将选择一个音调(调性,我音符),和弦将被改变,以音符作为参考。因此,例如,运行代码应该执行以下操作:
预期输出为:E#-A#-A#-A#实际输出为:C#-G#-Bb
为什么这个不行?我已经简化了我的代码,所以如果你需要更多,请告诉我!提前谢谢。
编辑:我已经更正了代码并添加了预期的/获取的输出。
发布于 2018-11-13 03:32:26
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中有几个Chord级数示例
https://stackoverflow.com/questions/53169518
复制相似问题