Ja, Sie haben den Titel richtig gelesen. spiele den Klang von pi.
Genauer gesagt, ordnen Sie jede Ziffer von pi in den ersten 1000 einer Musiknote zu und geben Sie die resultierende Melodie in eine Datei aus.
Grundsätzlich wird jede Ziffer zu einer Note auf der C-Dur-Tonleiter (im Grunde die normale Tonleiter). 1 dreht sich zu Mitte C, 2 dreht sich zu D4, 3 dreht sich zu E4, 9 dreht sich zu D5 und so weiter.
Regeln
- Jede Note sollte genau 0,5 Sekunden lang sein.
- Die Melodie sollte die ersten 1000 Stellen von pi enthalten, einschließlich der ersten 3.
- 1 bis 7 stehen für Mitte C bis B4, 8 für C5, 9 für D5 und 0 für E5
- Alle gut unterstützten Dateiformate sind zulässig, sofern sie vor dieser Herausforderung erstellt wurden.
- Die Datei enthält möglicherweise keine Pausen, auch nicht Start- und Endpunkt.
- Das gespielte Instrument spielt keine Rolle. Es könnte ein Klavier sein, eine Sinuswelle, alles, was wirklich ist, solange der richtige Klang leicht zu hören ist.
- Es darf keine Eingabe und keine Ausgabe außer für die Datei erzeugen. Das Lesen aus anderen Dateien ist nicht zulässig.
- Standardlücken sind verboten.
Beispiel für einen Mathematica-Code:
(*please forgive me for this horrible, horrible mess of code*)
digits = RealDigits[Pi, 10, 1000][[1]] /. {0 -> 10};
weights = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16};
melody = {};
For[i = 1, i < 1001, i++, melody = {melody , Sound[SoundNote[weights[[digits[[i]]]], 0.5]]}]
final = Sound[Flatten[melody]];
Export["C:\\Mathematica Shenanigans\\pi.wav", final];
Beispielmelodie mit den ersten 100 Stellen: http://vocaroo.com/i/s0cfEILwYb8M
Eine Tabelle mit Tonhöhen für jede Note und für welche Note steht jede Ziffer:
Digit 1: C: 261.63 Hz
Digit 2: D: 293.66 Hz
Digit 3: E: 329.63 Hz
Digit 4: F: 349.23 Hz
Digit 5: G: 392.00 Hz
Digit 6: A: 440.00 Hz
Digit 7: B: 493.88 Hz
Digit 8: C5: 523.25 Hz
Digit 9: D5: 587.33 Hz
Digit 0: E5: 659.25 Hz
code-golf
kolmogorov-complexity
pi
audio
sagiksp
quelle
quelle
4
-ten Oktave sind. Kommt in Ihrer Tabelle auch die Ziffer0
zuletzt (E5
)?Antworten:
Mathematica,
10787 BytesVielen Dank an Martin Ender für die Einsparung von 20 Bytes!
#&@@RealDigits[Pi,10,1000]
gibt die Liste der ersten 1000 Stellen von π an.SoundNote[⌊12Mod[#,10,1]/7⌋-1
Erzeugt aus einer Ziffer die richtige Tonhöhenzahl (wobei 0 standardmäßig für Mittel-C steht). DannSoundNote[...,.5]&/@
dreht sich , dass die Tonhöhe in ein Klangobjekt der Dauer 1/2 Sekunde, dieSound
Raffungen in ein tatsächliches Audio Schnipsel. Schließlich wird"t.au"~Export~
in eine Datei im Unix-Audioformat exportiert, hauptsächlich, weil die Erweiterung die kürzeste unterstützte ist, aber auch, weil der Dateiname ein Schlag ins Gesicht nach π ist !Vorherige Einreichung:
quelle
Python 2, 182 Bytes
`x`
wird produzieren31415926...20198L
. Das TrailingL
wird verwendet, um das letzte Kanalnachrichtenbyte über das Mapping zu erzeugen~ord(i)%29
.Gibt eine einzelne Spur-Typ-1-Midi-Datei aus, die
p.mid
im aktuellen Arbeitsverzeichnis gespeichert ist .quelle
Scratch , 530 Bytes
Inspiriert von der Antwort von BookOwl .
Online-Demonstration . Die Wiedergabe beginnt sofort. Drücken Sie space, um die Wiedergabe zu stoppen und zurückzusetzen. Klicken Sie auf die Katze, um erneut zu starten.
Bearbeiten: leicht nach unten Golf gespielt. Ich habe einige Golftipps im offiziellen Wiki gefunden .
Grafisch:
Verwendet den Rabinowitz Wagon-Zapfen, um jeweils 4 Ziffern zu erzeugen.
quelle
R, 450 Bytes
Verwendet package
Rmpfr
, um die richtige Genauigkeit für Pi-Ziffern zu erhalten. Gibt eine.wav
Datei aus.Mit neuen Zeilen und Kommentaren eingerückt:
quelle
C (gcc) 572 Bytes
Ungolfed-Version:
Erläuterung:
play(float freq)
Die Routine nimmt die Frequenz als Parameter der Note (fest codiert), die Sie spielen möchten, und speichert eine Sinuswelle in einem Puffer.f()
speicherte ich die Frequenzen, die Noten von C4 bis E5 entsprechen, in einemnotes
Array.pi
Wert, gefolgt von 1000 Ziffern, in einem Puffer. Dazu habe ich daspi
Paket auf meinem Computer installiert und verwendetpopen
, um die Ausgabe von zu lesenpi 1000
und in einemchar
Puffer zu speichern .for
Schleife habeswitch
ich dieplay()
Funktion aufgerufen , um Noten zu erzeugen, die jeder einzelnen Ziffer impi
Puffer entsprechen. ,Verwendung:
./binary_name.o | aplay
Auf modernen Linux-Distributionen würden Sie auf ältere Distributionen umleiten/dev/audio
quelle
switch(foo){...}
etwas wie zu ersetzenplay(note[(foo-'1')%10])
. Lesen Sie auch Tipps zum Golfen in C