Heute, am 11. November 2015, ist Veterans Day in den Vereinigten Staaten. " Taps " ist das Signalhorn, das bei US-Militärbestattungen gespielt wird:
( "Taps" auf SoundCloud von vtmiller )
Es ist eine einfache Melodie, die nur vierundzwanzig Noten lang ist und nur vier verschiedene Noten verwendet. Hier ist das Notenblatt:
( Quelle )
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die "Taps" abspielt oder eine Audiodatei von "Taps" in einem beliebigen gängigen Audiodateiformat (z. B. MP3, WAV, MIDI) ausgibt. Es kann in jeder Tonart gespielt werden, mit jeder Art von Instrument oder Piepton, die für Ihre Sprache verfügbar sind. Zum Beispiel klingt es wie ein Klavier anstelle eines Signalhorns. (Es sollte jedoch immer nur ein Instrumententyp verwendet werden.)
Alle vierundzwanzig Noten müssen mit genauer Tonhöhe, Dauer und Abstand gespielt werden. Jemand, der mit "Taps" vertraut ist, sollte in der Lage sein, Ihren Code auszuführen und das gespielte Lied leicht zu erkennen.
Die Dauer der Melodie (vom Anfang der ersten bis zum Ende der letzten Note) muss zwischen 30 und 70 Sekunden liegen. Optional können Sie den Anfang und / oder das Ende Ihrer Audiodatei mit einer Pause von bis zu 5 Sekunden füllen, sodass eine 80-Sekunden-Datei die längste zulässige Zeit ist.
Natürlich können Sie den Song nicht einfach irgendwo online herunterladen oder aus einer Audiobibliothek extrahieren, die ihn zufällig als Sample enthält. Sie können jedoch Audiobibliotheken verwenden, mit denen Sie einzelne Noten abspielen / komponieren und Audiodateien erstellen können.
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes. Für diese besondere Herausforderung empfehle ich Ihnen jedoch, sich nicht auf Ihre Byteanzahl zu konzentrieren, insbesondere auf Kosten der Klangqualität. Spielen Sie mit Ihren Einsendungen, aber lassen Sie sich bei der Wahl Ihres Instruments oder der Klangausgabemethode kreativ ein. Bei dieser Herausforderung geht es darum, Veteranen zu ehren, und nicht darum, eine kaum wiedererkennbare Version von "Taps" herauszuholen.
Beachten Sie, dass Sie SoundCloud- Audiodateien direkt in Posts einbetten können, indem Sie den Link einfach in eine leere Zeile einfügen. Wenn Sie einen SoundCloud-Account haben, ist dies eine großartige Möglichkeit, Ihre Ausgabe zu teilen.
quelle
Antworten:
qb64,
10084 bytesAktualisierte Version des alten Qbasic, herunterladbar unter http://www.qb64.net/
Count schließt die Leerzeichen aus, die nicht erforderlich sind und nur dazu dienen, die Daten der Übersichtlichkeit halber in Dreiteilungen aufzuteilen.
Befehle in der Abspielzeichenfolge
Golfgeschichte:
Erster Beitrag: 4/4-mal bis 4/2-mal, dh ich habe ganze Noten, aber keine Sechzehntelnoten.
Edit 1: Schlüssel geändert von C (Bereich GG) zu F (Bereich CC). Jetzt muss ich nur noch einmal eine Oktave wechseln, für das hohe C, das nur einmal vorkommt, und nicht mehr wie bisher für alle niedrigen Gs.
Nachdem ich all diese Oktavenwechsel beseitigt habe, glaube ich nicht, dass es mehr zum Golfen gibt. Es gibt insgesamt 20er Jahre
L
, aber es gibt keinen offensichtlichen Weg, sie zu vermeiden.Der letzte Satz (11 Zeichen) ist derselbe wie der erste, aber es gibt keine Möglichkeit, ihn zweimal in weniger als 11 Zeichen einzufügen. Die wiederholten Daten wären nur 9 Zeichen, wenn die Initiale weggelassen würde
L4
.quelle
JavaScript,
203198196195 Bytes5 Bytes dank Dendrobium und 1 dank @PatrickRoberts eingespart.
Erläuterung
Teste es hier im Browser! Funktioniert mit jedem Browser, der die HTML5-Web-Audio-API unterstützt .
quelle
Mathematica,
361287285 BytesIch habe mich hier um Genauigkeit bemüht. Die Ausgabe erfolgt genau wie in der Partitur beschrieben, mit der Trompete gespielt. Die Datei finden Sie hier .
Vielen Dank an @ MartinBüttner für die Golfvorschläge.
quelle
%1
,%2
und%%
speichere eigentlich keine Bytes überx="E5"
->x
(in der Tat, wenn man sieht, wie oft man sie benutzt, sollte man durch die Verwendung von Variablen ziemlich viel sparen). Dann können Sie Tonnen von Bytes sparen,EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}
indem Sie die am häufigsten verwendete Notiz verwenden und in speichern%
. Und bei 24 Noten könnte es noch kürzer sein, eine flache Liste zu partitionieren:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Sonic Pi, 899 Bytes
Das Timing ist ein wenig verschoben, aber ich denke, es ist in Ordnung.
Leicht golfen:
quelle
MATLAB,
338327262258230 Bytesquelle
SmileBASIC, 73 Bytes
Alle Notizen und Timings sind korrekt. Ich habe eine Trompete benutzt, weil sie MIDI am nächsten kommt
quelle
Powershell,
183175159 BytesNostalgie-Trip, wer mag keine Pieptöne ?!
Erklärung (sortof)
Dies wird in ca. 45 Sekunden abgespielt.
Ich benutze Windows Powershell zum ersten Mal. Tipps zum Golfen sind willkommen.
alte Versionen
175183quelle
BBC Basic, 111
Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html herunter
Punktzahl schließt Leerzeichen und Zeilenumbrüche aus, die für die Lesbarkeit nicht unbedingt erforderlich sind
Ziemlich normale Komprimierung, 1 ASCII-Zeichen pro Note. Parameter von
SOUND
sind wie folgt:Die Reichweite des Songs beträgt 13 Noten, obwohl nur 4 verwendet werden. Um diesen Bereich in den 95-Zahlen-Bereich von druckbarem ASCII zu bringen, musste ich die Dauer in einen ganzzahligen Bereich von 7 drücken und modulo 7 nehmen. Die folgenden Dauern (in Sechzehnteln) werden verwendet (mit Ausnahme von 6, die niemals sind) gebraucht): 1,2,3,4,6,8,12. Um diese Zahlen zu erhalten, bin ich auf die Idee gekommen, 12 durch eine Potenz von
sqrt(2)
(angenähert durch 1,4) zu teilen und abzuschneiden.Das
SOUND1,0,1,1
ist ärgerlich und kostet 12 Bytes. Zwischen Noten gleicher Tonhöhe muss eine Pause eingelegt werden.quelle
Ruby + Piepton, 178 Bytes
Ich habe eine Weile gebraucht, um das zu machen, ich glaube, ich habe das Boot verpasst, aber was auch immer.
f
hält die vier verwendeten Frequenzen.n
Enthält die fünf verwendeten Notenlängen in Vielfachen von 16.a="00101...
Enthält alle Tonhöhen, gefolgt von allen Notenlängen, als Indexe in die jeweiligen Arrays.l
wird dann auf den 24. Index und weiter von gesetzta
. Dann wird ein Signaltonbefehl erstellt, indem alle oben genannten Schritte wiederholt und ausgeführt werdenquelle
C - (Roh: 318 | WAV: 437)
8-Bit-Mono-PCM (ohne Vorzeichen) bei 44800 Hz, 33,60 Sekunden.
Die Mezzoforte-, Fortissimo- und Fortedynamik sind etwas künstlerisch umgesetzt. Die Fermaten könnten besser sein.
Code basiert auf
unsigned long long
8 Oktetten und System Little Endian.Kompiliere und starte mit etwas wie:
In
-DRAW
zu Kompilierung-line für rohe Variante.Raw Output kann zB mit SoX abgespielt werden
play
als:quelle