ASCII钢琴上的音乐弦


22

标准钢琴上有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个音符,并在适当的位置休息。

如果除以外的任何字符()010s和1s(regex [01]+)序列作为前缀,则将该序列读取为二进制数b,并且该字符被其自身的b个副本替换。之所以这样,101A11 10+1-0B01CAAAAA ++-C因为101= 5 11= 3,依此类推。(字符串末尾的0s和1s 序列无效。)

匹配的括号(())有两个用途:

  1. 如果其内容与序列结束0的和1的,所有的笔记都在同一时间为和弦(否则是不超过一个音符不同)播放。所以(NQU)是一个C小调和弦上倍频4.
    如果有相同的音符都存在他们的声音也被复制。所以(NN)(NNN)声音不同。
  2. 如果它们的内容确实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)
  • 复制括号之前的序列01无效。
  • (必须始终具有匹配项),但反之亦然:例如N),有效。

加号(+)和减号(-)分别根据其上下文增加或减少音符的持续时间音符之间的时间间隔:

  • 内部非复制括号,它们立即提高或毫秒(见的一些预设数量减少音符持续时间可变的jsfiddle)。因此,(++)N播放N时间会比平常更长。
  • 非复制括号之外时,它们将下一个音符的开头与之后的音符之间的间隔(以及每个后续间隔)增加或减小一些预设的毫秒数。因此,在++NP该之间的间隔NP比平常更长的时间。

音符的持续时间及其之间的时间间隔不能低于0。

挑战

我故意选择() 01+-作为7个特殊字符,因为它们可以在许多编程语言的许多上下文中无害地放置。

您的任务是编写一个512字节或更小的quine,当将代码本身用作JSFiddle中的输入字符串时,它会产生最佳的音调

您可以为4个间隔/持续时间参数选择任何初始值(非负整数),但是您的音乐持续时间不得超过10分钟。您还应该告诉我们您的音乐在特定乐器中听起来是否最好。

规则

  • 您的代码中仅允许使用制表符,换行符和可打印的ASCII码。曲调创建者将忽略所有不可打印的ASCII。
  • 输出可能会转到文件或标准输出或最接近的替代文件(例如JS警报)。没有输入。
  • 没有阅读源代码。它必须是真正的奎因。
  • 删除任何3个连续的源字符都必须使该程序不再充当quine。这是为了确保人们不会在字符串中写出好歌,而只有很小的奎因部分可以输出。
    • 所以,如果你的程序是MYCODE,然后MYCMYEMDE,并且ODE都应该不基内斯(他们可能会出错或输出别的东西)。

这是一场人气竞赛,投票获得最高的答案。

更新:放宽最后一条规则。


3
您也可以在电话键盘上玩“小羊羔玛丽”游戏:3212333 222 399(尝试一下,效果非常好。)
Level River St

有很多免费的钢琴音色。另外,不错的JSFiddle!
qwr 2014年

我认为,我从来没有见过任何挑战中的最后一条规则,可以达到预期的效果。
justhalf 2014年

@qwr您是否知道可以以这种方式直接链接的所有88个键中的任何一组?我看了一下,但找不到。
卡尔文的爱好2014年

Answers:


6

C

我决定我喜欢轰隆隆的噪音由该串产生的低/**/这是不那么巧合的方式来打开和C.紧密评论仅其他有趣这里的一点是,34对于"被替换35-1(在结束1 故意)以避免令人讨厌的和弦。我还试图使结尾听起来很生动。我真的做到了 我打算稍后进行编辑以使其听起来更好。

/**/char*p= "/**/char*p= %c%s%c; int main(){printf(p,34,p,35-1);p++;/**/}/**/";
int main(){printf(p,34,p,35-1);p++;/**/}/**/

就我对规则的理解而言,带注释的部分仍会通过最终规则,因为将其删除会导致失败的quine。


3
“我打算稍后进行编辑,以使其听起来更好一些。” 已经快一年了。我开始认为您以后将不会对其进行编辑以使其听起来更好。:P
Alex A.

@AlexA。一年多了!
wizzwizz4 2015年

5

Ĵ

是的,我想您可以猜测会如何进行。

在没有括号的情况下,很难在J中完成任何出色的工作,并且由于您很少以0和1结束它们,因此大多数情况听起来像是有人同时坐在键盘的上下两半。我尽力了,我会让你知道。

我认为这是钢琴的时髦基准。我真的不知道作文的第一件事,我只是抓了一根提子,然后把数字绕了一下。

