Relacionado: Música: ¿qué hay en este acorde? , Notas a la tablatura , ¿ Generando tablaturas para guitarra? , Traducir pares de números a notas de guitarra
Dada una digitación de guitarra, emite el acorde que representa. Puede usar la entrada y salida estándar, o escribir una función que devuelva una cadena.
Las digitaciones de entrada se clasificarán como uno de los siguientes acordes, que se expresarán de la siguiente manera (si la nota raíz fuera C):
- tríada mayor:
C
- tríada menor:
Cm
- (dominante) séptimo:
C7
- séptimo menor:
Cm7
El acorde puede estar invertido, por lo que no puede confiar en que la nota más baja sea la raíz. Tampoco puedes confiar en que esto sea una digitación fácil o común en el mundo real. En términos más generales, la salida de su programa debe ignorar las octavas de los tonos y tratar todos los tonos que corresponden a la misma nota musical (es decir, A
) como iguales.
Este es el código de golf , por lo que gana el código más corto en bytes.
Formato de entrada
La entrada es una serie de 6 valores que indican, para cada cuerda de una guitarra de 6 cuerdas en afinación estándar (EADGBE), en qué traste se tocará esa cuerda. También podría indicar que la cadena no se reproduce en absoluto. El traste "zeroth" también se conoce como la posición abierta, y los números de traste cuentan desde allí. Suponga que la guitarra tiene 21 posiciones de traste, de modo que la posición más alta de traste es el número 20.
Por ejemplo, la entrada X 3 2 0 1 0
significa colocar los dedos en las siguientes posiciones en la parte superior del cuello de la guitarra:
(6th) |---|---|---|---|---
|-X-|---|---|---|---
|---|---|---|---|---
|---|-X-|---|---|---
|---|---|-X-|---|---
(1st) |---|---|---|---|---
y rasgueando las cuerdas segunda a sexta. Corresponde a esta pestaña ASCII :
e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|
Tiene cierta flexibilidad para elegir el tipo de entrada que desea: cada posición de traste se puede expresar como una cadena o un número. Las cuerdas de guitarra que no se tocan se indican comúnmente con un X
, pero puede elegir un valor centinela diferente si eso lo hace más fácil para usted (como -1
si usa números). La serie de 6 posiciones de traste se puede ingresar como cualquier lista, matriz o tipo de secuencia, una sola cadena separada por espacios o como entrada estándar, una vez más, usted elige.
Puede confiar en la entrada correspondiente a uno de los 4 tipos de acordes mencionados anteriormente.
Explica en tu publicación qué forma de entrada toma tu solución.
Formato de salida
Debe devolver o imprimir en la salida estándar una cadena que describa el acorde para el que es digitación. Esta cadena se compone de dos partes concatenadas juntas. La capitalización importa. Se permite el espacio en blanco al final.
La primera parte indica el nota fundamental , uno de A
, A#
/ Bb
, B
, C
, C#
/ Db
, D
, D#
/ Eb
, E
, F
, F#
/ Gb
, G
o G#
/ Ab
. (Estoy usando en #
lugar de ♯
, y en b
lugar de ♭
, para evitar requerir Unicode.) Las notas de raíz que se pueden expresar sin un agudo o plano deben expresarse sin ellas (nunca emitir B#
,Fb
o Dbb
); los que no pueden expresarse con un solo símbolo agudo o plano (es decir, uno C#
o Db
, pero nunca B##
). En otras palabras, debe minimizar el número de accidentes (objetos punzantes o planos) en el nombre de la nota.
La segunda parte indica el tipo de acorde, ya sea vacío para una tríada mayor, m
para una tríada menor, 7
para la séptima dominante o m7
para la séptima menor. Entonces, un G mayor se emite simplemente como G
, mientras que un séptimo menor D♯ se puede generar como D#m7
o Ebm7
. Se pueden encontrar más ejemplos en los casos de prueba al final.
Teoría y sugerencias
Notas musicales
La escala cromática tiene 12 tonos por octava. Cuando se ajusta a un temperamento igual, cada uno de estos tonos está igualmente distante de sus vecinos 1 . Los tonos que están separados por 12 semitonos (una octava) se consideran la misma nota musical. Esto significa que podemos tratar notas como números enteros módulo 12, de 0 a 11. Siete de ellos reciben nombres de letras 2 de A a G. Esto no es suficiente para nombrar los 12 tonos, pero al agregar correcciones accidentales que: agregar un ♯ ( sostenido) a una nota lo hace un semitono más alto, y agregar un ♭ (plano) lo hace un semitono más bajo.
Acordes
Un acorde son 2 o más notas tocadas juntas. El tipo de acorde depende de las relaciones entre las notas, que pueden determinarse por las distancias entre ellas. Un acorde tiene una nota raíz, como se mencionó anteriormente. Trataremos la nota raíz como 0 en estos ejemplos, pero esto es arbitrario, y todo lo que importa en este desafío es la distancia entre notas en módulo aritmético. Siempre habrá un tipo de acorde único para la respuesta, ya sea una tríada o un séptimo acorde . La nota raíz no siempre será el tono de frecuencia más baja; elija la nota raíz de modo que pueda describir el acorde como uno de los cuatro tipos de acordes siguientes:
- Una tríada importante es un acorde con las notas.
0 4 7
. - Una tríada menor es un acorde con las notas.
0 3 7
. - Un séptimo acorde dominante (o mayor / menor) tiene las notas
0 4 7 10
. - Un séptimo acorde menor (o menor / menor) tiene las notas
0 3 7 10
. 3
Afinación de guitarra
La afinación estándar en una guitarra de 6 cuerdas comienza con E en la cuerda más baja, y luego toca notas a intervalos de 5, 5, 5, 4, luego 5 semitonos subiendo las cuerdas. Tomando la E más baja como 0, esto significa que rasguear todas las cuerdas de la guitarra le da tonos numerados 0 5 10 15 19 24
, que es equivalente al módulo 12 0 5 10 3 7 0
, o las notas E A D G B E
.
Ejemplos trabajados
Si su entrada es 0 2 2 0 0 0
, esto corresponde a las notas E B E G B E
, por lo que solo E, B y G. Estas forman el acorde Em
, que se puede ver al numerarlas con la raíz como E, dándonos 0 3 7
. (El resultado sería el mismo para X 2 X 0 X 0
, o12 14 14 12 12 12
.)
Si su entrada es 4 4 6 4 6 4
, numerarlos con una raíz de C♯ da7 0 7 10 4 7
, o 0 4 7 10
, entonces la respuesta es C#7
(o Db7
). Si fuera así 4 4 6 4 5 4
, la numeración daría 7 0 7 10 3 7
, o 0 3 7 10
, que es C#m7
(o Dbm7
).
Casos de prueba
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 por los logaritmos de sus frecuencias
2 o, en solfeo , nombres como do, re, mi . En este desafío, usa los nombres de las letras.
3 Esto también podría llamarse un acorde de sexto mayor, con una elección diferente de nota raíz. En este desafío, llámalo por su séptimo nombre menor.
Respuestas:
MAT ,
115114 bytesEl formato de entrada es
[N 3 2 0 1 0]
, dondeN
indica una cadena no utilizada.La cadena de salida siempre usa
#
, nob
.Pruébalo en línea! O verifique todos los casos de prueba, en dos partes para evitar que el compilador en línea agote el tiempo de espera:
Explicación
fuente
Archivo .COM de MS-DOS (179 bytes)
El archivo (aquí mostrado como HEX):
La entrada se da a través de la línea de comando. ¡La entrada no válida conducirá a un comportamiento no válido del programa!
El código del ensamblador se ve así:
Ya vi a dos pianistas tocando juntos "cuatro manos" en un piano.
¡Este caso de prueba es la primera vez que leo sobre guitarristas haciendo esto!
¡Incluso con golpes con la mano derecha no puedes tocar un cable como este!
fuente
Rubí, 129 bytes
Como la versión anterior, pero utiliza un solo bucle, con operador ternario para secuenciar entre el paso de análisis y el paso de salida. Se requirieron algunas otras modificaciones menores para que esto funcione.
Rubí, 136 bytes
La función Llamda acepta una matriz de 6 números como argumento y se envía a stdout. La cadena no utilizada se representa con un valor falso (los únicos valores falsos en ruby son
nil
yfalse
.)Explicación
Utilizo una representación de los 12 tonos basados en el círculo de quintas . Esto significa que cada tono es seguido por el tono 7 semitonos más alto (o 5 semitonos más abajo) dando la secuencia
F C G D A E B F# C# G# D# A#
. Hay 2 ventajas para esto. Una es que todos los objetos punzantes aparecen juntos. La otra es que las notas de cuerda abierta del bajo de 5 cuerdas aparecen juntas: GDAEB (la guitarra está relacionada pero es un poco más compleja, ver más abajo).El primer ciclo se ejecuta 6 veces. La expresion
6--~j%5
(equivalentemente6-(j+1)%5
) da los valores de las notas de las cuerdas al aire:E=5 A=4 D=3 G=2 B=6 E=5
. A esto agregamos el número de traste multiplicado por 7 (como se puede ver arriba, agregando un semitono nos mueve 7 lugares hacia adelante en la secuencia). Luego tomamos todo el módulo 12 y hacemos un mapa de bits de las notas que están presentes (nosotros use4097<<note value
para dar 2 octavas consecutivas.)Una vez compuesto el mapa de bits, estamos listos para buscar el acorde y generarlo.
Nos interesan las siguientes notas:
Comenzando por verificar el acorde F, probamos para ver si la raíz y la quinta están presentes: bits 0 y 1 (contando desde el menos significativo: los bits 1 y 2). Para rechazar los acordes sextos, también debemos verificar que el sexto está ausente: bit 3 (bit de 8), así que lo comprobamos
r&&11==3
y, si es así, imprimimos el acorde.Ignoramos el tercio mayor y confiamos completamente en el bit 9 (tercio menor) y el bit 10 (séptimo menor) para resolver el tipo de acorde. La expresion
r>>9&3
se utiliza para elegir el tipo de acorde correcto de una matriz.Al final del ciclo, desplazamos el mapa de bits un bit
r/=2
hacia la derecha para probar las posibles raíces de acordes en secuencia:F C G D A E B F# C# G# D# A#
.Sin golf en el programa de prueba
fuente
Javascript (ES6),
335333 bytesMe encanta este desafío y PPCG SE! Este es mi primer campo de golf. Las sugerencias son bienvenidas, ya que estoy seguro de que podrían mejorar mucho. (eliminó 2 bytes ya que había incluido f = en el recuento)
La función
f
toma una serie de cadenas, que representan números y 'X', me gustaf(['X','3','2','0','1','0'])
y devuelve un acorde (natural o nítido) comoE#m7
. Nuevas líneas agregadas para mayor claridad (no incluidas en el recuento de bytes)Ejemplo de uso:
Para ejecutar casos de prueba:
Versión sin golf con explicación:
fuente