Сделать строку букв и цифр? - PullRequest
0 голосов
/ 01 ноября 2011

Я давно хотел написать музыкальную программу, но я не очень разбираюсь в программировании, так что, вероятно, этого не произойдет. Сначала целью этой программы будет представление гитарных аккордов буквенными именами (например, CMaj = CEG), и может быть несколько разных типов аккордов (майоры, миноры, уменьшенные и т. Д.). Чтобы сделать это проще всего, я Я думаю, что я собираюсь начать с мажорной тональности, потому что в ней нет острых предметов или квартир. Моим первым аккордом, вероятно, был бы до мажор, который является 1-м, 3-м и 5-м по шкале ( C D E F G A B). Мой вопрос, используя строки и символы (или, как я догадываюсь, каким-то другим способом), есть ли способ представить C как String (?) C, где C = 1, D = 2, E = 3 ,. .так далее. так что, когда программа вводит мажорный аккорд, она запрашивает 1-й, 3-й и пятый соответствующей шкалы? Таким образом, в основном пользователь выбирает аккорд C Maj, который преобразуется в 1, 3, 5, а затем сопоставляются весы, и программа вызывает эти 3 конкретных интервала этого масштаба.

Буду признателен за любую помощь, или другой способ думать об этом полностью.

Используя то немногое, что у меня было, я использовал веб-сайт Oracles , нашел их пример перечисления и соединил это:

public enum Chord {
CHORD, MAJOR, MINOR, DIMINISHED, BASS, BASS2

}

public enum Scales {
C, D, E, F, G, A

}

public class EnumTest {
Chord chord;

public EnumTest(Chord chord) {
    this.chord = chord;
}

public void tellItLikeItIs() {
    switch (chord) {
        case MAJOR: System.out.println("C, E, G");
                     break;

        case MINOR: System.out.println("C, Eb, G");
                     break;



        default:     System.out.println("I screwed up");
                     break;
    }
}

public static void main(String[] args) {
    EnumTest firstDay = new EnumTest(Chord.MAJOR);
    firstDay.tellItLikeItIs();
    EnumTest thirdDay = new EnumTest(Chord.MINOR);
    thirdDay.tellItLikeItIs();


}
* *} Тысяча двадцать-один

Я до сих пор не понимаю, используя пример Оливера, как указать, когда я делаю мажорный аккорд, который я хочу, чтобы 1-е, 3-е и 5-е значение перечисления Scales. Мне нравится идея использования полутонов из C и построения каждого аккорда, но я не мог понять, как поместить # в класс Scales (недопустимый символ). Поэтому в основном мой вопрос заключается в том, как мне получить класс Chord, чтобы получить градусы шкалы из класса Scales и подключить его к классу EnumTest?

(Если есть где-то еще, я могу пойти и задать глупые вопросы, не задевая людей, я могу попытаться спросить там = p)

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Если вам нужен ограниченный набор значений и возможность привязать некоторые параметры к этим значениям, используйте Enums .

Мой первый взгляд на эту проблему:

enum Note {
 C, D, E, F, G, A, B
}

class Chord {
   List<Note> notes;
}

В этом случае список заметок содержит ваши ноты для аккорда в порядке вставки. Если вас не интересует порядок, и, как я полагаю, аккорд не может содержать похожие ноты, используйте «Set» для держателя нот.

Также, если вам нужны коды, используйте Note.ordinal(), который возвращает код вашей заметки.

2 голосов
/ 01 ноября 2011

По сути, ноты, аккорды и последовательность аккордов - это комбинация перечислений.

Я бы пошел на это:

Во-первых, перечисление Note.Гораздо проще думать в терминах полутонов, а не нот.

enum Note {C (1), C # (2), D (3), D # (4), E (5),F (6), F # (7), G (8), G # (8), A (9), A # (10), B (11)}

с реализацией Note.ordinal ()в соответствии с предложением mishaddof

Во-вторых, у меня будет перечисление Chord, содержащее все возможные типы Chord, которые дают смещение полутонов, добавляемых к корневой ноте.Например:

enum Chord {MAJOR (4, 7), MINOR (3, 6)}

Найти CMaj так же просто, как получить ноту C и получить ноты, которые лежат 4(E) и 7 (G) полутонов далее в перечислении примечания.Для G # Maj (8) его C (8 + 4 = 12 (-11) = 1, затем D # (8 + 7 = 15-11 = 4). Для Dmin, D (3), F (3 + 3 =6) и A # (3 + 7 = 9)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...