Es gibt 88 Tasten auf einem Standardpiano und 95 druckbare ASCII- Zeichen (Hex-Codes 20 bis 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
('Zeichen' bezieht sich von nun an auf jedes druckbare ASCII-Zeichen.)
In diesem JSFiddle habe ich das ausgenutzt und eine einfache Syntax entwickelt, die mit AudioSynth Klaviermusik generiert . (Wenn mich jemand zu einem verlinkbaren Satz echter Klaviertöne führen kann, bin ich dankbar.)
Jedes Zeichen in der Eingabezeichenfolge () 01+-
entspricht außerdem einer Klaviertaste:
CHARACTER: ! " # $ % & ' * , . / 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
KEY NUMBER: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
NOTE: A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C
OCTAVE: 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 8
So RPNPRRR
spielt die ersten 7 Noten von Mary had a little lamb die voreingestellten Timing - Parameter verwenden Sie in der JSFiddle sehen können.
Space ( ) repräsentiert eine musikalische Pause, die ein Notenintervall dauert. So
RPNPRRR PPP RUU
spielen die ersten 13 Töne von Mary Had a Little Lamb mit Pausen an den richtigen Stellen.
Wenn einem anderen Zeichen ()01
eine Folge von 0
's und 1
' s (Regex [01]+
) vorangestellt wird , wird diese Folge als Binärzahl b gelesen und das Zeichen durch b Kopien von sich selbst ersetzt. So 101A11 10+1-0B01C
wird es, AAAAA ++-C
weil 101
= 5, 11
= 3 usw. (Eine Folge von 0
's und 1
' s am Ende der Zeichenfolge hat keine Auswirkung.)
Übereinstimmende Klammern ( ()
) dienen zwei Zwecken:
- Wenn ihr Inhalt nicht mit einer Folge von
0
's und1
' s endet , werden alle Noten gleichzeitig als Akkord gespielt (was sich sonst nicht von einer Note unterscheidet). So(NQU)
ist ein C - Moll - Akkord auf Oktave 4.
Wenn doppelte Noten vorhanden sind , ihr Sound ist auch dupliziert. Also(NN)
und(NNN)
anders klingen. - Wenn ihr Gehalt tut Ende mit einer Folge von
0
‚s und1
‘ s, dass Folge als binäre Zahl gelesen wird , b , und die Klammern und dessen Inhalt mit ersetzt b Kopien des Inhalts. So(NQU11)
wird 9 einzelne Noten:NQUNQUNQU
.
Klammern Details:
- Das Verschachteln von replizierenden Klammern (Zweck 2) ist in Ordnung:
(N(QU10)11)
→(NQUQU11)
→NQUQUNQUQUNQUQU
. - Das Verschachteln von nicht replizierenden Klammern (Zweck 1) ist in Ordnung, hat jedoch keine Auswirkung:
(A((+)C))
ist dasselbe wie(A+C)
. - Sie können auch beide kombinieren:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
. - Eine Folge von
0
's und1
' s vor nicht replizierenden Klammern wiederholt sie auf die gleiche Weise, wie einzelne Zeichen wiederholt werden. So10(NQU)
wird es(NQU)(NQU)
. - Eine Folge von
0
's und1
' s vor dem Replizieren von Klammern hat keine Auswirkung. (
muss immer eine Übereinstimmung haben)
, aber nicht umgekehrt: zBN)
ist gültig.
Plus ( +
) und Minus ( -
) erhöhen bzw. verringern die Dauer von Noten oder das Zeitintervall zwischen Noten, je nach Kontext:
- Wenn innerhalb Klammern nicht-replizierenden, sie sofort erhöhen oder die Notendauer Variable durch eine vorgegebene Anzahl von Millisekunden (siehe verringern JSFiddle ). So
(++)N
spieltN
bei einer längeren Dauer als normal. - Wenn außerhalb Klammern nicht-replizierenden, sie erhöhen oder das Intervall zwischen dem Beginn der nächsten Note und der Note , nachdem sie (und für jedes folgende Intervall) durch eine vorgegebene Anzahl von Millisekunden verringern. Also in
++NP
der Pause zwischen demN
undP
ist länger als üblich.
Die Dauer der Noten und das Zeitintervall zwischen ihnen können nicht unter 0 fallen.
Herausforderung
Ich habe mich absichtlich für () 01+-
die 7 Sonderzeichen entschieden, weil sie in vielen Programmiersprachen in vielen Kontexten harmlos platziert werden können.
Ihre Aufgabe ist es, ein Quine in 512 Bytes oder weniger zu schreiben, das den besten Klang erzeugt, wenn der Code selbst als Eingabezeichenfolge in der JSFiddle verwendet wird .
Sie können beliebige Anfangswerte (nicht negative ganze Zahlen) für die 4 Intervall- / Dauer-Parameter auswählen, aber Ihre Melodie darf nicht länger als 10 Minuten dauern. Sie sollten uns auch mitteilen, ob Ihre Melodie in einem bestimmten Instrument am besten klingt.
Regeln
- In Ihrem Code sind nur Tabulatoren, Zeilenumbrüche und druckbare ASCII-Zeichen zulässig. Alle nicht druckbaren ASCII-Zeichen werden vom Melodieersteller ignoriert.
- Die Ausgabe kann in eine Datei, eine Standardausgabe oder die nächstgelegene Alternative erfolgen (z. B. JS-Warnung). Es erfolgt keine Eingabe.
- Kein Lesen des Quellcodes. Es muss eine wahre Quine sein.
- Das Entfernen von 3 zusammenhängenden Quellzeichen muss dazu führen, dass das Programm nicht mehr als Quine fungiert. Dies soll sicherstellen, dass die Leute keinen guten Song in eine Saite schreiben und dann einen winzigen Quine-Anteil für die Ausgabe haben.
- Also , wenn Ihr Programm war
MYCODE
dannMYC
,MYE
,MDE
, undODE
alle sollten nicht quines sein (sie können sonst Fehler oder Ausgang etwas).
- Also , wenn Ihr Programm war
Dies ist ein Beliebtheitswettbewerb, bei dem die am höchsten bewertete Antwort gewinnt.
Update: Entspannte letzte Regel.