Musikalische Quines auf einem ASCII-Klavier


22

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 RPNPRRRspielt 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 RUUspielen die ersten 13 Töne von Mary Had a Little Lamb mit Pausen an den richtigen Stellen.

Wenn einem anderen Zeichen ()01eine 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-0B01Cwird es, AAAAA ++-Cweil 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:

  1. Wenn ihr Inhalt nicht mit einer Folge von 0's und 1' 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.
  2. Wenn ihr Gehalt tut Ende mit einer Folge von 0‚s und 1‘ 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 und 1' s vor nicht replizierenden Klammern wiederholt sie auf die gleiche Weise, wie einzelne Zeichen wiederholt werden. So 10(NQU)wird es (NQU)(NQU).
  • Eine Folge von 0's und 1' s vor dem Replizieren von Klammern hat keine Auswirkung.
  • (muss immer eine Übereinstimmung haben ), aber nicht umgekehrt: zB N)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 (++)Nspielt Nbei 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 ++NPder Pause zwischen dem Nund Pist 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 MYCODEdann MYC, MYE, MDE, und ODEalle sollten nicht quines sein (sie können sonst Fehler oder Ausgang etwas).

Dies ist ein Beliebtheitswettbewerb, bei dem die am höchsten bewertete Antwort gewinnt.

Update: Entspannte letzte Regel.


3
Sie können Mary Had a Little Lamb auch auf einer Telefontastatur spielen: 3212333 222 399 (Probieren Sie es aus, es kommt perfekt heraus.)
Level River St

Es gibt viele kostenlose Soundfonts für Klavier. Auch schöne JSFiddle!
Qwr

Ich habe noch nie die letzte Regel in einer Herausforderung gesehen, ziemlich effektiv wie beabsichtigt, denke ich.
Nur die Hälfte des

@qwr Kennen Sie Sätze aller 88 Tasten, die auf diese Weise direkt verknüpft werden können ? Ich sah ein bisschen aus, konnte aber keine finden.
Calvins Hobbys

Antworten:


6

C

Ich habe ich beschlossen , die niedrige mochte Rauschen durch den String erzeugt Rumpeln , /**/die nicht so zufällig die Art und Weise zu öffnen ist und in der Nähe ein Kommentar in C. Der einzigen anderen interessant hier etwas ist , dass 34für ein "ersetzt durch 35-1(Ending in einem 1 absichtlich) zu Vermeiden Sie gottesfürchtige Akkorde. Ich habe auch versucht, das Ende dramatisch klingen zu lassen. Ich habe es wirklich getan. Ich beabsichtige, dies später zu ändern, damit es ein bisschen besser klingt.

/**/char*p= "/**/char*p= %c%s%c; int main(){printf(p,34,p,35-1);p++;/**/}/**/";
int main(){printf(p,34,p,35-1);p++;/**/}/**/

Nach meinem Verständnis der Regeln bestehen die kommentierten Abschnitte immer noch die endgültige Regel, da ihre Entfernung zu einem fehlgeschlagenen Quine führt.


3
"Ich habe vor, das später zu ändern, damit es ein bisschen besser klingt." Es ist fast ein Jahr her. Ich fange an zu glauben, dass Sie dies später nicht mehr bearbeiten werden, damit es besser klingt. : P
Alex A.

@AlexA. Über ein Jahr jetzt!
wizzwizz4

5

J

Ja, ich denke, Sie können sich vorstellen, wie es weitergehen wird.

Es ist schwer, in J etwas Cooles ohne Parens zu erreichen, und da man sie selten mit 0s und 1s beenden kann, klingen die meisten Dinge so, als ob jemand gleichzeitig auf der hohen und der niedrigen Tastaturhälfte sitzt. Ich habe mein Bestes versucht, ich werde dich wissen lassen.

Hier ist eine funky Basis für Klavier, denke ich. Ich weiß wirklich nicht, was ich als erstes mit Komposition anfangen soll, ich habe mir einfach eine Quine genommen und die Zahlen ein wenig vertauscht.