(23 23,~,~i.124+-100){,'(23 23,~,~i.124+-100){,'''

而且,只是为了好玩,以EDM形式玩这首歌。我称之为Japhex Twin

".s=:'''".s=:'',''''''''&,@(,&'''''''')@(#~>:@(=&''''''''))s'

您可以在tryj.tk上确认这些精美的代码片段的精髓


1
这实际上可以传递音乐。大!:)
Emil

4

Musique Concrete与Python

我今天没有很多时间,但是我想得到一个答案。这种类型是没有听起来像什么的借口。也许在电子游戏中有声音效果?

BFIN10=r"print('BFIN10=r\"'+BFIN10+'\"'+'\nexec(BFIN10)')"
exec(BFIN10)

其实听起来还不错!
Claudiu 2014年

每小野洋子的一张专辑
威廉·巴博萨

4

C

int(printf)(char*,...); (main)(){char*b=",*",i=(34),*m=("int(printf)(char*,...); (main)(){char*b="),
*z="%s%c%s%c,i=(34),*m=(%c%s%c)%sz=%c%s%c,*B=%c%s%c,*f=(%c%s%c)%s(/*)*/%s/*(*/);}//(+++fim)",*B="(f,
i,m,z),(i,z,m),(m,i),(f,b),(m,i),(m,i),(f,z,m),(m,i),(f,z,b),(m,i),(b,z),(B,i),(38,i),(29,B),(26,i),
(26,i),(B,f),(42,i),(i,m,f),B",*f=(";(printf)");(printf)(/*)*/(f,i,m,z),(i,z,m),(m,i),(f,b),(m,i),(m
,i),(f,z,m),(m,i),(f,z,b),(m,i),(b,z),(B,i),(38,i),(29,B),(26,i),(26,i),(B,f),(42,i),(i,m,f),B/*(*/)
;}//(+++fim)

以换行符分隔仅用于演示目的;如果删除了换行符,这只是一个quine(并且仅满足长度要求)。

需要printf声明进行编译(printf)/*(*//*)*/用来匹配代码中的括号,而括号和逗号运算符的混合用于根据printf参数形成和弦。

编辑:缩短以适合尺寸要求,并使作品更快一些。

这在钢琴上听起来最好。


2
我喜欢!它从缓慢开始,但是从令牌130开始的所有东西都在强大地困扰着。您使用了刺耳的技巧,以获取优势。
加尔文的爱好2014年

这个可以通过幻想乐队!:P
Soham Chowdhury 2014年

2
我更喜欢旧版本,但这仍然是我最喜欢的歌曲。我正试图给您赏金,但由于某种原因,该行不通。参见meta:meta.codegolf.stackexchange.com/questions/2263/…–
卡尔文的爱好

3

方案

这可能不是特别旋律(实际上听起来像是有人把一头死猪扔进了婴儿床),但至少是一小段音乐。很难使方案中的任何东西变得更长或更短。

((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))

1
哎哟,我的耳朵......
克劳迪乌

2

毛皮Golfscript

":H;GHGHCFDA;[34]H+2*{-};":H;GHGHCFDA;[34]H+2*{-};

这满足了不连续删除三个字母规则的要求,尽管我不是故意的。


1

眼镜蛇/批次

@number float# 2>nul||@echo off
/# 2>nul
for /f "delims=" %%a in (%0) do echo %%a
#/# 2>nul
class P# 2>nul
    def main# 2>nul
        r="# 2>nul"# 2>nul
        s="@number float{3}||@echo off{2}/{3}{2}for /f {1}delims={1} %%a in (%0) do echo %%a{2}#/{3}{2}class P{3}{2}    def main{3}{2}      r={1}{3}{1}{3}{2}       s={1}{0}{1}{3}{2}       Console.write(s,s,34to char,10to char){3}"# 2>nul
        Console.write(s,s,34to char,10to char,r)# 2>nul

从技术上讲,它不是成批的奎因(它是自己读取的)。但是,它在眼镜蛇中是一个奎因。

在钢琴模式下,声音听起来最好,有点像超级马里奥世界时代电子游戏中的幽灵级音乐。


1

腐霉菌

J"+K+N+J+N+\K+N+K+NJ"K"J"+K+N+J+N+\K+N+K+NJ

最好在第四个设置(+和-更改间隔)大约为20时播放,默认情况下保持静止。在钢琴上听起来最好。


0

哈斯克尔

(我不确定变量名称是否违反最后一条规则。)

main=putStr$  jjlmjiebab ++ {--} show jjlmjiebab;jjlmjiebab = "main=putStr$  jjlmjiebab ++ {--} show jjlmjiebab;jjlmjiebab = "

最好在钢琴上以1000毫秒的音符持续时间和250毫秒的音符间隔以及标准的+和-值弹奏。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.