Связанный: Музыка: что в этом аккорде? , Заметки к табулатуре , Создание гитарных вкладок? , Переведите пары чисел в гитарные ноты
Учитывая гитару, выведите аккорд, который он представляет. Вы можете использовать стандартный ввод и вывод или написать функцию, которая возвращает строку.
Входные отпечатки будут классифицироваться как один из следующих аккордов, который будет выражаться следующим образом (если корневая нота была C):
- главная триада:
C
- второстепенная триада:
Cm
- (доминирующий) седьмой:
C7
- младший седьмой:
Cm7
Аккорд может быть перевернут, поэтому нельзя полагаться на низшую ноту, являющуюся корнем. Вы также не можете полагаться на то, что это легкая или обычная аппликатура в реальном мире. В более общем случае выходные данные вашей программы должны игнорировать октавы высот и обрабатывать все высотные отметки, которые соответствуют одной и той же музыкальной ноте (т.е. A
), как равные.
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Формат ввода
Входные данные представляют собой последовательность из 6 значений, которые указывают для каждой струны 6-струнной гитары в стандартной настройке (EADGBE), на которой будет раздражаться эта строка. Это также может указывать на то, что строка не воспроизводится вообще. «Нулевой» лад также известен как открытая позиция, и отсюда начинаются числа ладов. Предположим, что у гитары 21 позиция ладов, так что самая высокая позиция ладов - номер 20.
Например, ввод X 3 2 0 1 0
означает размещение пальцев в следующих положениях в верхней части шеи гитары:
(6th) |---|---|---|---|---
|-X-|---|---|---|---
|---|---|---|---|---
|---|-X-|---|---|---
|---|---|-X-|---|---
(1st) |---|---|---|---|---
и играет на 2-й и 6-й струнах. Это соответствует этой вкладке ASCII :
e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|
У вас есть некоторая гибкость в выборе типа ввода, который вы хотите: каждая позиция раздражения может быть выражена в виде строки или числа. Гитарные струны, которые не воспроизводятся, обычно обозначаются знаком X
, но вы можете выбрать другое значение часового значения, если это облегчит вам задачу (например, -1
если вы используете числа). Последовательность из 6 позиций ладов может быть введена в виде любого списка, массива или типа последовательности, отдельной строки через пробел или в качестве стандартного ввода - еще раз, на ваш выбор.
Вы можете положиться на вход, соответствующий одному из 4 типов аккордов, упомянутых выше.
Пожалуйста, объясните в своем посте, какую форму ввода использует ваше решение.
Выходной формат
Вы должны либо вернуть, либо вывести на стандартный вывод строку, описывающую аккорд, для которого предназначена аппликатура. Эта строка состоит из двух частей, соединенных вместе. Вопросы капитализации. Конечный пробел разрешен.
Первая часть указывает на основную ноту , один из A
, A#
/ Bb
, B
, C
, C#
/ Db
, D
, D#
/ Eb
, E
, F
, F#
/ Gb
, G
или G#
/ Ab
. (Я использую #
вместо ♯
, и b
вместо того ♭
, чтобы избежать требует Unicode.) Корневые заметки , которые могут быть выражены без резких или квартиры должны быть выражены без них (никогда не выход B#
, Fb
или Dbb
); те, которые не могут быть обозначены одним острым или плоским символом (т. е. или C#
или Db
, но никогда B##
). Другими словами, вы должны минимизировать количество случайных (острых предметов или квартир) в имени заметки.
Вторая часть указывает тип аккорда, либо пустой для большой триады, m
для малой триады, 7
для доминирующей седьмой или m7
для младшей седьмой. Таким образом , в G мажоре выводится просто G
, в то время как незначительные седьмой D♯ может быть выход или как D#m7
или Ebm7
. Больше примеров можно найти в тестовых примерах в конце.
Теория и советы
Музыкальные ноты
Хроматическая шкала имеет 12 шагов на октаву. При настройке на одинаковый темперамент каждый из этих шагов одинаково удален от своих соседей 1 . Высота тона, составляющая 12 полутонов (октава), считается одной и той же музыкальной нотой. Это означает, что мы можем рассматривать заметки как целые числа по модулю 12, от 0 до 11. Семь из них имеют буквенные имена 2 от A до G. Этого недостаточно, чтобы назвать все 12 тонов, но добавление случайных ошибок исправляет следующее: добавление ♯ ( от резкой) к ноте делает его на полтона выше, а добавление flat (плоского) делает его на полтона ниже.
Аккорды
Аккорд - это две или более нот, сыгранных вместе. Тип аккорда зависит от отношений между нотами, которые могут быть определены расстояниями между ними. Аккорд имеет корневую ноту, как упоминалось ранее. Мы будем рассматривать корневую заметку как 0 в этих примерах, но это произвольно, и все, что имеет значение в этой задаче, - это расстояние между заметками в арифметике по модулю. Для ответа всегда будет один уникальный тип аккордов: триада или седьмой аккорд . Корневая нота не всегда будет самой низкой частотой звука; выберите основную ноту так, чтобы вы могли описать аккорд как один из четырех следующих типов аккордов:
- Мажорное трезвучие это аккорд с нотами
0 4 7
. - Незначительная триада является хордой с примечаниями
0 3 7
. - Доминирующий (или крупный / минор) седьмой аккорд имеет ноты
0 4 7 10
. - У младшего (или младшего / младшего) седьмого аккорда есть ноты
0 3 7 10
. 3
Гитара тюнинг
Стандартная настройка на 6-струнной гитаре начинается с E на самой нижней струне, а затем нажимает ноты с интервалами 5, 5, 5, 4, а затем на 5 полутонов, идущих вверх по струнам. Принимая самое низкое E за 0, это означает, что удар по всем струнам гитары дает вам пронумерованные высоты 0 5 10 15 19 24
, которые по модулю 12 эквивалентны 0 5 10 3 7 0
, или ноты E A D G B E
.
Отработанные примеры
Если вы вводите 0 2 2 0 0 0
, это соответствует примечаниям E B E G B E
, так что только E, B и G. Они образуют аккорд Em
, который можно увидеть, пронумеровав их корнем как E, что дает нам 0 3 7
. (Результат будет таким же для X 2 X 0 X 0
или 12 14 14 12 12 12
.)
Если вы вводите 4 4 6 4 6 4
, нумерация их с корнем C♯ дает 7 0 7 10 4 7
, или 0 4 7 10
, поэтому ответ C#7
(или Db7
). Если бы это было вместо этого 4 4 6 4 5 4
, нумерация дала бы 7 0 7 10 3 7
, или 0 3 7 10
, который C#m7
(или Dbm7
).
Контрольные примеры
X 3 2 0 1 0 ---> C
0 2 2 0 0 0 ---> Em
X 2 X 0 X 0 ---> Em
4 4 6 4 6 4 ---> C#7 (or Db7)
4 4 6 4 5 4 ---> C#m7 (or Dbm7)
0 2 2 1 0 0 ---> E
0 0 2 2 2 0 ---> A
X X 4 3 2 2 ---> F# (or Gb)
3 2 0 0 0 1 ---> G7
X X 0 2 1 1 ---> Dm7
3 3 5 5 5 3 ---> C
4 6 6 5 4 4 ---> G# (or Ab)
2 2 4 4 4 5 ---> B7
0 7 5 5 5 5 ---> Am7
7 6 4 4 X X ---> B
8 6 1 X 1 3 ---> Cm
8 8 10 10 9 8 --> Fm
0 19 5 16 8 7 --> Em
6 20 0 3 11 6 --> A# (or Bb)
X 14 9 1 16 X --> G#m (or Abm)
12 14 14 12 12 12 --> Em
15 14 12 12 12 15 --> G
20 X 20 20 20 20 --> Cm7
X 13 18 10 11 10 --> A#7 (or Bb7)
1 по логарифмам их частот
2 или, в solfège , такие имена, как do, re, mi . В этом вызове используйте буквенные имена.
3 Это также можно назвать мажорным шестым аккордом с другим выбором основной ноты. В этом вызове назовите его вторым седьмым именем.
Ответы:
MATL ,
115114 байтФормат ввода -
[N 3 2 0 1 0]
гдеN
указывается неиспользуемая строка.Выходная строка всегда использует
#
, а неb
.Попробуйте онлайн! Или проверьте все контрольные примеры в двух частях, чтобы избежать тайм-аута онлайн-компилятора:
объяснение
источник
Файл MS-DOS .COM (179 байт)
Файл (здесь отображается как HEX):
Ввод осуществляется через командную строку. Неверный ввод приведет к некорректному поведению программы!
Код на ассемблере выглядит так:
Я уже видел двух пианистов, играющих вместе на фортепиано в четыре руки.
Этот тестовый пример - первый раз, когда я читаю о гитаристах, делающих это!
Даже с правым постукиванием вы не можете разыграть такой шнур!
источник
Рубин, 129 байт
Как и в предыдущей версии, но используется один цикл с троичным оператором для последовательности между этапом синтаксического анализа и этапом вывода. Некоторые другие незначительные изменения были необходимы, чтобы сделать эту работу.
Рубин, 136 байт
Функция Llamda принимает массив из 6 чисел в качестве аргумента и выводит на стандартный вывод. Неиспользуемая строка представляется ложным значением (единственными ложными значениями в ruby являются
nil
иfalse
.)объяснение
Я использую представление 12 шагов на основе круга пятых . Это означает, что за каждой высотой звука следует высота на 7 полутонов (или на 5 полутонов ниже), что дает последовательность
F C G D A E B F# C# G# D# A#
. В этом есть два преимущества. Во-первых, все острые предметы появляются вместе. Другое состоит в том, что открытые струнные ноты 5-струнного баса появляются вместе: GDAEB (гитара связана, но немного более сложна, см. Ниже).Первый цикл выполняется 6 раз. Выражение
6--~j%5
(эквивалентно6-(j+1)%5
) дает значение ноты для открытых струн:E=5 A=4 D=3 G=2 B=6 E=5
. К этому мы добавляем число ладов, умноженное на 7 (как видно выше, добавление одного полутона перемещает нас на 7 позиций вперед в последовательности.) Затем мы берем все это по модулю 12 и делаем растровое изображение из присутствующих нот (мы используйте,4097<<note value
чтобы дать 2 последовательных октавы.)Составив растровое изображение, мы готовы искать аккорд и выводить его.
Нас интересуют следующие заметки:
Начав с проверки аккорда F, мы проверяем, присутствуют ли корень и пятый: биты 0 и 1 (считая от наименее значимого: биты 1 и 2). Чтобы отклонить шестой аккорд, нам также необходимо проверить, что шестой отсутствует: бит 3 (бит 8), поэтому мы проверяем это,
r&&11==3
и если это так, мы печатаем аккорд.Мы игнорируем основную треть и полностью полагаемся на бит 9 (младшая треть) и бит 10 (младшая 7-я) для определения типа аккорда. Выражение
r>>9&3
используется для выбора правильного типа аккорда из массива.В конце цикла, мы сдвинуть растровый вправо на один бит ,
r/=2
чтобы проверить возможные корни аккордов в следующей последовательности:F C G D A E B F# C# G# D# A#
.Неуправляемый в тестовой программе
источник
Javascript (ES6),
335333 байтаЛюблю этот вызов и PPCG SE! Это мой первый гольф - предложения приветствуются, так как я уверен, что это можно улучшить. (сбил 2 байта, так как я включил в счет f =)
Функция
f
принимает массив строк, представляющих числа и «X», какf(['X','3','2','0','1','0'])
и возвращает аккорд (натуральный или резкий), какE#m7
. Новые строки добавлены для ясности (не включены в число байтов)Пример использования:
Для запуска тестовых случаев:
Неуправляемая версия с объяснением:
источник