Relacionados: Música: o que há nesse acorde? , Notas para tablatura , geração de abas de guitarra , Traduzir pares de números para notas de guitarra
Dado um toque de guitarra, produza o acorde que ele representa. Você pode usar entrada e saída padrão ou escrever uma função que retorne uma sequência.
Os dedilhados de entrada serão classificados como um dos seguintes acordes, a serem expressos da seguinte forma (se a nota principal for C):
- tríade principal:
C
- tríade menor:
Cm
- (dominante) sétimo:
C7
- sétima menor:
Cm7
O acorde pode estar invertido, portanto você não pode confiar na nota mais baixa como raiz. Você também não pode confiar que este é um dedilhado fácil ou comum no mundo real. De maneira mais geral, a saída do programa deve ignorar as oitavas dos arremessos e tratar todos os arremessos que correspondem à mesma nota musical (ou seja A
) igual.
Isso é código-golfe , então o código mais curto em bytes vence.
Formato de entrada
A entrada é uma série de 6 valores que indicam, para cada corda de um violão de 6 cordas na afinação padrão (EADGBE), na qual a guitarra será tocada. Também pode indicar que a corda não é tocada. O traste "zeroth" também é conhecido como posição aberta, e os números do traste são contados a partir daí. Suponha que o violão tenha 21 posições de traste, de modo que a posição mais alta seja o número 20.
Por exemplo, a entrada X 3 2 0 1 0
significa colocar os dedos nas seguintes posições na parte superior do pescoço do violão:
(6th) |---|---|---|---|---
|-X-|---|---|---|---
|---|---|---|---|---
|---|-X-|---|---|---
|---|---|-X-|---|---
(1st) |---|---|---|---|---
e dedilhando da 2ª à 6ª cordas. Corresponde a esta guia ASCII :
e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|
Você tem alguma flexibilidade na escolha do tipo de entrada que deseja: cada posição do traste pode ser expressa como uma string ou um número. As cordas da guitarra que não são tocadas são comumente indicadas com um X
, mas você pode escolher um valor de sentinela diferente se isso facilitar as coisas para você (como -1
se você estivesse usando números). A série de 6 posições de traste pode ser inserida como qualquer lista, matriz ou tipo de sequência, uma única sequência separada por espaço ou como entrada padrão - mais uma vez, sua escolha.
Você pode confiar na entrada correspondente a um dos quatro tipos de acordes mencionados acima.
Por favor, explique em sua postagem que forma de entrada sua solução leva.
Formato de saída
Você deve retornar ou imprimir na saída padrão uma sequência que descreva o acorde para o qual o dedilhado se destina. Essa sequência é composta por duas partes concatenadas juntas. Problemas de capitalização. Espaço em branco à direita é permitido.
A primeira parte indica a nota raiz , um de A
, A#
/ Bb
, B
, C
, C#
/ Db
, D
, D#
/ Eb
, E
, F
, F#
/ Gb
, G
, ou G#
/ Ab
. (Estou usando #
, em vez de ♯
, e b
em vez de ♭
, para evitar que requer Unicode.) Notas de raiz que podem ser expressos sem um sustenido ou bemol deve ser expressa sem eles (nunca de saída B#
, Fb
ou Dbb
); aqueles que não podem devem ser expressos com um único símbolo pontiagudo ou plano (ou seja , um C#
ou Db
, mas nunca B##
). Em outras palavras, você deve minimizar o número de acidentes (objetos cortantes ou rasos) no nome da nota.
A segunda parte indica o tipo de acorde, vazio para uma tríade maior, m
para uma tríade menor, 7
para a sétima dominante ou m7
para a sétima menor. Portanto, um Sol maior é produzido simplesmente como G
, enquanto um sétimo D menor pode ser produzido como um D#m7
ou outro Ebm7
. Mais exemplos podem ser encontrados nos casos de teste no final.
Teoria e dicas
Notas musicais
A escala cromática tem 12 arremessos por oitava. Quando sintonizados com o mesmo temperamento, cada um desses tons fica igualmente distante dos vizinhos 1 . Os arremessos separados por 12 semitons (uma oitava) são considerados a mesma nota musical. Isso significa que podemos tratar notas como números inteiros módulo 12, de 0 a 11. Sete delas recebem nomes de letras 2 de A a G. Isso não é suficiente para nomear todas as 12 notas, mas adicionar acidentalmente corrige isso: adicionar a ♯ ( nítida) a uma nota o torna um semitom mais alto e a adição de ♭ (plano) o torna um semitom mais baixo.
Acordes
Um acorde é de 2 ou mais notas tocadas juntas. O tipo de acorde depende das relações entre as notas, que podem ser determinadas pelas distâncias entre elas. Um acorde tem uma nota raiz, como mencionado anteriormente. Trataremos a nota raiz como 0 nesses exemplos, mas isso é arbitrário e tudo o que importa neste desafio é a distância entre as notas na aritmética do módulo. Sempre haverá um tipo de acorde exclusivo para a resposta, uma tríade ou um sétimo . A nota principal nem sempre será o tom de menor frequência; escolha a nota raiz para poder descrever o acorde como um dos quatro tipos de acordes a seguir:
- Uma tríade principal é um acorde com as notas
0 4 7
. - Uma tríade menor é um acorde com as notas
0 3 7
. - Um sétimo acorde dominante (ou maior / menor) possui as notas
0 4 7 10
. - Um sétimo acorde menor (ou menor / menor) possui as notas
0 3 7 10
. 3
Afinação de guitarra
A afinação padrão em uma guitarra de 6 cordas começa com E na corda mais baixa e, em seguida, toca notas em intervalos de 5, 5, 5, 4 e 5 semitons subindo as cordas. Tomando o E mais baixo como 0, isso significa tocar todas as cordas do violão, dando-lhe notas numeradas 0 5 10 15 19 24
, às quais o módulo 12 é equivalente 0 5 10 3 7 0
ou as notas E A D G B E
.
Exemplos trabalhados
Se sua entrada é 0 2 2 0 0 0
, isso corresponde às notas E B E G B E
, então apenas E, B e G. Elas formam o acorde Em
, que pode ser visto numerando-as com a raiz como E, fornecendo-nos 0 3 7
. (O resultado seria o mesmo para X 2 X 0 X 0
, ou 12 14 14 12 12 12
.)
Se sua entrada for 4 4 6 4 6 4
, numerá-las com uma raiz de C♯ fornece 7 0 7 10 4 7
, ou 0 4 7 10
, então a resposta é C#7
(ou Db7
). Se fosse 4 4 6 4 5 4
, a numeração daria 7 0 7 10 3 7
, ou 0 3 7 10
, qual é C#m7
(ou Dbm7
).
Casos de teste
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 pelos logaritmos de suas frequências
2 ou, em solfège , nomes como do, re, mi . Nesse desafio, use os nomes das letras.
3 Isso também pode ser chamado de sexto acorde principal, com uma escolha diferente de nota raiz. Neste desafio, chame-o pelo seu sétimo nome menor.
Respostas:
MATL ,
115114 bytesO formato de entrada é
[N 3 2 0 1 0]
ondeN
indica a sequência não utilizada.A string de saída sempre usa
#
, nãob
.Experimente online! Ou verifique todos os casos de teste, em duas partes, para evitar o tempo limite do compilador online:
Explicação
fonte
Arquivo .com do MS-DOS (179 bytes)
O arquivo (aqui exibido como HEX):
A entrada é dada via linha de comando. Entrada inválida levará a um comportamento inválido do programa!
O código do assembler fica assim:
Eu já vi dois pianistas tocando juntos "quatro mãos" em um piano.
Este caso de teste é a primeira vez que li sobre guitarristas fazendo isso!
Mesmo com o toque da mão direita, você não pode tocar um cabo como este!
fonte
Ruby, 129 bytes
Como versão anterior, mas usa um loop único, com operador ternário para sequenciar entre a etapa de análise e a etapa de saída. Algumas outras pequenas modificações foram necessárias para fazer esse trabalho.
Ruby, 136 bytes
A função Llamda aceita uma matriz de 6 números como argumento e gera saída para stdout. Cadeia de caracteres não utilizada é representada por um valor falso (os únicos valores falsificados em ruby são
nil
efalse
.)Explicação
Eu uso uma representação dos 12 arremessos com base no círculo dos quintos . Isso significa que cada tom é seguido pelo tom 7 semitons mais alto (ou 5 semitons mais baixo), fornecendo a sequência
F C G D A E B F# C# G# D# A#
. Existem 2 vantagens nisso. Uma é que todos os objetos cortantes aparecem juntos. A outra é que as notas de corda aberta do baixo de 5 cordas aparecem juntas: GDAEB (a guitarra está relacionada, mas um pouco mais complexa, veja abaixo).O primeiro loop é executado 6 vezes. A expressão
6--~j%5
(equivalente6-(j+1)%5
) dá os valores de nota para as cordas abertas:E=5 A=4 D=3 G=2 B=6 E=5
. Para isso, adicionamos o número do traste multiplicado por 7 (como pode ser visto acima, adicionar um semitom nos move 7 lugares adiante na sequência.) Em seguida, pegamos a coisa toda no módulo 12 e fazemos um bitmap das notas que estão presentes (nós use4097<<note value
para fornecer 2 oitavas consecutivas.)Depois de compor o bitmap, estamos prontos para pesquisar o acorde e produzi-lo.
Estamos interessados nas seguintes notas:
Começando pela verificação do acorde F, testamos para ver se a raiz e o quinto estão presentes: bits 0 e 1 (contando desde os menos significativos: bits do 1 e do 2). Para rejeitar o sexto acorde, também precisamos verificar se o sexto está ausente: bit 3 (bit de 8). portanto, verificamos isso
r&&11==3
e, se sim, imprimimos o acorde.Ignoramos o terço maior e confiamos inteiramente no bit 9 (terço menor) e no bit 10 (sétimo menor) para calcular o tipo de acorde. A expressão
r>>9&3
é usada para escolher o tipo de acorde correto de uma matriz.No final do ciclo, mudamos o bitmap caminho certo bit
r/=2
para testar as possíveis raízes de acordes em seqüência:F C G D A E B F# C# G# D# A#
.Ungolfed in program program
fonte
Javascript (ES6),
335333 bytesAdoro este desafio e PPCG SE! Este é o meu primeiro golfe - sugestões são bem-vindas, pois tenho certeza de que poderia melhorar muito. (tirei 2 bytes como eu incluíra f = na contagem)
A função
f
pega uma matriz de strings, representando números e 'X', comof(['X','3','2','0','1','0'])
e retorna um acorde (natural ou nítido)E#m7
. Novas linhas adicionadas para maior clareza (não incluídas na contagem de bytes)Exemplo de uso:
Para executar casos de teste:
Versão ungolfed com explicação:
fonte