Benutzerquartate haben diese Herausforderung veröffentlicht , aber er hat die Tatsache vernachlässigt, dass er aus irgendeinem Grund keine MIDI-Dateien auf seinem Computer abspielen kann.
Lassen Sie uns ihm helfen, indem wir ein vollständiges Programm schreiben, das einen Song im RTTTL-Format von der Standardeingabe liest, den Songnamen in die Standardausgabe druckt und ihn abspielt (mit der richtigen Geschwindigkeit und Tonhöhe).
Format Details
RTTTL ist ein ziemlich dummes und nicht spezifiziertes Klingeltonformat. Es besteht aus einem Namen, einigen Standardwerten und einer Reihe von Notizen (jeweils nur eine Notiz) in einem einfachen Textformat.
Beispiel: fifth: d=4,o=5,b=63: 8P, 8G5, 8G5, 8G5, 2D#5
Der Name ist eine Zeichenfolge, die durch einen Doppelpunkt abgeschlossen wird. Hier ist der Name "fünfter". Ihr Programm muss Namen mit mindestens 15 Zeichen akzeptieren.
Als nächstes listet der Standardabschnitt (ebenfalls durch einen Doppelpunkt abgeschlossen) einige Standardwerte für Dauer (d), Oktave (o) und die Beats pro Minute (b) für den Song auf. Sie sind durch Kommas getrennt und verwenden die Syntax "key = value". Um jeden Teil "Schlüssel = Wert" kann eine beliebige Anzahl von Leerzeichen vorhanden sein. Sie können davon ausgehen, dass alle Standardwerte d, o und b in dieser Reihenfolge vorhanden sind. Die Dauer und Oktave werden unten erklärt; Die BPM bezieht sich auf die Anzahl der Beats (entsprechend den Viertelnoten), die in einer Minute gespielt werden sollen, und Sie müssen einen ganzzahligen Wert zwischen 20 und 900 (einschließlich) unterstützen.
Dann wird das eigentliche Lied als durch Kommas getrennte Reihe von Noten unter Verwendung einer "DPO" -Syntax aufgelistet, wobei D die Dauer, P die Tonhöhe (Note) und O die Oktave ist. Es kann eine beliebige Anzahl von Leerzeichen und Zeilenumbrüchen um jeden "DPO" -Teil geben.
Die Dauer ist eine Potenz von 2 zwischen 1 und 32 (einschließlich), was einen Bruchteil einer ganzen Note darstellt. So ist beispielsweise ein Wert von 4 (Viertelnote) doppelt so lang wie ein Wert von 8 (Achtelnote). Die Dauer kann fehlen. In diesem Fall wird die Standarddauer verwendet. Die Dauer kann auch durch das Vorhandensein eines Punktes ( .
) geändert werden. Insbesondere der Punkt verlängert die Lebensdauer der Note um 50%. Da sich nicht alle darüber einig sind, wo der Punkt sein soll, müssen Sie einen Punkt nach der Tonhöhe oder nach der Oktave akzeptieren (dh sowohl "DP.O" als auch "DPO" sollten funktionieren).
Die Tonhöhe ist eine von A, B, C, D, E, F, G, A #, C #, D #, F #, G #, P, wobei AG # die Standard-Noten sind (Anmerkung: keine Flats, verwenden Sie die entsprechende scharfe Note) und P ist eine Pause. Die Tonhöhe ist der einzige Teil der Note, der erforderlich ist, und unterscheidet nicht zwischen Groß- und Kleinschreibung.
Und schließlich ist die Oktave eine Zahl von normalerweise 4 bis 8, aber Sie müssen jede Zahl von 1 bis einschließlich 8 unterstützen. Zum Beispiel ist C4 das mittlere Standard-C mit einer Frequenz von ungefähr 261,63 Hz. Die Oktave kann fehlen. In diesem Fall wird die Standardoktave verwendet. Sie können davon ausgehen, dass für Pausen keine Oktave angegeben ist (da diese keine Bedeutung hat).
Wie in der anderen Herausforderung erwähnt, können Sie diese Site verwenden , um RTTTL-Songs zum Testen in das MIDI-Format zu konvertieren (beachten Sie jedoch, dass sie möglicherweise nicht genau der gleichen Spezifikation entsprechen).
Bedarf:
Ihr Programm muss jede Note mit der richtigen Geschwindigkeit und Tonhöhe spielen. Es kann jede Art von Klang verwenden (Sinus / Dreieck / Rechteckwelle, Klaviersound, Glockenton, was auch immer; es kann auch ein Standardton, ein Wellenton oder ein MIDI-Sound usw. sein), solange er hörbar ist und die Tonhöhe erkennbar ist.
Jede Note muss für die angegebene Dauer oder nicht mehr als eine 64. Note, die kürzer ist, ununterbrochen gespielt werden, es sei denn, Sie verwenden so etwas wie eine ADSR-Hüllkurve . In diesem Fall kann die Release-Phase bis zur nächsten Pause oder über die nächste Note fortgesetzt werden .
Wenn zwei aufeinanderfolgende Noten dieselbe Tonhöhe haben, müssen sie entweder durch eine kurze Pause (wobei nicht mehr als die Länge einer 64. Note als Teil der Dauer der ersten Note verwendet wird) oder durch einen ungleichmäßigen Klang (z wie die oben erwähnte ADSR-Hüllkurve) oder zumindest durch einen Phasenwechsel, wenn es klar genug ist. Zwei aufeinanderfolgende Pausen sollten wie eine einzelne Pause mit der Gesamtdauer behandelt werden.
Das Programm muss unter Linux mit frei verfügbarer Software ausgeführt werden können. Es sollte den Song von der Standardeingabe lesen und den Songnamen auf die Standardausgabe drucken.
Wenn die Eingabe nicht mit der obigen Spezifikation übereinstimmt, ist das Verhalten nicht angegeben. Ihr Programm kann Fehler ignorieren oder eine Nachricht drucken oder etwas falsch abspielen, hängen bleiben oder abstürzen. Es sollte einfach keinen Schaden anrichten.
Standardlücken sind nicht erlaubt.
Wertung
Code Golf, kürzestes Programm (gemessen in UTF-8 Bytes) gewinnt.
Antworten:
Java, 813
Ich arbeite noch daran.
Es ist ein bisschen empfindlich gegenüber CPU-Geschwindigkeit und Geschäftigkeit beim Starten.
quelle
C ++, 15186 Bytes
Unten befindet sich ein Link, über den Sie ein Sample hören können
Ich präsentiere eine der am wenigsten praktischen Möglichkeiten, um Musik auf Ihrem Linux-Computer abzuspielen:
Ich kann leider nicht sowohl den Golf- als auch den Nicht-Golf-Code (Platzbeschränkungen) einschließen, und der Code könnte weiter gespielt werden.
Ein großer Teil des Grundes, warum die Datei so lang ist, besteht darin, dass jede Tonhöhe (12 Noten * 5 Oktaven) einzeln mit Sinuswellen erstellt werden muss.
Kompilieren Ich habe mit der Eingabeaufforderung dev cmd für Visual Studio kompiliert, aber es ist sehr ähnlich mit g ++ unter Linux.
Sie müssen die Dinge nur richtig verknüpfen.
Dank an SFML und diesen Beitrag für die Idee.
Ich denke, die Timings sind korrekt. Lassen Sie mich wissen, wenn dies nicht der Fall ist.
Hör mal zu
Hier (Link zu DropBox) ist eine Bildschirmaufnahme davon, in der eine schnelle Wiedergabe des Morrowind-Themas abgespielt wird, das ich erstellt habe. Beachten Sie, dass im Video keine Eingabe erforderlich ist, da die Datei bereits vorhanden ist.
quelle