我正在使用jFugue 5.0.9。我的代码是从购买的完整指南到jFugue的样本的修改版本(它也不起作用。:#)。这是代码:
private void chordProgression2() {
ChordProgression cp = new ChordProgression("I IV V");
for(Chord c:cp.getChords()){
DevLog.debug("chord: "+c);
}
Player player = new Player();
//-------------------------
ChordProgression cp1= cp.eachChordAs("$0 $0 $0 $0 $1 $1 $0 $0 $2 $1 $0 $0");
DevLog.debug("generated1::"+cp1.getPattern());
for(Chord c:cp1.getChords()){
DevLog.debug("chord: "+c);
}
ChordProgression cp2=cp1.allChordsAs("$0i $1i $2i $3i $4i $3i $2i $1i");
DevLog.debug("generated2::"+cp2.getPattern());
player.play(cp2);
//player.play(cp.allChordsAs("$0q $0q $0q $0q $1q $1q $2q $0q"));
//player.play(cp.allChordsAs("$0 $0 $0 $0 $1 $1 $2 $0").eachChordAs("V0 $0s $1s $2s Rs V1 $!q"));
}

结果:
2017-06-29 17:26:24.986 1 D和弦:C4MAJ 2017-06-29 17:26:25.044 1 D和弦:F4MAJ 2017-06-29 17:26:25.044 1 D和弦:G4MAJ 2017-06-29 17:26:26.087 1 D generated1 :: C4 C4 C4 C4 E4 E4 C4 C4 G4 E4 C4 C4 F4 F4 F4 F4 A4 A4 F4 F4 C5 A4 F4 F4 G4 G4 G4 G4 B4 B4 G4 G4 D5 B4 G4 G4 2017-06-29 17:26:26.088 1 D和弦:C4MAJ 2017-06-29 17:26:26.088 1 D和弦:F4MAJ 2017-06-29 17:26:26.088 1 D和弦:G4MAJ 线程" main"中的例外情况java.lang.ArrayIndexOutOfBoundsException:3 at org.jfugue.pattern.ReplacementFormatUtil.replaceDollarsWithCandidates(ReplacementFormatUtil.java:53) at org.jfugue.pattern.ReplacementFormatUtil.replaceDollarsWithCandidates(ReplacementFormatUtil.java:16) 在org.jfugue.theory.ChordProgression.getPattern(ChordProgression.java:90) 在mozzart.test.jfugueHelloWorld.HelloWorld.chordProgression2(HelloWorld.java:147) 在mozzart.test.jfugueHelloWorld.HelloWorld.main(HelloWorld.java:40)
以下是指南中的原始样本
ChordProgression cp = new ChordProgression(" I IV V").eachChordAs(" $ 0 $ 0 $ 0 $ 0 $ 1 $ 1 $ 0 $ 0 $ 2 $ 1 $ 0 $ 0")。allChordAs(&#34 ; $ 0i $ 1i $ 2i $ 3i $ 4i $ 3i $ 2i $ 1i"); 模式模式= cp.getPattern();
在指南中:.allChordAs必须是拼写错误,因为它应该是.allChordsAs。 (在和弦之后)。它假设新的ChordProgression(" I IV V").eachChordAs(" $ 0 $ 0 $ 0 $ 0 $ 1 $ 1 $ 0 $ 0 $ 2 $ 1 $ 0 $ 0"返回至少5个和弦的ChordProgression,但是我的代码证明它只返回3个和弦。
那么我该如何使样本有效呢?
谢谢你。
答案 0 :(得分:0)
感谢您指出这一点 - 本书中的示例中存在错误,我必须解决此问题。
你应该说'#34; allChordsAs" (伴随着' Chord')。另一个问题 - 造成ArrayIndexOutOfBounds错误的问题 - 是3美元和4美元。
在一起,I,IV和V只有三个和弦;可以使用$ 0,$ 1和$ 2访问它们。 3美元和4美元没有和弦可供查找,因此您可以获得越界异常。你的ChordProgression需要5个和弦,3美元和4美元才能工作。
所以,你可以: 1.从allChordsAs中删除3美元和4美元,或者...... 2.在ChordProgression中添加两个和弦
(而且你知道,每个ChordAs中的索引值都是指和弦中的各个音符.I,IV和V都是大和弦,每个都有3个音符。其他和弦,如七,有4个音符。)