The Camelot Wheel
Given a musical key, output its number and letter on the Camelot Wheel (shown below).
Input
A musical key as a string, as shown on the wheel. The words "Sharp" and "Flat" may be replaced with symbols (such as "#" and "b") if you wish.
Output
The number and letter, either as a string, tuple, or array.
Examples:
Input->Output
"E Major" -> "12B"
"F-Sharp Minor" -> "11A"
"Bb Minor" -> "3A"
This is code-golf.
2 answers
APL (Dyalog Unicode), 110 67 bytes
{(⍕((f⊖⍪'AEBFCGDAEBFD'),r⌽12↑¯6↑5⍴'-')⍳2↑⍵),⎕a⌷⍨1+0≠f←¯3+r←3×'i'∊⍵}
-43 bytes from dzaima.
Requires input exactly as shown in the diagram.
A bit fiddly with the compression, but works correctly.
In both circles, the notes come in the form AEBFCGDAEBFD
, so it is rotated as per the level it identifies with.
The hyphens in each note's description also come in the same format(-----
), so that is rotated as per requirement as well.
Based on the above data, we can find the number of the note.
If it's a Major note, then we append a B
. Otherwise A
.
Python 3, 101, 98, 94 bytes
First answer!
lambda s:f"{(('FCGDAEB'.index(s[0])-~-ord(s[5])*('-'in s)-3*('i'in s)-6)%12)+1}"+'BA'['i'in s]
Readable version:
def f(s):
n="FCGDAEB".index(s[0])-6
if '-' in s:
n -= ord(s[5]-1)
if 'i' in s:
n -= 3
return f"{(n%12)+1}"+'BA'['i'in s]
Python 3.9, 95, 91 bytes:
lambda s:f"{(('FCGDAEB'.index(s[0])-~-ord(s[5])*('-'in s)-3*(m:='i'in s)-6)%12)+1}"+'BA'[m]
Isn't the walrus operator great?
1 comment thread