将以下Pachelbel佳能的摘录输出为D音频:
规则
- 可以使用任何格式/编码,只要在创建此挑战之前已存在编解码器
- 可以使用任何乐器(真实乐器,MIDI合成等)
- 速度必须为65 BPM(如活页乐谱中所述)-如果您无法获得准确的65 BPM,则可以使用64.75-65.25(含)范围内的任何速度
- 乐谱在音乐会上
- 必须使用相等的气质调整(特别是12-ET,A4 = 440 Hz)
作为参考,下面是一个摘录的堆栈片段:
将以下Pachelbel佳能的摘录输出为D音频:
作为参考,下面是一个摘录的堆栈片段:
Answers:
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,并且time
是1
半音符或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
循环并且在发布之前我懒得考虑很多)。
c=new AudioContext;
与with(new AudioContext)
和去除的两次出现c.
在节目中。
<<
它,它将把它转换为整数。
{#~(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&/@...
设置s
为SoundNote
仪器编号为#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]
不竞争,因为输出包含两个十六分音符而不是一个八分音符,并且分隔非常明显。
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..`./.
*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.
修改以适应速度限制。稍后将更新说明。
在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
是一个标志,指示我们是处于前四个小节还是位于最后的和弦。-1
BBC 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秒) ) 长。
乐曲以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结束。
#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
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个额外的字节:)
w=new WAV();w.addProgression(btoa`9¹9¹8¹9¹y9y¸x¸x8¸8¸888¸x¸8xùxùy9`.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>