Il y a 88 touches sur un piano standard et 95 caractères ascii imprimables (codes hexadécimaux 20 à 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
('caractère' fait référence à tout caractère ASCII imprimable à partir d'ici)
Dans ce JSFiddle, j'ai profité de cela et créé une syntaxe simple qui génère des morceaux de piano à l'aide d' AudioSynth . (Si quelqu'un peut me diriger vers un ensemble liable de réel sons de notes de piano , je serai reconnaissant.)
Chaque caractère de la chaîne d'entrée () 01+-
correspond en outre à une touche 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
RPNPRRR
Joue donc les 7 premières notes de Mary Had a Little Lamb en utilisant les paramètres de timing prédéfinis que vous pouvez voir dans le JSFiddle.
L'espace ( ) représente un repos musical qui dure pendant un intervalle de note.
RPNPRRR PPP RUU
Joue donc les 13 premières notes de Mary Had a Little Lamb avec des restes à leur place.
Si un caractère en plus ()01
est préfixé par une séquence de 0
'et 1
' (regex [01]+
), cette séquence est lue comme un nombre binaire b , et le caractère est remplacé par b copies de lui-même. Devient 101A11 10+1-0B01C
ainsi AAAAA ++-C
parce que 101
= 5, 11
= 3, etc. (Une séquence de 0
'et 1
' à la fin de la chaîne n'a aucun effet.)
Les parenthèses appariées ( ()
) remplissent deux fonctions:
- Si leur contenu ne se termine pas par une séquence de
0
'et1
', toutes les notes sont jouées en même temps qu'un accord (qui autrement n'est pas différent d'une note). Il en(NQU)
va de même d'un accord en do mineur sur l'octave 4.
Si des notes en double sont présentes, leur son est également dupliqué. Donc(NN)
et(NNN)
sonner différemment. - Si leur contenu ne fin avec une séquence de
0
« s et1
d », cette séquence est lue comme un nombre binaire b , et les parenthèses et leur contenu sont remplacés par b copies du contenu. Donc ,(NQU11)
devient 9 notes individuelles:NQUNQUNQU
.
Détails entre parenthèses:
- L'imbrication des répliques de parenthèses (objectif 2) est correcte:
(N(QU10)11)
→(NQUQU11)
→NQUQUNQUQUNQUQU
. - L'imbrication de parenthèses non réplicatives (objectif 1) est correcte mais n'a aucun effet:
(A((+)C))
est identique à(A+C)
. - Vous pouvez également combiner les deux:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
. - Une séquence de
0
«et1
» avant les parenthèses non réplicables les répète de la même manière que les caractères individuels sont répétés. Ainsi10(NQU)
devient(NQU)(NQU)
. - Une séquence de
0
«et1
» avant de répliquer les parenthèses n'a aucun effet. (
doit toujours avoir une correspondance)
, mais pas l'inverse: par exempleN)
est valide.
Plus ( +
) et moins ( -
) augmentent et diminuent respectivement la durée des notes ou l'intervalle de temps entre les notes, selon leur contexte:
- À l' intérieur de parenthèses non réplicatives, elles augmentent ou diminuent immédiatement la variable de durée de note d'un certain nombre de millisecondes prédéfini (voir JSFiddle ). Alors ,
(++)N
va jouerN
à une durée plus longue que la normale. - En dehors des parenthèses non réplicatives, elles augmentent ou diminuent l'intervalle entre le début de la note suivante et la note qui la suit (et chaque intervalle suivant) d'un certain nombre prédéfini de millisecondes. Donc, dans
++NP
l'intervalle entre leN
etP
est plus long que d'habitude.
La durée des notes et l'intervalle de temps entre elles ne peuvent pas descendre en dessous de 0.
Défi
J'ai intentionnellement choisi () 01+-
d'être les 7 caractères spéciaux car ils peuvent être placés de manière inoffensive dans de nombreux contextes dans de nombreux langages de programmation.
Votre tâche consiste à écrire un quine en 512 octets ou moins qui produit la meilleure mélodie sonore lorsque le code lui-même est utilisé comme chaîne d'entrée dans le JSFiddle .
Vous pouvez choisir toutes les valeurs initiales (entiers non négatifs) pour les 4 paramètres d'intervalle / durée, mais votre morceau ne doit pas durer plus de 10 minutes. Vous devriez également nous dire si votre morceau sonne le mieux dans un instrument particulier.
Règles
- Seuls les onglets, les nouvelles lignes et les caractères ASCII imprimables sont autorisés dans votre code. Tout ASCII non imprimable est ignoré par le créateur de la mélodie.
- La sortie peut aller vers un fichier ou une sortie standard ou l'alternative la plus proche (par exemple, alerte JS). Il n'y a aucune entrée.
- Pas de lecture du code source. Ce doit être une vraie quine.
- La suppression de 3 caractères source contigus doit faire en sorte que le programme ne fonctionne plus comme un quine. C'est pour s'assurer que les gens n'écrivent pas une bonne chanson dans une chaîne, puis qu'ils ont une petite portion de quine pour la sortir.
- Donc , si votre programme était
MYCODE
alorsMYC
,MYE
,MDE
etODE
devrait ne pas être tout Quines (ils peuvent erreur ou quelque chose de sortie autre).
- Donc , si votre programme était
Il s'agit d'un concours de popularité, la réponse la plus votée l'emporte.
Mise à jour: dernière règle détendue.