0

这是示例代码:

public class TestNoteValue {
    public static void main(String[] args) {
        Chord c = new Chord("C5maj");
        DevLog.debug(MusicAnnotationUtil.reportChord(c));
        // ----------------
        c.setOctave(4);
        DevLog.debug(MusicAnnotationUtil.reportChord(c));
    }
}

结果输出:

在此处输入图像描述

第一次结果是对的:Chord{Note{C5, 60}, Note{E5, 64}, Note{G5, 67}, }

C5 的值确实是 60。但是在 Chord.setOctave(4) 之后,它并没有改变第一个音符的表达,而是改变了它的值。导致正确性受损的音符数组: Chord{ Note{C5, 48} , Note{E4, 52}, Note{G4, 55}, }

我在这里错过了什么吗?

谢谢您的帮助!


由于 David 正在帮助研究代码,我将发布我的临时解决方法。希望它可以帮助其他人。

    public static Chord setOctave(Chord c, byte octave) {
    DevLog.super_trace("setting octave for chord "+c+" to "+octave);
    c.setOctave(octave);
    Note[] nA = new Note[3];
    for(int i=0; i<c.getNotes().length; i++){
        nA[i] = new Note(c.getNotes()[i].getValue());
    }
    return Chord.fromNotes(nA);
}
4

1 回答 1

0

我在 Note 类中添加了一个新方法,该方法会在更改注释的值时更新创建注释的“原始字符串”。

我会在修正一些其他问题后发布一个新版本。与此同时,Note.java 中发生了以下变化:

更新方法:

public Note setValue(byte value) {
    this.value = value;
    this.updateOriginalString(); // New line that calls the method below
    return this;
}

新方法:

private void updateOriginalString() {
    if (this.getOriginalString() != null) {
        String oldOriginalString = this.getOriginalString();
        StringBuilder newOriginalString = new StringBuilder();
        newOriginalString.append(getToneString());
        if ((oldOriginalString.length() > 1) && (oldOriginalString.substring(oldOriginalString.length()-2, oldOriginalString.length()-1).matches("\\d"))) {
            newOriginalString.append(getOctave());
        }
        setOriginalString(newOriginalString.toString());
    }
}

NoteTest.java 中的一个新测试:

@Test
public void testOriginalStringForNotes() {
    assertTrue(new Note("C").getOriginalString().equals("C"));
    assertTrue(new Note("C5").getOriginalString().equals("C5"));
    assertTrue(new Note("C").changeValue(+1).getOriginalString().equals("C#"));
    assertTrue(new Note("C5").changeValue(+1).getOriginalString().equals("C#5"));
    assertTrue(new Note("C").setValue((byte)48).getOriginalString().equals("C"));
    assertTrue(new Note("C5").setValue((byte)48).getOriginalString().equals("C4"));
}
于 2017-08-02T03:27:49.830 回答