标准钢琴上有88个键,可打印 95个ascii字符(十六进制代码20至7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(“字符”是指此后的任何可打印ASCII字符)
在此JSFiddle中,我利用了这一点,并制作了一个简单的语法,该语法使用AudioSynth生成钢琴音乐。(如果有人可以引导我获得一组可链接的真实钢琴音,我将不胜感激。)
输入字符串中的每个字符还() 01+-
对应一个钢琴键:
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
,使用您可以在JSFiddle中看到的预设定时参数演奏Mary Lad Lamb的前7个音符。
空格()表示音乐休止符,持续一个音符间隔。因此
RPNPRRR PPP RUU
演奏玛丽小羊羔的前13个音符,并在适当的位置休息。
如果除以外的任何字符()01
以0
s和1
s(regex [01]+
)序列作为前缀,则将该序列读取为二进制数b,并且该字符被其自身的b个副本替换。之所以这样,101A11 10+1-0B01C
是AAAAA ++-C
因为101
= 5 11
= 3,依此类推。(字符串末尾的0
s和1
s 序列无效。)
匹配的括号(()
)有两个用途:
- 如果其内容不与序列结束
0
的和1
的,所有的笔记都在同一时间为和弦(否则是不超过一个音符不同)播放。所以(NQU)
是一个C小调和弦上倍频4.
如果有相同的音符都存在他们的声音也被复制。所以(NN)
和(NNN)
声音不同。 - 如果它们的内容确实以
0
“”和1
“”的序列结尾,则将该序列读为二进制数b,并且括号和其内容被内容的b个副本替换。因此(NQU11)
成为9个单独的注释:NQUNQUNQU
。
括号详细信息:
- 嵌套复制括号(目的2)是细:
(N(QU10)11)
→交通(NQUQU11)
→交通NQUQUNQUQUNQUQU
。 - 嵌套非复制括号(用途1)很好,但没有效果:
(A((+)C))
与相同(A+C)
。 - 您也可以将两者结合起来:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
。 - 在非复制括号之前的一系列
0
“和1
”重复它们的方式与重复单个字符的方式相同。如此10(NQU)
成为(NQU)(NQU)
。 - 复制括号之前的序列
0
和1
无效。 (
必须始终具有匹配项)
,但反之亦然:例如N)
,有效。
加号(+
)和减号(-
)分别根据其上下文增加或减少音符的持续时间或音符之间的时间间隔:
- 当内部非复制括号,它们立即提高或毫秒(见的一些预设数量减少音符持续时间可变的jsfiddle)。因此,
(++)N
播放N
时间会比平常更长。 - 当在非复制括号之外时,它们将下一个音符的开头与之后的音符之间的间隔(以及每个后续间隔)增加或减小一些预设的毫秒数。因此,在
++NP
该之间的间隔N
和P
比平常更长的时间。
音符的持续时间及其之间的时间间隔不能低于0。
挑战
我故意选择() 01+-
作为7个特殊字符,因为它们可以在许多编程语言的许多上下文中无害地放置。
您的任务是编写一个512字节或更小的quine,当将代码本身用作JSFiddle中的输入字符串时,它会产生最佳的音调。
您可以为4个间隔/持续时间参数选择任何初始值(非负整数),但是您的音乐持续时间不得超过10分钟。您还应该告诉我们您的音乐在特定乐器中听起来是否最好。
规则
- 您的代码中仅允许使用制表符,换行符和可打印的ASCII码。曲调创建者将忽略所有不可打印的ASCII。
- 输出可能会转到文件或标准输出或最接近的替代文件(例如JS警报)。没有输入。
- 没有阅读源代码。它必须是真正的奎因。
- 删除任何3个连续的源字符都必须使该程序不再充当quine。这是为了确保人们不会在字符串中写出好歌,而只有很小的奎因部分可以输出。
- 所以,如果你的程序是
MYCODE
,然后MYC
,MYE
,MDE
,并且ODE
都应该不基内斯(他们可能会出错或输出别的东西)。
- 所以,如果你的程序是
这是一场人气竞赛,投票获得最高的答案。
更新:放宽最后一条规则。