Hay 88 teclas en un piano estándar y 95 caracteres ascii imprimibles (códigos hexadecimales 20 a 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
('carácter' se refiere a cualquier carácter ASCII imprimible de aquí en adelante)
En este JSFiddle , aproveché eso e hice una sintaxis simple que genera melodías de piano usando AudioSynth . (Si alguien puede dirigirme a un conjunto enlazable de sonidos de notas de piano reales , lo agradeceré).
Cada carácter en la cadena de entrada además () 01+-
corresponde a una tecla de 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
Entonces RPNPRRR
toca las primeras 7 notas de Mary Had a Little Lamb usando los parámetros de tiempo preestablecidos que puedes ver en el JSFiddle.
El espacio ( ) representa un descanso musical que dura un intervalo de nota. Entonces
RPNPRRR PPP RUU
toca las primeras 13 notas de Mary Had a Little Lamb con restos en sus lugares apropiados.
Si cualquier carácter además ()01
está prefijado por una secuencia de 0
'sy 1
' s (expresión regular [01]+
), esa secuencia se lee como un número binario b , y el carácter se reemplaza con b copias de sí mismo. Entonces se 101A11 10+1-0B01C
vuelve AAAAA ++-C
porque 101
= 5, 11
= 3, etc. (Una secuencia de 0
'sy 1
' s al final de la cadena no tiene ningún efecto).
Los paréntesis coincidentes ( ()
) tienen dos propósitos:
- Si su contenido no termina con una secuencia de
0
'sy1
', todas las notas se tocan al mismo tiempo que un acorde (que de lo contrario no es diferente a una nota). Entonces,(NQU)
es un acorde de Do menor en la octava 4.
Si hay notas duplicadas, su sonido también se duplica. Así(NN)
y(NNN)
suena diferente. - Si su contenido hace extremo con una secuencia de
0
's y1
' s, esa secuencia se lee como un número binario b , y los paréntesis y su contenido son reemplazados con b copias del contenido. Así(NQU11)
se convierte en 9 notas individuales:NQUNQUNQU
.
Detalles de paréntesis:
- Anidar paréntesis de replicación (propósito 2) está bien:
(N(QU10)11)
→(NQUQU11)
→NQUQUNQUQUNQUQU
. - Anidar paréntesis no replicantes (propósito 1) está bien pero no tiene ningún efecto:
(A((+)C))
es lo mismo que(A+C)
. - También puede combinar ambos:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
. - Una secuencia de
0
'sy1
' antes de los paréntesis no replicantes los repite de la misma manera que se repiten los caracteres individuales. Así se10(NQU)
convierte(NQU)(NQU)
. - Una secuencia de
0
'sy1
' antes de replicar paréntesis no tiene ningún efecto. (
siempre debe tener una coincidencia)
, pero no al revés: por ejemplo,N)
es válido.
Más ( +
) y menos ( -
) aumentan y disminuyen respectivamente la duración de las notas o el intervalo de tiempo entre las notas, según su contexto:
- Cuando están dentro de paréntesis que no se replican, aumentan o disminuyen inmediatamente la variable de duración de la nota en un número predeterminado de milisegundos (ver JSFiddle ). Por
(++)N
lo tanto , jugaráN
a una duración más larga de lo normal. - Cuando se encuentran fuera del paréntesis no replicativo, aumentan o disminuyen el intervalo entre el inicio de la siguiente nota y la nota siguiente (y cada intervalo posterior) en un número predeterminado de milisegundos. Entonces, en
++NP
el intervalo entre elN
yP
es más largo de lo habitual.
La duración de las notas y el intervalo de tiempo entre ellas no puede caer por debajo de 0.
Reto
Elegí intencionalmente () 01+-
ser los 7 caracteres especiales porque se pueden colocar de forma inocuo en muchos contextos en muchos lenguajes de programación.
Su tarea es escribir una quine en 512 bytes o menos que produzca la mejor melodía de sonido cuando el código en sí se utiliza como la cadena de entrada en el JSFiddle .
Puede elegir cualquier valor inicial (enteros no negativos) para los 4 parámetros de intervalo / duración, pero su melodía no debe durar más de 10 minutos. También debe decirnos si su melodía suena mejor en un instrumento en particular.
Reglas
- Solo se permiten pestañas, líneas nuevas y ASCII imprimible en su código. El creador de melodías ignora todos los ASCII no imprimibles.
- La salida puede ir a un archivo o stdout o la alternativa más cercana (por ejemplo, alerta JS). No hay entrada
- Sin lectura del código fuente. Debe ser una verdadera quine.
- La eliminación de los 3 caracteres de origen contiguos debe hacer que el programa ya no funcione como una quine. Esto es para garantizar que las personas no escriban una buena canción en una cadena y luego tengan una pequeña porción de quine para emitirla.
- Así que si su programa era
MYCODE
entoncesMYC
,MYE
,MDE
, yODE
todos deben ser quines no (pueden error o una salida de otra cosa).
- Así que si su programa era
Este es un concurso de popularidad, gana la respuesta más votada.
Actualización: última regla relajada.