Aggiornamento musicale rapido:
La tastiera del piano è composta da 88 note. Su ciascuna ottava, ci sono 12 note C, C♯/D♭, D, D♯/E♭, E, F, F♯/G♭, G, G♯/A♭, A, A♯/B♭
e B
. Ogni volta che colpisci una "C", il pattern si ripete di un'ottava più in alto.
Una nota è identificata in modo univoco da 1) la lettera, inclusi eventuali oggetti taglienti o piatti, e 2) l'ottava, che è un numero compreso tra 0 e 8. Le prime tre note della tastiera sono A0, A♯/B♭
e B0
. Dopo questo arriva la scala cromatica completa sull'ottava 1. C1, C♯1/D♭1, D1, D♯1/E♭1, E1, F1, F♯1/G♭1, G1, G♯1/A♭1, A1, A♯1/B♭1
e B1
. Dopo questo arriva una scala cromatica completa sulle ottave 2, 3, 4, 5, 6 e 7. Quindi, l'ultima nota è a C8
.
Ogni nota corrisponde a una frequenza nell'intervallo 20-4100 Hz. Con A0
partendo esattamente 27.500 hertz, ogni nota corrispondente è precedenti volte nota dodicesimo radice di due, o approssimativamente 1,059,463 mila. Una formula più generale è:
dove n è il numero della nota, con A0 pari a 1. (Ulteriori informazioni qui )
La sfida
Scrivi un programma o una funzione che accetta una stringa che rappresenta una nota e stampa o restituisce la frequenza di quella nota. Useremo un cancelletto #
per il simbolo appuntito (o un hashtag per voi giovani) e un minuscolo b
per il simbolo piatto. Tutti gli input appariranno (uppercase letter) + (optional sharp or flat) + (number)
senza spazi bianchi. Se l'input è al di fuori dell'intervallo della tastiera (inferiore a A0 o superiore a C8) o se sono presenti caratteri non validi, mancanti o extra, si tratta di un input non valido e non è necessario gestirlo. Puoi anche presumere che non otterrai input strani come E # o Cb.
Precisione
Dal momento che la precisione infinita non è davvero possibile, diremo che qualsiasi cosa all'interno di un centesimo del valore reale è accettabile. Senza entrare nei dettagli in eccesso, un centesimo è la 1200a radice di due, ovvero 1.0005777895. Facciamo un esempio concreto per renderlo più chiaro. Supponiamo che il tuo input sia stato A4. Il valore esatto di questa nota è 440 Hz. Una volta che cent piatto è 440 / 1.0005777895 = 439.7459
. Una volta 440 * 1.0005777895 = 440.2542
che il segno di spunta è quindi, qualsiasi numero maggiore di 439.7459 ma inferiore a 440.2542 è abbastanza preciso da contare.
Casi test
A0 --> 27.500
C4 --> 261.626
F#3 --> 184.997
Bb6 --> 1864.66
A#6 --> 1864.66
A4 --> 440
D9 --> Too high, invalid input.
G0 --> Too low, invalid input.
Fb5 --> Invalid input.
E --> Missing octave, invalid input
b2 --> Lowercase, invalid input
H#4 --> H is not a real note, invalid input.
Tieni presente che non è necessario gestire input non validi. Se il tuo programma finge che siano input reali e stampa un valore, questo è accettabile. Se il programma si arresta in modo anomalo, anche questo è accettabile. Tutto può succedere quando ne ottieni uno. Per l'elenco completo di ingressi e uscite, vedere questa pagina
Come al solito, si tratta di code-golf, quindi si applicano scappatoie standard e vince la risposta più breve in byte.
H
? H
significa che B è AFAIK utilizzato solo nei paesi di lingua tedesca. (dove B
significa comunque Bb.) Ciò che gli inglesi e gli irlandesi chiamano B si chiama Si o Ti in Spagna e in Italia, come in Do Re Mi Fa Sol La Si.
H
è utilizzato in Germania, Repubblica Ceca, Slovacchia, Polonia, Ungheria, Serbia, Danimarca, Norvegia, Finlandia, Estonia e Austria, secondo Wikipedia . (Posso anche confermarlo per la Finlandia.)