Na standardowym pianinie jest 88 klawiszy i 95 znaków ascii do wydrukowania (kody szesnastkowe od 20 do 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(„znak” odnosi się do dowolnego znaku ASCII do wydruku odtąd)
W tym JSFiddle skorzystałem z tego i stworzyłem prostą składnię, która generuje melodie fortepianowe przy użyciu AudioSynth . (Jeśli ktoś może skierować mnie do możliwego do połączenia zestawu prawdziwych dźwięków fortepianu, będę wdzięczny).
Oprócz każdego znaku w ciągu wejściowym () 01+-odpowiada jeden klawisz fortepianu:
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
RPNPRRROdtwarza więc pierwsze 7 nut Mary Had a Little Lamb przy użyciu wstępnie ustawionych parametrów taktowania, które można zobaczyć w JSFiddle.
Spacja ( ) reprezentuje pauzę muzyczną, która trwa jeden interwał nut. Tak więc RPNPRRR PPP RUUgra 13 pierwszych nut Mary Had a Little Lamb z odpoczynkami w odpowiednich miejscach.
Jeśli jakikolwiek inny znak ()01jest poprzedzony sekwencją 0„i 1” (regex [01]+), sekwencja ta jest odczytywana jako liczba binarna b , a znak jest zastępowany przez b jego kopii. 101A11 10+1-0B01CStaje się tak, AAAAA ++-Cponieważ 101= 5, 11= 3 itd. (Sekwencja 0„i 1” na końcu ciągu nie ma żadnego efektu.)
Dopasowane nawiasy ( ()) służą dwóm celom:
- Jeśli ich treść nie kończy się sekwencją
0„i1”, wszystkie nuty są odtwarzane w tym samym czasie co akord (który inaczej nie różni się niczym od nuty). Podobnie(NQU)jest akord c-moll w oktawie 4.
Jeśli występują zduplikowane nuty, ich dźwięk również jest powielany. Więc(NN)i(NNN)dźwięk inaczej. - Jeżeli zawartość nie koniec z serią
0„s i1” s, że sekwencja jest odczytywane jako liczba binarna b i nawiasów i ich treści są zastępowane b kopii zawartości. Tak więc(NQU11)staje się 9 poszczególne nuty:NQUNQUNQU.
Szczegóły nawiasów:
- Zagnieżdżanie nawiasów replikacyjnych (cel 2) jest w porządku:
(N(QU10)11)→(NQUQU11)→NQUQUNQUQUNQUQU. - Zagnieżdżanie niereplikujących się nawiasów (cel 1) jest w porządku, ale nie ma efektu:
(A((+)C))jest taki sam jak(A+C). - Możesz także łączyć oba:
((N(QU10))11)→(NQUQU)(NQUQU)(NQUQU). - Sekwencja
0„i1” przed niereplikującymi się nawiasami powtarza je w taki sam sposób, jak powtarzane są poszczególne znaki. Tak się10(NQU)staje(NQU)(NQU). - Sekwencja
0„i1” przed replikacją nawiasów nie ma żadnego efektu. (musi zawsze mieć pasujące), ale nie odwrotnie: np.N)jest poprawny.
Plus ( +) i minus ( -) odpowiednio zwiększają i zmniejszają czas trwania nut lub odstęp czasu między nutami, w zależności od ich kontekstu:
- Gdy znajdują się w nawiasach niereplikujących się , natychmiast zwiększają lub zmniejszają zmienną czas trwania nuty o określoną liczbę milisekund (patrz JSFiddle ).
(++)NBędzie więc grałNdłużej niż zwykle. - Gdy znajdują się poza niereplikującymi się nawiasami, zwiększają lub zmniejszają odstęp między początkiem następnej nuty i nuty po niej (i każdym kolejnym interwale) o określoną liczbę milisekund. Więc w
++NPodstępie międzyNiPjest dłuższy niż zwykle.
Czas trwania notatek i odstęp czasu między nimi nie mogą spaść poniżej 0.
Wyzwanie
Celowo wybrałem () 01+-7 znaków specjalnych, ponieważ mogą być one niewinnie umieszczane w wielu kontekstach w wielu językach programowania.
Twoim zadaniem jest napisanie quinu w 512 bajtach lub mniej, który zapewnia najlepszą melodię, gdy sam kod jest używany jako ciąg wejściowy w JSFiddle .
Możesz wybrać dowolne wartości początkowe (nieujemne liczby całkowite) dla 4 parametrów przedziału / czasu trwania, ale melodia nie może trwać dłużej niż 10 minut. Powinieneś także powiedzieć nam, czy Twoja melodia najlepiej brzmi w danym instrumencie.
Zasady
- W kodzie dozwolone są tylko tabulatory, znaki nowego wiersza i ASCII do wydruku. Wszystkie niedrukowalne ASCII są ignorowane przez twórcę melodii.
- Dane wyjściowe mogą przejść do pliku lub standardowego wyjścia lub najbliższej alternatywy (np. Alert JS). Brak danych wejściowych.
- Brak odczytu kodu źródłowego. To musi być prawdziwy quine.
- Usunięcie 3 ciągłych znaków źródłowych musi spowodować, że program przestanie działać jako quine. Ma to na celu zapewnienie, że ludzie nie piszą dobrej piosenki w łańcuchu, a następnie mają niewielką część quine do jej wydania.
- Więc jeśli program był
MYCODEwtedyMYC,MYE,MDE, iODEpowinny być quines (mogą błędu lub coś innego wyjścia).
- Więc jeśli program był
To konkurs popularności, wygrywa najlepiej głosowana odpowiedź.
Aktualizacja: Zrelaksowana ostatnia reguła.