Dies ist die wöchentliche Herausforderung Nr. 1. Thema: Audioverarbeitung
Ihre Aufgabe ist es, ein Programm zu schreiben, das eine Audiodatei auf eine Disc schreibt (in einem Format Ihrer Wahl), die den Morse-Code für enthält 2015
, d. H
..--- ----- .---- .....
Sie können eine beliebige Art von Klang für die Segmente auswählen, z. B. eine Sinuswelle mit einer Frequenz, einen Akkord, Rauschen oder ein Instrument (z. B. mithilfe von MIDI-Dateien), sofern dies hörbar ist. Es gibt jedoch einige Einschränkungen für das Timing:
- Kurze Segmente müssen mindestens 0,2 Sekunden lang sein.
- Lange Segmente müssen mindestens dreimal so lang sein wie kurze Segmente.
- Unterbrechungen zwischen Segmenten innerhalb einer Ziffer sollten genauso lang sein wie kurze Segmente.
- Pausen zwischen den Ziffern sollten genauso lang sein wie lange Segmente.
- Jedes Segment und jeder Bruch kann bis zu 10% von der durchschnittlichen Länge dieses Segments / Bruches abweichen.
- Die gesamte Audiodatei darf nicht länger als 30 Sekunden sein.
Die Pausen müssen nicht ganz leise sein, aber die Morse-Segmente sollten hörbar lauter sein als die Pausen.
Beachten Sie, dass Sie haben eine Audiodatei zu schreiben. Sie können den Ton nicht einfach abspielen, z. B. mit Systemtönen. Sie können jede Art von Bibliothek verwenden, um das Dateiformat und die Audiogenerierung zu verwalten. Sie dürfen jedoch keine integrierten Funktionen für die Morsekodierung verwenden.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Überlegen Sie sich, ob Sie einen Link zu einem Upload der resultierenden Audiodatei (in SoundCloud oder ähnlichem) erstellen möchten, damit die Benutzer das Ergebnis überprüfen können, ohne Ihren Code ausführen zu müssen. Wenn Sie auf SoundCloud hochladen, müssen Sie das Herunterladen auf der Registerkarte "Berechtigungen" des Tracks aktivieren.
Wenn Ihre Ausgabe ein eher ungewöhnliches Dateiformat verwendet, fügen Sie einige Informationen zum Wiedergeben und / oder Konvertieren in ein gängigeres Format hinzu und laden Sie es hoch.
Beispielstrecke
Dies ist eine manuell erzeugte Beispielspur, die der Spezifikation entspricht und für die Morse-Segmente Rauschen verwendet (genauer gesagt Mikrofon-Hintergrundrauschen). Hier ist ein Link zu SoundCloud, falls der eingebettete Player für Sie nicht funktioniert.
Kopfgeld-Details
Ich werde die Prämie für die kürzeste Einsendung in einer Audio-Programmiersprache vergeben , dh einer Sprache, die zur Synthese von Ton entwickelt wurde. Diese Liste ist nicht vollständig. Sie können daher auch eine andere Audio-Programmiersprache verwenden, sofern Sie eine kennen. Wenn Sie nicht sicher sind, ob eine Sprache, die Sie verwenden möchten, als Audio-Programmiersprache klassifiziert ist, lassen Sie es mich bitte in den Kommentaren oder im Chat wissen , und wir können darüber diskutieren.
Beachten Sie, dass Ihre Einreichung immer noch allen Regeln entsprechen muss - insbesondere muss sie eine Datei schreiben, die möglicherweise nicht in allen Audio-Programmiersprachen möglich ist. Zum Beispiel kann gibber , soweit ich das beurteilen kann, den Sound nur abspielen und nicht in einer Datei speichern.
Antworten:
AWKBASH:66866774 BytesWie von Martin Büttner gewünscht, habe ich ein Tempo hinzugefügt, da es nach Überprüfung des ABC-Notationsstandards keinen definierten Standardwert dafür zu geben scheint (danke nutki, dass Sie darauf hingewiesen haben).
Ich schreibe auch in eine Disk-Datei (a) anstelle von STDOUT, da die Frage explizit "eine Datei auf Disk" wollte.
Ich habe ein Tempo von 99 eingestellt, wodurch die Audiodatei 22 Sekunden hält. Es ist langsamer als meine Vorgängerversion, aber jetzt sollte es auf jedem ABC-Spieler die gleiche Länge haben und unter 30 Sekunden passen.
Es sieht ... sehr nach der vorherigen Version aus, wie Sie sehen können:
Hier ist die neue Midi-Datei .
Erste BASH-Version (Tempo fehlt)
Warum habe ich nicht zuerst daran gedacht ...: o)
Das sind 22 Bytes weniger als bei AWK, bei gleichem Ergebnis
Wie die Vorgängerversion in AWK schreibt es auf stdout eine gültige "ABC" -Notationsdatei (danke Tobia, dass sie herausgefunden hat, dass die "L" -Anweisung optional war)
Es sieht aus wie das:
Und es klingt genauso wie in der Vorgängerversion .
Vorherige Version in AWK (86 Bytes)
Hier ist eine neue Version; etwas länger, aber mit genauerem Timing. Ich lasse die erste Version unten zum Vergleich / Referenz:
Dies ist immer noch eine gültige "abc" -Datei, die so aussieht:
Hier ist die neue Midi-Datei (ich habe das Tempo beschleunigt, um unter der 30-Sekunden-Grenze zu bleiben).
Erste Version in AWK (66 Bytes):
Dies ist viel weniger interessant als meine vorherige Antwort , aber es ist viel kürzer, also:
Dies gibt eine gültige "abc" -Datei aus, die (unter anderem) in EasyABC eingelesen werden kann. Es wird so aussehen:
und es wird so klingen (Midi-Datei) . +
quelle
x86-Maschinencode (COM-Datei):
121120113109 BytesHexdump:
Kann problemlos unter DosBox ausgeführt werden; Die Ausgabe ist eine .SND-Datei mit dem Namen
SND
. Hier ist eine FLAC-Version der Ausgabe (und hier die .COM-Datei).Kommentierte Versammlung:
Das
data.dat
obige Beispiel ist eine benutzerfreundliche Darstellung der Morsezeichenfolge (unteres Bit: Ton ein / Ton aus, obere 7 Bits: Tonlänge in Samples >> 4), die von einem Python-Skript generiert wurde:quelle
a
ofa.snd
wird direkt vor den SND-Header gestellt, der mit.snd
einem Null-Byte beginnt , sodass ich das.snd
Teil kostenlos bekomme und dessen Null-Terminator wieder verwende. Die Tatsache, dass der Header ein Byte nach dem Dateinamen beginnt, ermöglicht es mir außerdem, a zu verwendeninc dx
, um zum Header (1 Byte) anstelle von amov dx, header
(3 Byte) zu wechseln . OTOH, wenn ich es nur.snd
alleine nennen dürfe, könnte ich zwei Bytes sparen, aber ich bin nicht sicher, ob das unter DOS möglich ist (die Behandlung der Erweiterung unter DOS war ziemlich eigenartig)..SND
: Ich bin.SND
auf DosBox undSND~1
FreeDOS gelandet und erwarte auf "echtem" DOS etwas anderes. Somit ist es definitiv ein Bereich "undefinierten Verhaltens". Am Ende entschied ich mich dafür, die Datei aufzurufenSND
(1 Byte weniger aufgrund des Entfernensa
, wobei die Kosten für dasinc dx
-, was wird, beibehalten werdendec dx
).Mathematica - 130
Online spielen
quelle
Export
, wie"m.mid"~Export~Sound@...
.(b=None~s~#&)@.6
sollte auch sein(b=None~s~#&)@.4
, können Sie 3 Zeichen mitr = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
Perl 5: 94
122 140SND-Dateien haben einfachere Header und müssen nicht binär gedruckt werden. Diese Versionen erzeugen eine 8-kHz-Mono-SND-Datei mit dem Namen 'a':
Das Ergebnis Datei .
Alte Lösung. Erzeugt eine 1-kHz-8-Bit-Mono-WAV-Datei mit dem Namen 'a':
Das Ergebnis Datei .
Um 122 Zeichen zu erhalten, musste ich den Header in eine Binärdatei einfügen, anstatt ihn zu packen, was das Kopieren des Codes hier erschwert. Die entkommene Version ist:
Base64-Codierung der aktuellen 122-Byte-Lösung:
quelle
.au
Du könntest vielleicht eine Erweiterung gebrauchen . Gut gemacht!AWK:
172170 Bytes... und ohne Wave-Bibliothek! (*)
Dadurch wird eine Sun au-Audiodatei auf stdout ausgegeben, die unter anderem von vlc wiedergegeben werden kann. Während das Dateiformat au keine Einschränkung der Abtastrate aufweist, lehnt VLC die Wiedergabe von Dateien mit einer Abtastrate von weniger als 4096 Hz ab. Deshalb habe ich diese Frequenz verwendet
BEARBEITEN: Link zur resultierenden Audiodatei auf DropBox
(*) Sollte es dafür keinen Bonus geben? ;O)
quelle
d=d "\177
... Verkettung. Das spart ein Byte. Aber wenn ich die resultierende Audiodatei abspiele, klingt es so, als würde der letzte Punkt der 5. fehlen.Python, 155
Verwendet das in Python integrierte Wave-Modul.
Schreibt in eine Datei mit dem Namen
n
.Vielen Dank an Sp3000 für den Vorschlag zur Verwendung des Listenverständnisses für die Schleife (dies hat dazu beigetragen, ein wenig Einrückung zu entfernen).
Hör es dir an:
https://soundcloud.com/bitpwner/morse-the-new-year--2015
Hier ist ein Link zu SoundCloud, falls der eingebettete Player für Sie nicht funktioniert.
Kommentierter Code:
quelle
w
ist ein Nebeneffekt, ich denke, Sie können compwhile h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
C #,
556552536535516506503491483 BytesVerwendet die Bibliothek Wav.Net .
Ausgabe in eine Datei mit dem Namen
a
.Ergebnis auf Dropbox gehostet
Ungolfed-Code:
quelle
Python
32,191188174171 (keine Bibliotheken)WAV-Dateien sind unglaublich einfach. Wollte mal ohne Bibliotheken probieren. Aus irgendeinem Grund scheinen meine Dateien Windows Media Player zum Absturz zu bringen. Schnelle Zeit
funktioniertBugs auf halbem Weg in die Datei. Die Umstellung auf eine höhere Samplerate mit Audition behebt dieses Problem.Update : Einige Optimierungen aus der Perl-Antwort implementiert. Jetzt nur noch mit dem Namen
n
und in 1000Hz Abtastung ausgeben. Info oben entsprechend bearbeitet.Alte Version
quelle
C # ~ 485 Bytes
Verwenden der Wav.Net- Bibliothek.
Und hier ist die Ausgabe.
Lesbare Version,
quelle
C #
382333 ByteVerwendet keine nicht-standardmäßigen Bibliotheken, schreibt ein 8 Bit pro Sample 44100 Samples pro Sekunde WAV mit, was ich hoffe, ist ein gültiger Header (scheint in WMP / .NET / Audacity glücklich zu spielen / zu laden).
Der Header ist Base64-codiert, und die Morse wird als Ein- / Ausschaltsignal codiert, das in einer einzelnen Länge (64 Bit) gespeichert wird, da die letzten 5 Bit mit den ersten identisch sind.
Das Ergebnis finden Sie hier
Golf Code:
Mit Kommentaren:
quelle
.wav
, sodass Sie dort 4 Bytes speichern können.SuperCollider ,
625605 BytesEinreichung der Audio-Programmiersprache!
Die Ausgabe wird in eine Datei
b
im AIFF-Format geschrieben. Windows Media Player kann es nicht öffnen, aber es funktioniert einwandfrei in VLC Media Player. Die erzeugte Dateia
ist eine OSC-Datei .Ich habe einige SuperCollider-Funktionen erstellt:
f
Erzeugt einen kurzen Piepton,g
eine kurze Pause,h
einen langen Piepton undi
eine lange Pause. SuperCollider benötigt die Startpositionen für jede Sinuswelle und keine Länge. Deshalb musste ich Funktionen erstellen, die eine Welle mit der richtigen Startposition erzeugen, und ich muss die Funktionen jedes Mal aufrufen, wenn ich eine Sinuswelle benötige. (Ich konnte eine Wave mit einer bestimmten Länge nicht in einer Variablen speichern, um sie wiederzuverwenden.) Die\w
Definition wird am Ende des Codeblocks erstellt.Auf meinem Windows-Computer wurde die Audiodatei nicht im selben Verzeichnis wie mein Code gespeichert, sondern in diesem Verzeichnis:
Ergebnis auf Dropbox gehostet
Code mit Einrückung:
quelle
ChucK -
1195217201147145144ChucK ist eine Audio-Programmiersprache. bitpwner hat mir geholfen, dies von 201 Bytes auf 147 Bytes zu reduzieren.
Hier ist ein direkter Link zu SoundCloud, falls der eingebettete Player für Sie nicht funktioniert.
quelle
WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
j
, um das Array zu vermeiden?1016835
im Binär ist11111000010000000011
.j
ist dazu da, einfach die Pausen zwischen jeder Ziffer zu verfolgen2015
(jede Ziffer hat 5 Töne).Csound, 140 + 40 = 180
Audio-Programmiersprache.
Dies ist die Orchesterdatei:
und das ist die Score-Datei:
Die Größen werden unter der Annahme berechnet, dass kein zusätzliches Leerzeichen, ein einzeiliger Abschluss (UNIX) und kein Abschluss nach der letzten Zeile vorhanden sind.
Sie rufen sie mit dem Befehl csound auf:
Dadurch wird im aktuellen Verzeichnis eine Ausgabedatei mit dem Namen "test.aif" erstellt.
https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq
Ich hätte zwei oder drei Bytes rasieren können, indem ich eine hässlichere Wellenform gewählt hätte, aber ich mag den Klang der traditionellen Morse-Sinus-Welle.
PS: Ich bin ein absoluter Neuling bei Csound, alle Golftipps sind willkommen, vor allem was die Punktedatei betrifft!
quelle
Brainfuck , 649 Bytes
Dies erzeugt eine Sequenz von 8-Bit-Samples ohne Vorzeichen, die mit einem Tool wie
aplay
Linux mit 8000 Samples pro Sekunde abgespielt werden können . Gutschrift auf Tabelle der BF-Konstanten .Probieren Sie es online!
Etwas weniger golfen
quelle