Schreiben Sie ein Programm, um den beliebten englischen Kinderreim zu spielen.
(Diese Datei ist unter der Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Unported- Lizenz lizenziert. Namensnennung: Helix84 aus der englischsprachigen Wikipedia ; Blahedo aus der englischsprachigen Wikipedia .)
Einige Wikipedia-Artikel, die nützlich sein können:
- Twinkle Twinkle Little Star (enthält einen Audioclip darüber, wie die Ausgabe Ihres Programms klingen soll)
- Moderne Musiksymbole (um mehr über die oben verwendete Musiknotation zu erfahren)
- Note # Notenfrequenz (Hertz) (die Formel zur Berechnung der Frequenz jeder Note)
Einige Richtlinien für Ihre Einreichung:
Ihr Programm muss die Soundkarte des Computers verwenden. Wenn Ihre Programmiersprache keinen bequemen Zugriff auf Audio-Hardware hat, muss Ihr Programm eine Ausgabedatei in einem Standardformat wie WAV oder MIDI erstellen.
Ihr Programm muss tatsächlich seine Ausgabe generieren. Das Einbetten der Ogg Vorbis-Datei aus Wikipedia ist beispielsweise nicht zulässig.
Die Audioqualität muss akzeptabel sein. Zumindest sollte das Lied leicht erkennbar sein. Vorzugsweise sollte es auch gut klingen.
Der Fokus sollte auf Codegröße, Klangqualität oder beidem liegen (erläutern Sie, für welche Sie sich entschieden haben). Auch elegante Lösungen wären toll. Habe Spaß!
Dies ist ein Code-Golf , also gewinnt der kürzeste Code
Antworten:
QBasic (56)
Der schwerpunkt liegt auf der erinnerung :)
(Habe keinen QBasic um das zu testen)
quelle
JavaScript (
214212211 Zeichen)Öffnen Sie Safari, Opera oder Google Chrome in der JavaScript-Shell und geben Sie den folgenden Code ein:
Aus Gründen der Lesbarkeit ungekürzt (selbst dann ist es möglicherweise schwer zu verstehen):
Mit einigen weiteren Zeichen könnte es auch in Firefox funktionieren, aber Sie können den
audio/wav
Teil ändern , um zumindest die WAV-Datei zu speichern.quelle
open(...)
aufAudio(...).play()
(8 weitere Zeichen) ändern , um den in Firefox integrierten Audioplayer verwenden zu können.C # (Länge: LOL)
Ich habe hier also die Unterstützung für die Generierung einer WAV-Datei aus der Zeichenfolge implementiert, die für die QBasic-Lösung in C # verwendet wird (eine Oktave, keine Zufälle). Der Schwerpunkt lag auf:
unsafe
Codeblöcke vermeidenquelle
FromDigits["LOL",36]==28101
Das sieht nicht aus wie LOL <sub> 36 </ sub> Bytes ...Python (259)
quelle
import ttls
?C 277 Zeichen
Perl, 203 Zeichen
Zweckmßigerweise OSS ‚s
/dev/dsp
standardmäßig 8kHz mono U8; Ich öffne hier nur das Gerät und schreibe berechnete Samples.quelle
j,f;main(i){char b[8000];f=open("/dev/dsp",1);for(i=24;i--;write(f,b,j))for(j=0;j<8000;j++)b[j]=(i%4&&j/400%20==9?1:1+sinf(j*powf(2,("@BDEGIG@BDEGBDEG@BDEGIG@"[i]-64)/12.)))*127;}
PowerShell: 207
Golf Code:
Ungolfed, mit Kommentaren:
Nicht die am besten klingende Wiedergabe des Songs, aber es funktioniert.
quelle
n{
stattn {
?C - 520
Stoßen.
Warum sollten Sie die Hardware vergangener Jahrhunderte wie Lautsprecher und Kopfhörer verwenden? Mit diesem hervorragenden Code können Sie den Song auf einer modernen Hardware abspielen: einem Diskettenlaufwerk!
Keine besonderen Anforderungen:
-lm
/dev/fd0
, und klicken Sie entweder auf das Gerät, oder führen Sie es als Superuser ausBiegt die Regeln ein wenig, aber betrachten wir für eine Sekunde das Diskettenlaufwerk als Soundgerät und den IDE-Controller als integrierte Soundkarte.
quelle
HyperCard 2.2 - 113
Verwendung: Starten Sie HyperCard, geben Sie ⌘M ein, um das Meldungsfeld zu öffnen, fügen Sie den obigen Code ein und drücken Sie die Eingabetaste.
harpsichord
kann durchflute
oder ersetzt werdenboing
, um andere Geräusche zu erhalten.quelle
harpsichord
->flute
-6 entferne das Leerzeichen zwischen Instrument und Anführungszeichen -1 total -7C 96 Zeichen
Erzeugt unformatierte 8-Bit-Mono-Audiodaten ohne Vorzeichen im klassischen Bytebeat- Stil. Die empfohlenen Abtastraten für die Wiedergabe liegen zwischen 8 und 16 kHz. Durch Ändern der Samplerate werden das Tempo und die Tonhöhe geändert.
Um unter Linux zu kompilieren und zu spielen, speichern Sie den obigen Code unter
twinkle.c
und führen Sie die folgenden Befehle aus:Einige Hinweise zur Funktionsweise des Codes:
Der allgemeine Trick, der für Bytebeat-Kompositionen wie diese verwendet wird, ist, dass
putchar()
ein ganzzahliger Wert verwendet wird, aber nur die unteren acht Bits davon gedruckt werden. Somitputchar(t)
, wot
es ein zunehmender Zähler erzeugt eine Sägezahnwelle, und die Frequenz der Welle kann durch Multiplikation geändert werden ,t
mit einem geeigneten Wert ist .!!(t>>9&7|!(-t>>12&7))
erzeugt das sich wiederholende 6 + 1-Notenmuster. Insbesondere wird!!(t>>9&7)
ausgewertet,0
wannt>>9 & 7 == 0
und1
ansonsten. Auf diese Weise wird alle 4096 Abtastungen eine 512-Abtastungslücke in der Wellenform erzeugt, während!(-t>>12&7)
jede achte derartige Lücke beseitigt wird.96+"#d|dOE3#dOE3dOE3"[t>>13&15]
generiert die Melodie: Der ASCII-Code jedes Zeichens in der Zeichenfolge plus 96 gibt die relative Häufigkeit der entsprechenden Note an. Tatsächlich sind die Werte die ungefähren Frequenzen in Hz von Konzerttönen in der 3. / kleinen Oktave, dh mit A entsprechend 220. Da jedoch der Grundton, mit dem diese Werte multipliziert werden, ungefähr 64 Hz beträgt (wenn bei 16 kHz gespielt) (oder 32 Hz bei 8 kHz), müssen wir das Ergebnis um fünf Oktaven verkleinern>>5
, um die Frequenz wieder in einen vernünftigen Bereich zu bringen.Ps. Wenn Sie diesen Code auf einem JavaScript-basierten Bytebeat-Player testen möchten, ersetzen Sie ihn
[t>>13&15]
durch.charCodeAt(t>>13&15)
.quelle
Python
317305301Dies ist meine Lösung, die nur Standard-Python-Bibliotheken verwendet:
Und hier ist es mit etwas mehr Leerzeichen für die Lesbarkeit:
quelle
Mathematica, 86 Zeichen
quelle
Arduino, 688
Schließen Sie den Summer an Ausgang 11 an. Ich habe mich hauptsächlich auf die Qualität konzentriert , aber auch auf die Codelänge.
quelle
"ccggaag ffeeddc ggffeed ggffeed ccggaag ffeeddc "
Leerzeichen entfernen?int beats[] =
Leerzeichen entfernen?for (long
Leerzeichen entfernen?11, LOW
Leerzeichen entfernen?note, int
Leerzeichen entfernen?i], duration
Leerzeichen entfernen?11, OUTPUT
Leerzeichen entfernen?ffeeddc "
weiß , ist der Platz in für eine Art Verzögerung, die Sie am Ende nicht benötigen, undbeats[] =
hat keinen Grund, einen Platz zu haben. Außerdem sollten Sie eine Version erstellen, die sich auf die Codelänge konzentriert, nur zum Teufel!Bash + Say + Gunzip, 136 Bytes
say
Dies ist natürlich der OS X-Sprachausgabebefehl. Das ist ... bescheuert. Ja, lass uns mit dorky gehen.Die 117 Bytes sind natürlich ein gzip-Stream, der nicht druckbare Zeichen enthält. Hier ist ein xxd-Dump des Skripts mit diesen Zeichen:
Erläuterung
Die 117 Bytes sind das folgende gezippte Skript:
Das stimmt, ich habe nur eine Menge verschiedener
say
Stimmen dazu gebracht, "o" zu sagen. Um herauszufinden, welche, schrieb ich ein Skript mit Hilfe von Aubionoten , um eine schnelle und fehlerfreie Schätzung der Tonhöhe jeder Stimme zu erhalten.Ich überlegte, dies manuell zu versuchen, aber es gibt so viele Wiederholungen, dass ich dachte, Zopfli würde es kürzer machen, also habe ich den einfachen Ausweg gewählt.
quelle
SmileBASIC, 45 Bytes
quelle
Powershell,
120 bis117 Bytes[Console]::beep
, Beschriftungen und Frequenzen von Iszi inspiriertHauptidee :
A
,C
,D
,E
,F
,G
.double duration
.$_-band7
) jeden Hinweis Verwendungen als Index im Array Frequenzen (A->1
,C->3
,D->4
...)(0,110,0,65,73,82,87,98)[$_-band7]*4
stattdessen Iszi's(0,440,0,262,294,330,349,392)[$_-band7]
.[console]::Beep
ist nicht das genaueste Musikinstrument, daher kann es leicht fälschen :)Erläuterung : Für jedes Zeichen aus der Melodiezeichenfolge
ccggaaGffeeddCggffeeDggffeeDccggaaGffeeddC
führt das Skript Folgendes aus :[console]::beep
, um die Note zu spielenquelle