播放一些Pachelbel的佳能


29

将以下Pachelbel佳能的摘录输出为D音频:

Pachelbel的D佳能

规则

  • 可以使用任何格式/编码,只要在创建此挑战之前已存在编解码器
  • 可以使用任何乐器(真实乐器,MIDI合成等)
  • 速度必须为65 BPM(如活页乐谱中所述)-如果您无法获得准确的65 BPM,则可以使用64.75-65.25(含)范围内的任何速度
  • 乐谱在音乐会上
  • 必须使用相等的气质调整(特别是12-ET,A4 = 440 Hz)

作为参考,下面是一个摘录的堆栈片段:


这段代码从其他地方下载时是否具有竞争力
蓝色

4
@muddyfish不,因为从外部来源获取输出是一个标准漏洞。
Mego

输出midi文件而不是音频是可以接受的吗?
DJMcMayhem

@DJMcMayhem是的,可以接受MIDI文件。
Mego

我认为完全需要最后一个(唯一的)和弦吗?这有效地禁止了非和弦语言/ API
Level River St

Answers:


9

的JavaScript(ES7),249个 242 241字节

with(new AudioContext)for(t=i=0;n=parseInt('l43l431db98643o86ogfdbdfdgfdzbdzgigikigfdbzbdv98db9864311480'[i++],36);)with(createOscillator())frequency.value=880*2**(-~-n%20/12),connect(destination),start(t),stop(i>56?t+q*8:t+=n>20?q=6/13:q/2)

感谢@Neil和@PatrickRoberts节省了一些字节!

说明

该符号包装在字符串中,其中每个字符都是一个单独的音符,以36位为基数。音符值由以下公式确定:(19 - pitch) * time + 1其中pitch,半音的数量小于A5,并且time1半音符或20四分音符。将0在年底停止for循环。

速度为65.22bpm 编辑:现在为65bpm,还有2个字节

本说明/演示用于Math.pow代替**浏览器兼容性。它还将振荡器的增益设置为,以.3使最终和弦不会让您的耳朵流血(默认增益为1)。

with(new AudioContext)            // use HTML5 audio
  for(                            // iterate through the note pitches and lengths
    t=i=0;                        // t = current time to place the note
    n=parseInt(                   // n = note pitch/length

      // Packed notation string
      'l43l431db98643o86ogfdbdfdgfdzbdzgigikigfdbzbdv98db9864311480'

    [i++],36);
  )
    with(createOscillator())      // create the note oscillator

      // Set the note frequency (using Math.pow for the demo).
      //frequency.value=880*2**(-~-n%20/12),
      frequency.value=880*Math.pow(2,-~-n%20/12),

      // Send the note's sound through the speakers (for the demo, we'll connect it to
      // a gain node so we can reduce the volume).
      //connect(destination),
      connect((g=createGain(),g.gain.value=.3,g.connect(destination),g)),

      start(t),                     // schedule the note to sound
      stop(                         // schedule the end of the note
        i>56?                       // if we are in the final chord
          t+                        //   do not increment the time
            q*8                     //   hard-code the length to a semibreve
        :t+=n>20?q=6/13:q/2         // else update the length based on the note value
      )

您可以按上面的按钮在任何支持HTML5 Web Audio API的浏览器中对其进行测试。


880*2**(-~-n%20/12)应该可以节省一些字节。
尼尔

@尼尔谢谢。我怀疑我可以摆脱-~-通过更改笔记包装的格式来(+ 1公式中的只是在这里,因为我需要0停止for循环并且在发布之前我懒得考虑很多)。
user81655 '16

在我发布答案后看到了这一点,大声笑
Patrick Roberts

您可以通过更换保存另一个字节c=new AudioContext;with(new AudioContext)和去除的两次出现c.在节目中。
帕特里克·罗伯茨

1
@ kamoroso94不。指数可以是分数,所以如果使用<<它,它将把它转换为整数。
user81655

8

数学,212个 152 139 135字节

