Изменение заметки JFugue не работает должным образом - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь транспонировать заметку, но результат, который она возвращает, не тот, каким он должен быть. Не могли бы вы проверить мой код и сказать, где я не прав?

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. Пользователь выберет тональность (тон, я отмечаю), и аккорд будет изменен, принимая ноту в качестве ссылки. Так, например, выполнение кода должно сделать следующее:

  • Пользователь выбирает тон, скажем "Е".
  • Код генерирует последовательность аккордов, скажем "I-III-IV-iv".
  • Код получает интервал между I и III, I и IV, и I и iv.
  • Начальная нота, "E", меняет свое значение с интервалом.

Ожидаемый результат: E-G # -A # -A # Фактический результат: C-G # -G # -BB

Почему это не работает? Я упростил свой код, поэтому, если вам нужно немного больше, дайте мне знать! Заранее спасибо.

Редактировать: я исправил код и добавил ожидаемый / полученный вывод.

1 Ответ

0 голосов
/ 13 ноября 2018

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");

Есть несколько примеров Chord Progression в http://www.jfugue.org/examples.html

...