Ausgabe "Mozart - Alla Turca" auf stdout (siehe Beispiel für "Referenzimplementierung")
Versuchen Sie herauszufinden, wie Sie sowohl den Synthesizer als auch die Musik in minimale Größe packen können.
Bedarf:
- Format, das zum Einspeisen geeignet ist
aplay -f cd
(signierter 16-Bit-Little-Endian, 2 Kanäle); - Es sollte die gesamte Musik abgespielt werden (keine übersprungenen Noten oder Teile, zumindest nicht weniger als im Beispielprogramm), Polyphonie ist jedoch nicht erforderlich.
- Kann nicht nur nennen
/usr/bin/timidity
,/usr/bin/sox
oder so ähnlich (zB erfordert ein spezielles Musik - Modul zu installieren); - Ich kann nicht auf das Netzwerk zugreifen oder davon ausgehen, dass die Musik lokal verfügbar ist.
"Referenzimplementierung" mit Analyseergebnis: https://gist.github.com/vi/5478693
(altes Perl-Beispielprogramm: https://gist.github.com/vi/5447962 )
Antworten:
Mehrstimmig,
282631774719Audioausgabe: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg
Eigenschaften:
von der rechten Hand . Ich könnte natürlich auch die linke Hand hinzufügen(Habe das gemacht).wie Sie auf einem echten Klavier bekommenEigentlich eher ... hey, dieses Stück soll türkische Janitscharenbands imitieren , oder?Hier ist eine teilweise ungolfed und kommentierte Version: https://gist.github.com/leftaroundabout/5517198 .
quelle
Python, 331 + 286 = 617 (0,548 Bytes pro Note)
Meine Lösung verwendet eine Datendatei und ein Python-Skript. Die Datendatei sollte als Eingabe für das Skript verwendet werden. Ich habe kein Spiel, aber es funktioniert, wenn ich es als Rohdaten in Audacity mit signiertem 16-Bit-PCM, Little-Endian und 2 Kanälen importiere .
Die Datendatei hat 331 Bytes. Hier ist ein Python-Skript, das es ausgibt:
Hier ist das Python-Skript:
Hinweis: Wenn Sie Windows verwenden, verwenden Sie die
-u
Option für beide Skripts, da stdin und stdout mit Binärdaten arbeiten.quelle
os.read/write
anstelle vonsys.stdin/stdout
.GolfScript (129 + 369 = 498 Byte)
Sowohl das Programm als auch die Datendatei enthalten nicht druckbare Zeichen, daher gebe ich Base64- und xxd-Darstellungen.
Programm (129 Bytes):
Daten (369 Bytes):
Erläuterung
Ich habe die (aktualisierte) gelieferte Partitur (dazu später mehr) in eine einzelne Zeichenfolge mit Bytes mit Werten von 0 bis 24 zerlegt. Die Notenlängen stehen an erster Stelle. dann werden die notenwerte mod 25 dargestellt und differenzcodiert. Der Grund für die Differenzcodierung ist, dass Passagen, die sich in der Transposition wiederholen, auf dieselbe Sequenz reduziert und komprimiert werden können.
Ich habe dann ein Komprimierungsprogramm von String zu GolfScript durchlaufen, das ich bereits erwähnt habe (und das ich verbessert habe, um in diesem Golf wettbewerbsfähig zu sein), um die Datendatei zu erhalten, die im ersten Teil des Programms dekomprimiert wird:
Es ist eine einfache Grammatikerweiterung eines Typs, der jedem vertraut ist, der sich mit vielen Fragen befasst, die mit der Kolmogorov-Komplexität verknüpft sind .
Ich teile diese Zeichenfolge dann in Paare auf
[length note]
und durchlaufe die Paare. Die nicht druckbaren Zeichen stammen aus einer magischen Zeichenfolge, die Frequenzparameter für die Noten enthält: Ich verwende den impliziten Kürzungsmodus 256 für Ganzzahl-Arrays von GolfScript, die in Zeichenfolgen konvertiert werden, um eine Dreieckwelle * zu erzeugen. Die Grundfrequenz beträgt also 22050/256 Hz. Ich habe ein Programm geschrieben, um ganzzahlige Verhältnisse zu finden, die eine gute Abstimmung ergeben. Die magische Kette enthält Zähler, und der Nenner 17 ist für alle Noten gleich. Der durchschnittliche Stimmfehler liegt bei 3,4 Cent.Die Notenlängen werden wie sie sind dargestellt und sind viel plausibler als die vorherige Version der Partitur. Wie ich vermutet habe, hat die Rundung die Redundanz in der Zeichenfolge erhöht und die komprimierte Datendatei um 30 Byte verkürzt, ganz zu schweigen vom Speichern des Lookup-Arrays. Es gibt jedoch noch einige Passagen, die ich verdächtig finde:
oder
Geben Sie Stäbe, die ein Sechstel einer Häkelarbeit länger sind als die übrigen Stäbe in der Partitur, und
oder
sind eine ganzzahlige Anzahl von Balken, aber mit einigen zweifelhaften Offsets.
Das Programm könnte etwas kürzer sein. Ich habe mich bewusst dafür entschieden, die Ausführungszeit in Kürze zu tauschen. Mit einigen Geschwindigkeitsverbesserungen des GolfScript-Interpreters, den ich Darren Smith vorgelegt habe und den er meines Erachtens irgendwann veröffentlichen wird, läuft die aktuelle Version in weniger als 15 Minuten auf meinem Computer. Wenn ich nicht
puts
jede Note nach dem Erzeugen habe, läuft sie viel langsamer.* Ich gestehe hiermit, dass mein Kommentar zu jedem, der Rechteckwellen verwendet, falsch war.
quelle
base64 -d <<< 'MjU2Y.....9Lw==' |
golfscript aus und es heißtgolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
(das gleiche, wenn ich das Programm in einer Datei speichere, natürlich)㔲戶獡㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/
),undefined method
erhalte ich class_id 'for nil: NilClass`x86-Maschinencode - 513 Bytes
Dies ist der Herausforderung nicht ganz gewachsen, da die Ausgabe nicht in einem Format erfolgt, das für das Einspeisen in ein Spiel geeignet ist, sondern das MIDI-Format.
Ausführbare .COM-Datei und ASM-Quellcode - Der Start der Musik kann bis zu 14 Sekunden dauern. Es wird auch etwas langsam abgespielt, da die Timerauflösung 1/18 Sekunde beträgt.
Die Musik wird in 375 Bytes unter Verwendung der Fibonacci-Codierung und eines Wörterbuchs codiert, das aus der zuvor decodierten Musik besteht.
Pseudocode-Decodierungsalgorithmus:
Sobald die Musik dekodiert ist, ist es einfach, sie an den Midi-Port auszugeben.
quelle