Aufgabe
Schreiben Sie ein Programm, um die Note einer Saite zu bestimmen, die auf eine bestimmte Frequenz gestimmt und an einem bestimmten Punkt gedrückt wurde.
Nehmen Sie der Einfachheit halber an, dass die Frequenz des erzeugten Klangs und die Länge der Saite rechts von der Stelle, an der sie gedrückt wird, umgekehrt proportional sind.
Hinweis: Diese Aufgabe befasst sich ausschließlich mit dem Grundton und nicht mit Obertönen / anderen Harmonischen.
Eingang
Ihr Programm erhält zwei Daten:
Eine Zeichenfolge beliebiger Länge, die die betreffende Zeichenfolge darstellt. Diese Zeichenfolge wird mit einem X markiert, an dem die Zeichenfolge gedrückt werden soll.
[-----] is a string divided in six sections (five divisions). [--X--] is a string pressed at the exact center of the string. [X----] is a string pressed at 1/6 the length of the string. (Length used is 5/6) [-X--] is a string pressed at 2/5 of the length of the string. (Length used is 3/5)
Angenommen, die Note ertönt mit dem Teil der Saite rechts von
X
.- Eine Zahl (nicht unbedingt eine Ganzzahl), die die Frequenz angibt, mit der die Zeichenfolge gestimmt wird. Die Genauigkeit dieser Zahl beträgt höchstens vier Nachkommastellen.
Es kann angenommen werden, dass die durchgelassenen Frequenzen zwischen 10 Hz
und liegen 40000 Hz
.
Die Eingabe kann in einem Format Ihrer Wahl übergeben werden. Bitte geben Sie in Ihrer Antwort an, wie Eingaben in Ihr Programm akzeptiert werden.
Ausgabe
Ihr Programm muss sowohl die nächste Note * im Zwölfton-Stimmsystem für gleiches Temperament als auch die Anzahl der Cent von der nächsten Note entfernt ausgeben, die der durch die Saite angegebene Klang sein würde (auf den nächsten Cent gerundet).
+n
Cent sollte verwendet werden, um n
Cent scharf / über der Note und -n
Cent für flach / unter der Note zu bezeichnen.
Die Note sollte in wissenschaftlicher Tonhöhennotation ausgegeben werden. Angenommen, A4 ist auf abgestimmt 440Hz
. Verwenden Sie b und # für flache / scharfe Noten. Hinweis: Es kann entweder scharf oder flach verwendet werden. Für die Note bei 466.16Hz
kann entweder A#
oder Bb
für die Note ausgegeben werden.
Das Format der Ausgabe liegt bei Ihnen, solange die Ausgabe nur die beiden zuvor angegebenen Informationen enthält (dh das Drucken jeder einzelnen möglichen Ausgabe ist nicht zulässig).
* Die nächste Note bezieht sich auf die Note, die dem durch die Eingabe angegebenen Ton am nächsten kommt, gemessen in Cent (daher die Note, die sich innerhalb 50 cents
des Tons befindet). Wenn der Ton 50 cents
von zwei verschiedenen Noten entfernt ist (nach dem Runden), kann eine der beiden Noten ausgegeben werden.
Beispiele
Ihr Programm sollte für alle Fälle funktionieren, nicht nur für die folgenden Beispiele.
Output Input Frequency Input String
A4, +0 cents 220 [-----X-----]
A5, +0 cents 220 [--------X--]
D5, -2 cents 440 [--X--------]
B4, -49 cents 440 [X----------]
A#4, +19 cents* 314.1592 [X-]
Eb9, +8 cents* 400 [-----------------------X]
Eb11,+8 cents* 100 [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]
D#1, +49 cents* 10 [--X]
A0, -11 cents 11.7103 [---X--]
* Es könnte entweder scharf oder flach ausgegeben worden sein.
Potenziell hilfreiche Links
- Notizen und Frequenzen
- Wikipedia-Seite zur wissenschaftlichen Tonhöhennotation
- Wikipedia-Seite über Cent
Dies ist Code-Golf, so dass die kürzeste Antwort gewinnt.
[-X--]
, die Zeichenfolge wird an 4 Stellen (und daher in 5 Teile) geteilt und an der zweiten dieser Unterteilungen gedrückt. Somit wird auf gedrückt 2/5
und die verwendete Länge ist 3/5
.
-
repräsentiert jeder im Grunde die Position der Abteilungen, danke für die Erklärung!
[--X--]
die Zeichenfolge in der Mitte der Abteilung gedrückt, in der diex
platziert ist, während die letzte[-X--]
bei 3/8 (nicht 2/5) liegen würde, wenn Sie dieser Logik folgen. Oder verstehe ich etwas falsch?