{#~(s=##~SoundNote~41&)~1&/@LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu",{14,18,21}~s~16}~Sound~18.5

Sound按下“播放”按钮时,输出一个在D中播放Pachelbel佳能的对象。该乐器是MIDI乐器#41“小提琴”。

音频

点击我!

说明

LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu"

找到字符串中每个字符的字母数字(“ a”-> 1,“ b”-> 2,依此类推),并用a包裹List。(此字符串代表D中Pachelbel的佳能)

#~(s=##~SoundNote~41&)~1&/@...

设置sSoundNote仪器编号为#41的功能。将持续时间设置为1并将该函数映射到中的每个元素List(从而生成SoundNote原始对象)。

{14,18,21}~s~16

做最后的黑社会。(持续时间16可以使最后一个音符延长16倍-整个音符是16个音符的16倍。)

... ~Sound~18.5

制作一个Sound物体,18.5长几秒(因为速度为65 bpm [5拍的4/4速度为65 bpm =大约18.5秒])。

126字节版本,无竞争

Sound[{(s=SoundNote)/@LetterNumber@"uursuursuikmnprsrrnprrfgikigifgiggkiggfdfdbdfgikggkikkmnikmnprsu",{14,18,21}~s~16},240/13]

不竞争,因为输出包含两个十六分音符而不是一个八分音符,并且分隔非常明显。


14
真的,Mathematica没有内置Pachelbel的佳能吗?
Stewie Griffin

1
@StewieGriffin可能只有整件事,并且剪切它的成本太高。
Mego

@StewieGriffin令人惊讶的是,事实并非如此。
JungHwan Min

6

泡泡糖,203字节

00000000: e002 2800 c35d 0026 9509 6f34 76f2 ffad  ..(..].&..o4v...
00000010: 4150 0893 a735 bd02 a1eb 1237 18fe 5498  AP...5.....7..T.
00000020: 120a 83e1 6662 8a5e 9709 fe8a 3430 0f48  ....fb.^....40.H
00000030: 5008 54af d19a b44f 2be9 fb3b bf9d 206d  P.T....O+..;.. m
00000040: abbf 12f0 2151 6dae 4712 8c18 4d8e f5cd  ....!Qm.G...M...
00000050: eb85 404c 17cd bd5c 2775 38bd eb50 ab88  ..@L...\'u8..P..
00000060: e015 fb7e 4b1e 5ddb 515b 144c fc5e c1be  ...~K.].Q[.L.^..
00000070: 3d5d 20cd e950 4a1d 256e b56e d364 188b  =] ..PJ.%n.n.d..
00000080: 6fa1 afcc 2100 0235 ada0 2f23 411d 95dd  o...!..5../#A...
00000090: 6665 3b45 041d cbe2 8e3b 2456 fb8d 4e4c  fe;E.....;$V..NL
000000a0: 1a7f b814 a6cf 850e 9b6c 9285 3a6f 1ec3  .........l..:o..
000000b0: 02ed 505c 996b eb4d 209c 2776 a8aa 8380  ..P\.k.M .'v....
000000c0: 42cc b779 218e e75e 8000 00              B..y!..^...

在线尝试!

这是xxd -r源代码的十六进制转储(与反向)。它产生的MIDI文件如下(也是一个十六进制转储):

