Erzeugen Sie weißes Rauschen


15

Die Herausforderung besteht darin, eine Audiodatei aus weißem Rauschen zu erstellen.
Anforderungen und Anweisungen:

  • Ihr Programm muss eine Audiodatei erzeugt nur weißes Rauschen enthalten, was bedeutet , seine Intensität ist das gleiche für alle (vernünftigen) Frequenzen und ungleich Null [siehe Beispiel Plot ];
  • Man muss in der Lage sein, die Audiodatei auf der neuesten Version von VLC abzuspielen [zum Zeitpunkt der Erstellung Ihrer Antwort];
  • Das Programm benötigt keine kryptografisch starke Zufälligkeit, randFunktionen oder das Auslesen /dev/randist in Ordnung.
  • Das Programm muss zumindest theoretisch in der Lage sein, mindestens 1 Stunde Audio zu erzeugen (was bedeutet, dass Systembeschränkungen wie die maximale Dateigröße nicht gelten).
  • Ihre Punktzahl ist die Anzahl der Bytes in Ihrem Quellcode zuzüglich aller zutreffenden Boni.
  • Die Verwendung einer externen Bibliothek von Drittanbietern ist in Ordnung.
  • Das Programm muss ohne Internetzugang funktionieren.

Boni sind:

  • -15%: Ermöglicht die Angabe des Formats der Audiodatei (mindestens zwei Auswahlmöglichkeiten; die Anzahl der möglichen Auswahlmöglichkeiten ändert nichts an der Punktzahl).
  • -10%: Ermöglicht die Angabe der Dauer der Audiodatei;
  • -5%: Ermöglicht die Angabe der Bitrate der Audiodatei.

Die Einstellungen können in Variablen, Dateien oder als Befehlszeilenparameter Ihrer Wahl gespeichert werden. Prozentsätze werden aus der ursprünglichen Anzahl von Bytes berechnet, bevor ein Bonus angewendet wird.


Die Problemspezifikation scheint eine Code-Colfing-Herausforderung zu beschreiben, aber die Tags sagen etwas anderes aus.
Undergroundmonorail

Hoppla! Ich werde das reparieren.
Giulio Muscarello

Vielleicht sollte die Herausforderung dahingehend überarbeitet werden, dass nur "vorhandene Bibliotheken von Drittanbietern" anstelle von "beliebigen Bibliotheken" zugelassen werden.
jpmc26

Wirst du ein Trottel sein, wenn der Lärm weiß ist? Wenn Sie wirklich nachprüfen möchten: Das Autokorrelogramm sollte eine deutliche Spitze um Null haben und fast nichts bei jeder anderen Verzögerung. Wenn Sie kein Stickler sein wollen, ist es meines Erachtens sinnlos anzugeben, dass es sich um weißes Rauschen handelt. Sag einfach Lärm.
Tim Seguine

Was ist mit WebAudioAPI? Ich habe js Programm codiert, das weißes Rauschen spielt
Евгений Новиков

Antworten:


4

MATLAB, 25

wavwrite(rand(8e3,1),'a')

schreibt eine neue WAV-Datei auf die Festplatte mit dem Namen a. Es hat eine Abtastrate von 8 kHz und 16 Bit pro Abtastung im vorzeichenbehafteten Ganzzahlformat. Die Quelldaten werden gleichmäßig auf das Intervall verteilt [0,1], das dem Intervall [0,32767]nach der Konvertierung in das Ganzzahlformat zugeordnet wird.

MATLAB, 28 - 4 (10% + 5%) = 24

Ich bin mir nicht sicher, was das OP damit zu tun hat, wie Einstellungen in Variablen gespeichert werden können, aber ich habe es so interpretiert, dass es für diesen Fall günstig ist. Vorausgesetzt, dass:

  • Die gewünschte Bitrate (in Bit / Sekunde) wird vom Benutzer in der Variablen angegeben b. Die Bits pro Abtastung sind bei 16 fest codiert.

  • Die gewünschte Dauer der Datei (in Samples) wird in der Variablen angegeben d.

Das Ergebnis ist:

wavwrite(rand(d,1),b/16,'a')

MATLAB, 16 - 4 (15% + 10%) = 12

Wenn ich zur Verfolgung von Boni eine weitere Schicht Sleaze hinzufüge, gehe ich von einer anderen Annahme aus: Die gewünschte Funktion für die Ausgabe der Datei sollte in der Variablen angegeben werden f. Dann vereinfacht sich der Code zu:

f(rand(d,1),'a')

Zulässige Werte für die Funktion sind:

f = @wavwrite

oder

f = @auwrite

Jede Funktion bewirkt, dass das obige Snippet eine Datei des entsprechenden Formats (WAV oder .au) mit einer Abtastrate von 8 kHz und der angegebenen Dauer ausgibt. Ich habe den Bonus für die Angabe der Bitrate hier weggenommen, da auwritestandardmäßig 8 Bit pro Sample anstelle von 16 Bit wavwriteverwendet werden. Ich sehe keine Möglichkeit, die beiden zu harmonisieren, ohne mehr Zeichen zu verwenden.


10

Bash, 34

dd if=/dev/sda of=file.wav count=1

Wenn Sie keine "Zufälligkeit" der Festplatte wollen (viel langsamer)

dd if=/dev/random of=file.wav count=9

