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
You are accessing this answer with a direct link, so it's being shown above all other answers regardless of its score. You can return to the normal view.
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