00000000: 4d54 6864 0000 0006 0001 0002 01e0 4d54  MThd..........MT
00000010: 726b 0000 0019 00ff 5902 0200 00ff 5804  rk......Y.....X.
00000020: 0402 1808 00ff 5103 0e15 c500 ff2f 004d  ......Q....../.M
00000030: 5472 6b00 0001 f200 c000 00ff 0405 5069  Trk...........Pi
00000040: 616e 6f00 9051 5f81 5880 5100 1890 4e5f  ano..Q_.X.Q...N_
00000050: 6c80 4e00 0c90 4f5f 6c80 4f00 0c90 515f  l.N...O_l.O...Q_
00000060: 8158 8051 0018 904e 5f6c 804e 000c 904f  .X.Q...N_l.N...O
00000070: 5f6c 804f 000c 9051 5f6c 8051 000c 9045  _l.O...Q_l.Q...E
00000080: 5f6c 8045 000c 9047 5f6c 8047 000c 9049  _l.E...G_l.G...I
00000090: 5f6c 8049 000c 904a 5f6c 804a 000c 904c  _l.I...J_l.J...L
000000a0: 5f6c 804c 000c 904e 5f6c 804e 000c 904f  _l.L...N_l.N...O
000000b0: 5f6c 804f 000c 904e 5f81 5880 4e00 1890  _l.O...N_.X.N...
000000c0: 4a5f 6c80 4a00 0c90 4c5f 6c80 4c00 0c90  J_l.J...L_l.L...
000000d0: 4e5f 8158 804e 0018 9042 5f6c 8042 000c  N_.X.N...B_l.B..
000000e0: 9043 5f6c 8043 000c 9045 5f6c 8045 000c  .C_l.C...E_l.E..
000000f0: 9047 5f6c 8047 000c 9045 5f6c 8045 000c  .G_l.G...E_l.E..
00000100: 9043 5f6c 8043 000c 9045 5f6c 8045 000c  .C_l.C...E_l.E..
00000110: 9042 5f6c 8042 000c 9043 5f6c 8043 000c  .B_l.B...C_l.C..
00000120: 9045 5f6c 8045 000c 9043 5f81 5880 4300  .E_l.E...C_.X.C.
00000130: 1890 475f 6c80 4700 0c90 455f 6c80 4500  ..G_l.G...E_l.E.
00000140: 0c90 435f 8158 8043 0018 9042 5f6c 8042  ..C_.X.C...B_l.B
00000150: 000c 9040 5f6c 8040 000c 9042 5f6c 8042  ...@_l.@...B_l.B
00000160: 000c 9040 5f6c 8040 000c 903e 5f6c 803e  ...@_l.@...>_l.>
00000170: 000c 9040 5f6c 8040 000c 9042 5f6c 8042  ...@_l.@...B_l.B
00000180: 000c 9043 5f6c 8043 000c 9045 5f6c 8045  ...C_l.C...E_l.E
00000190: 000c 9047 5f6c 8047 000c 9043 5f81 5880  ...G_l.G...C_.X.
000001a0: 4300 1890 475f 6c80 4700 0c90 455f 6c80  C...G_l.G...E_l.
000001b0: 4500 0c90 475f 8158 8047 0018 9049 5f6c  E...G_.X.G...I_l
000001c0: 8049 000c 904a 5f6c 804a 000c 9045 5f6c  .I...J_l.J...E_l
000001d0: 8045 000c 9047 5f6c 8047 000c 9049 5f6c  .E...G_l.G...I_l
000001e0: 8049 000c 904a 5f6c 804a 000c 904c 5f6c  .I...J_l.J...L_l
000001f0: 804c 000c 904e 5f6c 804e 000c 904f 5f6c  .L...N_l.N...O_l
00000200: 804f 000c 9051 5f6c 8051 000c 904a 5f00  .O...Q_l.Q...J_.
00000210: 904e 5f00 9051 5f8e 4c80 4a00 0080 4e00  .N_..Q_.L.J...N.
00000220: 0080 5100 8360 ff2f 00                   ..Q..`./.

6

BBC BASIC,141个ASCII字符(65.217BPM)

*TEMPO1
F.i=2TO71j=i>65SOUND1-j*(479+i/2),-9,ASCM." \\VX\\VX\DHLNRVXVVNRVV>@DHD@D>@D@@HD@@>:>:6:>@DH@@HDHHLNLDHLNRVXNNVV\\",i)*2,23-j*161N.

修改以适应速度限制。稍后将更新说明。

BBC BASIC,123个ASCII字符(不与60BPM竞争)

http://www.bbcbasic.co.uk/bbcwin/download.html下载口译员

运行时直接播放歌曲。

F.i=1TO67j=i>64SOUND1-j*(447+i),-9,ASCM."\\VX\\VX\DHLNRVXVVNRVV>@DHD@D>@D@@HD@@>:>:6:>@DH@@HDHHLNLDHLNRVXNV\",i)*2,5-j*75N.

不打高尔夫球

  FOR i = 1 TO 67
    j = i > 64: REM j=0 for the first four bars composed of 16th notes, j=-1 for the final chord (whole note)
    SOUND 1 - j * (447 + i), -9, ASC(MID$("\\VX\\VX\DHLNRVXVVNRVV>@DHD@D>@D@@HD@@>:>:6:>@DH@@HDHHLNLDHLNRVXNV\", i)) * 2, 5 - j * 75
  NEXT i

说明

j是一个标志,指示我们是处于前四个小节还是位于最后的和弦。-1BBC BASIC中为TRUE 。

SOUND语句采用4个参数:

CHANNEL:对于前4个小节,这是通道1。对于第5小节的和弦的3个音符,通道号为16、201、202和203十六进制(十进制的513,514和515)。这意味着在通道1,2和3,首字母2意味着在其他通道上同时演奏2个音符(即演奏3音符和弦)。

音量:由于为正值代表其他效果(声音包络),因此指定为负值。设置为-9(最大可达-15)。

音高:对于此音调,范围从D4 = 108到A5 = 184。每个整数步为半音的1/4。值以ASCII码存储在54到92的范围内,并加倍以重新生成正确的值。1/8分音符作为重复的1/16分音符存储。最终和弦以3个单独的音高存储,并且音符长度随整个音符变化如下。

持续时间:1/20秒。1 / 16th音符的持续时间为5/20秒,因此每分钟60 1/4音符(分辨率不足以使速度更精确。)整个音符为5-(-75)= 80单位(4秒) ) 长。


难道这不应该被标记为非竞争吗?
JungHwan Min

@JungHwanMin回答您的评论原始文本:BPM在65的10%之内。问题的精确度没有限制。OP的电话。
水平河圣

60 bpm与65 bpm在听觉上是不同的。我允许这是非竞争性的,因为这是语言所施加的限制。
Mego

@Mego我最初认为BBC Basic在默认情况下会以百分之一秒为单位,但我没有意识到它像秒的百分之二十一样粗。我已将代码调整为100分,所以现在我可以做65.215BPM,可以吗?由于整个音符超过256/100,所以花了一些额外的摆弄,所以我不得不将其作为两个半音符来演奏。50秒的代码将是更短的代码,但是62.5BPM并没有多大改进。
水平河圣

顺便说一句,原始帖子中存在一些较小的转录错误。您可能需要稍微更改代码。(当前代码的版本有误)
JungHwan Min

4

Befunge,242个字节

乐曲以MIDI文件的格式写入标准输出。您需要将输出重定向到.mid文件才能播放摘录。

<v:"MThd"0006000101"MTrk"001+"~e"0*3"UQ"30*5"-\"9
v>9#:-#,_0"QONLJIGEJIGEGCGECB@>@B@BCEGCECBECEGECBNLJNONLJIGEQONQONQ"0\:
_v#:\%+77+1,"@",\,*8*82,+3*4!*-3::\,"@",:,*:*62,1
v>"QNJQNJ"0\:
_v#:\+1,"@",\,-**82/3\*:*62:,+!\**97!-3::\
@>,\"/U"3*,,,

在线尝试!,尽管我认为目前不可能以保留数据二进制完整性的方式保存输出。

说明

第一行仅是硬编码的MIDI头,这是必不可少的,它在第二行的开头输出。第二行的其余部分将音符序列编码为其MIDI值,通常为ASCII。第三行写出用于播放这些音符的MIDI命令,并且会自动计算持续时间(除非i%14 == 0,否则每个音符都是一个半音)。最后的和弦在第4和第5行作为特殊情况处理(因为需要同时按下多个键),而第6行写出轨迹标记的最后MIDI结束。


4

C,248228210198193191191字节

#define y(x)cos(.346*t*exp(x/17.))
d=1846,t;main(c){for(;t++<d*80;putchar(c=((t<d*64?y(("TTQRTTQRTHJLMOQRQQMOQQEFHJHFHEFHFFJHFFECECACEFHJFFJHJJLMHJLMOQRT"[t/d]-72)):y(12)+y(9)+y(5))+3)*42));}

这将产生一系列旨在以每秒8000个样本播放的8位无符号样本。如果您使用较旧的UNIX / Linux安装程序,则可以将输出重定向到/dev/audio。在某些较新的Linux发行版上,您可能必须将输出通过管道传输到ALSA命令行播放器aplay


好棒。很好的解决方案!
亚伯汤姆

1

SmileBASIC,115字节

BGMPLAY"@305T65L16[A8F+G]2A{r}F#8>F#GABAGAF#GAG8BAG8F#EF#EDEF#GABG8BAB8<C#D{r}AA1:1[R1]4F#1:2[R1]4D1{r=>AB<C#DEF#G}

使用一个不错的工具值得4个额外的字节:)


305号仪器是什么?
帕维尔

SmileBASIC拥有所有常规的MIDI乐器,但也有一堆“秘密”未记录的乐器。这是使用该乐器演奏的Pachelbel佳能的更复杂版本的示例:dropbox.com/s/wfhr90tdkkji6qy/305.mp3?dl=0
12Me21

0

使用WAV.js的 JavaScript(ES6),325字节

w=new WAV();w.addProgression(btoa9‘¹9‘¹8€¹‘9‘¹‘y‘9‘y¸€x¸x€8¸€8¸888¸€x¸€8€xù€xù‘y9`.replace(/[CF]./g,'$&#').split(/(?=[A-G])/g).map((f=t=>n=>({note:n,time:t}))(15/65)));['D5','F5#','A5'].map(n=>w.addNote(f(48/13)(n),.3,[],1,1));new Audio(URL.createObjectURL(w.toBlob())).play()
<script src="https://cdn.rawgit.com/patrickroberts/3b065ab94ce5094baacf45ed23e2a16e/raw/9c367e292fbee8341e1019d0d5953a2234449882/wav.babel.js"></script>

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.