SPIN, 28

word x=0
repeat
 word[?x]=?x

4
Irgendwie glaube ich nicht, dass der Dateikopf völlig zufällig sein kann / derselbe wie der erste Sektor der Festplatte
John Dvorak

1
Herr Doktor kann recht haben, wenn das Testgeschirr VLC ist. VLC ist ziemlich nachsichtig.
Jonathan Van Matre

1
Sie haben Rauschen erzeugt, aber ist es weißes Rauschen?
Stephen Melvin

1
/ dev / random gibt es auch auf Macs! Leider kann iTunes die resultierende WAV-Datei nicht abspielen. Nicht, dass ich mich beschweren könnte - ich entschied mich für VLc wegen seiner Vergebung und der Vielzahl nativer Codecs.
Giulio Muscarello

1
Sie können fünf Zeichen speichern, indem Sie den Befehl ausführen, während sich das Arbeitsverzeichnis befindet /dev.
David Richerby

4

Mathematica 52 - 5 = 47

gexportiert eine WAV-Datei mit weißem Rauschen von sSekunden und 8000 Bit / s.

g@s_:=Export["p.wav",RandomReal@{-1,1}~Play~{t,0,s}]

Beispiel: Es wird eine 6 Sekunden lange weiße Rauschdatei exportiert.

g[6]

p.wav


4

Supercollider, 89 - 10% = 80,1 Bytes

Leider wird diese Sprache hier nicht gewinnen, obwohl sie bewusst für die Erzeugung von Sound / Audio gemacht wurde. Aber es ist der erste Auftritt von Supercollider auf Code Golf, das ist cool!

Diese Einreichung verliert in erster Linie, weil das Einrichten und Ausführen der Aufzeichnung aufgrund des Client / Server-Designs dieser Sprache ein ausführlicher Prozess ist. Trotzdem ist es eine coole Sprache mit viel Power in sehr wenig Code, wenn man sie auffordert , komplexere Dinge als nur weißes Rauschen zu tun .

Die Dateidauer wird durch Ändern des Werts wait () festgelegt. Ich könnte es in eine Variable einfügen, aber das hat wirklich keinen Sinn, da Supercollider kein nennenswertes Stdio hat. Die Interaktivität besteht darin, den Code live zu manipulieren, während der Server noch spielt. Im Wesentlichen die IDE ist das I / O (es sei denn , Sie eine Benutzeroberfläche für Ihre Kreation bauen).

Hier ist die Golfversion:

{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

Hier ist eine Golf-Version mit der Option, entweder in Aiff oder WAV aufzunehmen und ein Sample-Format anzugeben (Int16, Int8 und Float sind alle Optionen). Leider ist die obige Version trotz aller Boni besser. Dies wären 139 - 30% = 97,3 Bytes.

s.recSampleFormat='int16';s.recHeaderFormat='wav';{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

Und hier ist eine ungolfed Version des letzteren, damit Sie sehen können, was los ist.

s.recSampleFormat='int16';
s.recHeaderFormat='wav';

{WhiteNoise.ar(1)}.play;
s.prepareForRecord;

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}

eine Stimme für die Verwendung von Supercollider. Es gibt viele andere Rätsel, für die es GROSSARTIG wäre. Check out Musik und Audio
Nicht dass Charles

4

Bash + ALSA, Punktzahl: 44 (52 Zeichen - (10% + 5%) Boni)

Länger als die andere bashAntwort, akzeptiert aber Dauer und Bitrate. Fügt der Datei auch einen einigermaßen korrekten Header hinzu, sollte also einigermaßen portabel sein:

arecord -r$2|head -c44;head -c$[$2*$1] /dev/urandom

Speichern Sie es als Skript chmod +xund führen Sie Folgendes aus:

$ ./wav.sh 1 44100 > c.wav
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 44100 Hz, Mono
$ 

Beachten Sie, dass die WAV-Ausgabe auf stdout eingestellt ist und daher in eine Datei umgeleitet werden muss.


Sie könnten ungefähr 1,20 Zeichen einsparen, indem Sie / dev / random anstelle von / dev / urandom lesen, da Geschwindigkeit keine Voraussetzung ist.
Giulio Muscarello

1
Ausgabe ist zu stdin ?
user253751

0

C 127 115 Bytes

#define H htonl
main(c){for(write(1,(int[]){H(779316836),H(24),-1,H(2),H(8000),H(1)},24);;write(1,&c,1))c=rand();}

Der Großteil des Codes schreibt den Header für eine * .au-Datei. Dies druckt eine Pseudozufalls-Audiodatei aus, um sie zu standardisieren.

Die Abtastrate kann durch Ändern der Taste eingestellt werden 8000.

Die Dauer kann angepasst werden, indem ctrl-cSie auf drücken , wann immer Sie aufhören möchten :-)


0

JavaScript, 167 Byte

VORSICHT: Verringern Sie die Lautstärke vor dem Start. Weißes Rauschen ist böse

Erzeugt keine Datei, möglicherweise nicht das, was erwartet wurde.

-4 Byte Hack spielen nur auf dem linken Kanal Rauschen

c=new AudioContext()
n=c.createScriptProcessor(s=512)
n.connect(c.destination)
n.onaudioprocess=e=>{a=s;while(a--){e.outputBuffer.getChannelData(0)[a]=Math.random()}}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.