(23 23,~,~i.124+-100){,'(23 23,~,~i.124+-100){,'''

Und, nur zum Spaß, spielen Sie diese als EDM. Ich nenne es Japhex Twin .

".s=:'''".s=:'',''''''''&,@(,&'''''''')@(#~>:@(=&''''''''))s'

Sie können die Echtheit dieser feinen Code-Schnipsel auf tryj.tk bestätigen .


1
Dies könnte eigentlich für Musik passieren. Groß! :)
Emil

4

Musique Beton mit Python

Ich habe heute nicht viel Zeit, aber ich wollte eine Antwort bekommen. Das Genre ist eine Ausrede dafür, nicht wie irgendetwas zu klingen. Vielleicht ein Soundeffekt in einem Videospiel?

BFIN10=r"print('BFIN10=r\"'+BFIN10+'\"'+'\nexec(BFIN10)')"
exec(BFIN10)

Klingt eigentlich gar nicht so schlecht!
Claudiu

Jedes Yoko Ono Album aller Zeiten
William Barbosa

4

C

int(printf)(char*,...); (main)(){char*b=",*",i=(34),*m=("int(printf)(char*,...); (main)(){char*b="),
*z="%s%c%s%c,i=(34),*m=(%c%s%c)%sz=%c%s%c,*B=%c%s%c,*f=(%c%s%c)%s(/*)*/%s/*(*/);}//(+++fim)",*B="(f,
i,m,z),(i,z,m),(m,i),(f,b),(m,i),(m,i),(f,z,m),(m,i),(f,z,b),(m,i),(b,z),(B,i),(38,i),(29,B),(26,i),
(26,i),(B,f),(42,i),(i,m,f),B",*f=(";(printf)");(printf)(/*)*/(f,i,m,z),(i,z,m),(m,i),(f,b),(m,i),(m
,i),(f,z,m),(m,i),(f,z,b),(m,i),(b,z),(B,i),(38,i),(29,B),(26,i),(26,i),(B,f),(42,i),(i,m,f),B/*(*/)
;}//(+++fim)

Zeilenumbrüche nur zu Präsentationszwecken; Dies ist nur eine Quine (und erfüllt nur die Längenanforderungen), wenn Zeilenumbrüche entfernt werden.

Die printf-Deklaration wurde zum Kompilieren benötigt (printf). /*(*/und /*)*/wurden verwendet, um Klammern im Code abzugleichen, während eine Mischung aus Klammern und dem Komma-Operator verwendet wurde, um Akkorde aus den printfParametern zu bilden .

Bearbeiten: Verkürzt, um den Größenanforderungen zu entsprechen und das Stück ein bisschen schneller zu machen.

Das klingt am besten auf dem Klavier.


2
Ich mag das! Es fängt ein bisschen langsam an, aber alles ab Token 130 ist mächtig quälend. Du hast die Schreierei zu deinem Vorteil genutzt.
Calvins Hobbys

Dieser könnte als Fantasy for Orchestra durchgehen! : P
Soham Chowdhury

2
Ich mochte die alte Version besser, aber das ist immer noch mein Lieblingslied hier. Ich versuche dir das Kopfgeld zu geben, aber aus irgendeinem Grund funktioniert das nicht. Siehe meta: meta.codegolf.stackexchange.com/questions/2263/…
Calvins Hobbys

3

Planen

Das mag nicht besonders melodisch sein (eigentlich hört es sich so an, als hätte jemand ein totes Schwein in einen Baby-Grand geworfen), aber es ist zumindest ein kurzes Musikstück. Es wäre schwierig, irgendetwas länger oder weniger totenschweinartig im Schema zu machen.

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))

1
Oh, meine Ohren ...
Claudiu

2

Für Golfscript

":H;GHGHCFDA;[34]H+2*{-};":H;GHGHCFDA;[34]H+2*{-};

Dies entspricht dem Buchstaben der Regel, nach der keine drei aufeinanderfolgenden Buchstaben entfernt werden, obwohl dies nicht die Absicht ist, wie ich erfahre.


1

Cobra / Batch

@number float# 2>nul||@echo off
/# 2>nul
for /f "delims=" %%a in (%0) do echo %%a
#/# 2>nul
class P# 2>nul
    def main# 2>nul
        r="# 2>nul"# 2>nul
        s="@number float{3}||@echo off{2}/{3}{2}for /f {1}delims={1} %%a in (%0) do echo %%a{2}#/{3}{2}class P{3}{2}    def main{3}{2}      r={1}{3}{1}{3}{2}       s={1}{0}{1}{3}{2}       Console.write(s,s,34to char,10to char){3}"# 2>nul
        Console.write(s,s,34to char,10to char,r)# 2>nul

Technisch gesehen kein Quine in Batch (es liest seine eigene Quelle). Es ist jedoch eine Quine in Cobra.

Mit dem Piano-Modus klingt es am besten, ähnlich wie mit Geister-Musik aus einem Videospiel der Super Mario World-Ära.


1

Pyth

J"+K+N+J+N+\K+N+K+NJ"K"J"+K+N+J+N+\K+N+K+NJ

Am besten mit der vierten Einstellung (Betrag + und - Wechselintervall) bei ca. 20 spielen, Pause bei Standardeinstellungen. Klingt am besten auf dem Klavier.


0

Haskell

(Ich bin nicht sicher, ob der Variablenname die letzte Regel verletzt.)

main=putStr$  jjlmjiebab ++ {--} show jjlmjiebab;jjlmjiebab = "main=putStr$  jjlmjiebab ++ {--} show jjlmjiebab;jjlmjiebab = "

Am besten auf einem Klavier mit einer Notendauer von 1000 Millisekunden und einem Notenintervall von 250 Millisekunden mit den Standardwerten + und - spielen.

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.