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
RPNPRRR
Odtwarza 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 RUU
gra 13 pierwszych nut Mary Had a Little Lamb z odpoczynkami w odpowiednich miejscach.
Jeśli jakikolwiek inny znak ()01
jest 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-0B01C
Staje się tak, AAAAA ++-C
ponieważ 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 ).
(++)N
Będzie więc grałN
dł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
++NP
odstępie międzyN
iP
jest 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ł
MYCODE
wtedyMYC
,MYE
,MDE
, iODE
powinny 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.