Existem 88 teclas em um piano padrão e 95 caracteres ascii imprimíveis (códigos hexadecimais 20 a 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
('caractere' refere-se a qualquer caractere ASCII imprimível a partir de agora)
Em deste jsFiddle eu tomei vantagem disso e fez uma sintaxe simples que gera melodias de piano usando AudioSynth . (Se alguém puder me direcionar para um conjunto vinculável de sons reais de notas de piano, ficarei grato.)
Cada caractere na sequência de entrada () 01+-
corresponde a uma tecla do piano:
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
Assim, RPNPRRR
reproduz os primeiros 7 notas de Mary Had a Little Lamb utilizando os parâmetros predefinidos que você pode ver na jsFiddle.
Espaço ( ) representa um descanso musical que dura um intervalo de uma nota.
RPNPRRR PPP RUU
Toca assim as primeiras 13 notas de Mary Had a Little Lamb com descansos em seus devidos lugares.
Se qualquer caractere adicional ()01
for prefixado por uma sequência de 0
's 1
' (regex [01]+
), essa sequência será lida como um número binário b , e o caractere será substituído por b cópias de si mesmo. Assim, 101A11 10+1-0B01C
torna-se AAAAA ++-C
pois 101
= 5, 11
= 3, etc. (Uma sequência de 0
's e 1
' s no final da cadeia de caracteres tem nenhum efeito).
Parênteses correspondentes ( ()
) têm duas finalidades:
- Se o conteúdo deles não terminar com uma sequência de
0
'e1
', todas as notas serão tocadas ao mesmo tempo que um acorde (que, caso contrário, não será diferente de uma nota). O mesmo(NQU)
ocorre com um acorde C menor na oitava 4.
Se houver notas duplicadas, o som também será duplicado. Então,(NN)
e(NNN)
soa diferente. - Se o seu conteúdo faz final com uma sequência de
0
's e1
' s, essa sequência é lido como um número binário b , e os parênteses e o seu conteúdo são substituídos com b cópias do conteúdo. Assim,(NQU11)
torna-se 9 notas individuais:NQUNQUNQU
.
Detalhes dos parênteses:
- Aninhar parênteses de replicação (finalidade 2) é bom:
(N(QU10)11)
→(NQUQU11)
→NQUQUNQUQUNQUQU
. - Aninhar parênteses não replicantes (finalidade 1) é bom, mas não tem efeito:
(A((+)C))
é o mesmo que(A+C)
. - Você também pode combinar os dois:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
. - Uma sequência de
0
'e1
' antes de parênteses não replicantes os repete da mesma maneira que caracteres individuais são repetidos. Assim10(NQU)
se torna(NQU)(NQU)
. - Uma sequência de
0
'e1
' antes de replicar parênteses não tem efeito. (
deve sempre ter uma correspondência)
, mas não vice-versa: por exemplo,N)
é válido.
Mais ( +
) e menos ( -
) aumentam e diminuem respectivamente a duração das notas ou o intervalo de tempo entre as notas, dependendo do seu contexto:
- Quando no interior de nao reprodução parênteses, eles imediatamente aumentar ou diminuir a duração variável nota por algum número pré-definido de milissegundos (ver jsFiddle ). Então,
(++)N
vai jogarN
em uma duração mais longa do que o normal. - Quando estão fora dos parênteses não replicantes, eles aumentam ou diminuem o intervalo entre o início da próxima nota e a nota após (e cada intervalo subsequente) em um número predefinido de milissegundos. Portanto, no
++NP
intervalo entreN
eP
é maior que o normal.
A duração das notas e o intervalo de tempo entre elas não podem cair abaixo de 0.
Desafio
Eu escolhi intencionalmente () 01+-
os 7 caracteres especiais porque eles podem ser colocados inocentemente em muitos contextos em muitas linguagens de programação.
Sua tarefa é escrever um quine em 512 bytes ou menos que produza a melhor melodia quando o próprio código é usado como a string de entrada no JSFiddle .
Você pode escolher qualquer valor inicial (números inteiros não negativos) para os 4 parâmetros de intervalo / duração, mas sua música não deve durar mais que 10 minutos. Você também deve nos dizer se a sua música soa melhor em um instrumento específico.
Regras
- Somente guias, novas linhas e ASCII imprimível são permitidas no seu código. Todo ASCII não imprimível é ignorado pelo criador da melodia.
- A saída pode ir para um arquivo ou stdout ou a alternativa mais próxima (por exemplo, alerta JS). Não há entrada.
- Nenhuma leitura do código fonte. Deve ser uma verdadeira solução.
- A remoção de quaisquer três caracteres de origem contíguos deve fazer com que o programa não funcione mais como um quine. Isso é para garantir que as pessoas não escrevam uma boa música em uma string e que tenham uma pequena porção de quine para produzi-la.
- Então, se o seu programa foi
MYCODE
, em seguidaMYC
,MYE
,MDE
eODE
todos devem não ser quines (eles podem erro ou saída de qualquer outra coisa).
- Então, se o seu programa foi
Este é um concurso de popularidade, com a resposta mais votada.
Atualização: última regra relaxada.