播放``攻丝''


31

今天(2015年11月11日)是美国退伍军人节。“ Taps ”是在美国军事葬礼上播放的号角

(来自vtmiller的SoundCloud上的“ 轻击”

这是一种简单的旋律,只有二十四个音符,并且仅使用四个不同的音符。这是乐谱:

乐谱 来源

挑战

编写一个程序或函数以任何常见的音频文件格式(例如MP3,WAV,MIDI)播放“ Taps”或输出“ Taps”音频文件。可以用任何键,使用任何类型的乐器或您的语言可用的蜂鸣声播放。例如,听起来可能像是钢琴,而不是军号。(尽管仍然只能使用一种乐器类型。)

必须以准确的音高,持续时间和间隔演奏所有二十四个音符。熟悉“轻击”的人应该能够运行您的代码并轻松识别正在播放的歌曲。

旋律的持续时间(从第一个音符的开始到最后一个音符的结束)必须在30到70秒之间。您可以选择在声音文件的开头和/或结尾处保留长达5秒钟的静音时间,因此最长允许80秒。

当然,您可能不只是在某处在线下载歌曲或从恰巧将其作为示例的音频库中提取歌曲。但是,您可以使用音频库来播放/编写各个音符并创建音频文件。

计分

这是,因此最短的答案以字节为单位。但是,对于这个特殊的挑战,我鼓励您不要专注于字节数,尤其是以音质为代价。充分利用您的意见书,但可以根据自己的乐器选择或声音输出方法来发挥创造力。这项挑战的目的是要表彰退伍军人,而不是要淘汰几乎无法识别的“拍击”版本。

请注意,只需将链接粘贴在空白行上,就可以将SoundCloud音频文件直接嵌入到帖子中。如果您有SoundCloud帐户,这将是共享您的输出的好方法。


我在想ChucK。
The_Basset_Hound 2015年

4
卡尔文(Calvin),如果您不介意,我会在旧的BASIC中张贴一些高尔夫球的答案,并向PPCG以外的退伍军人慈善组织捐款。您启发了我这样做。顺便说一句,在英国,我们有纪念日,11月的第二个星期日,这意味着今年是最后一个星期日。我最早的记忆之一是站在一座被罂粟包围的纪念碑上,那里被默哀了2分钟。我大约3岁。当我问妈妈为什么没人在说话时,她告诉我要安静。
水平河圣

费马长的长度有任何规定吗?
SirPython

@SirPython我什至不知道那个符号是什么意思!根据en.wikipedia.org/wiki/Fermata的说法,“表演时间的长短完全取决于表演者的判断。” 在输出上使用判断力实际上并不适合codegolf,因此我按书面形式演奏。我知道您要去的地方...加长虚线的第二个音符可以将虚线的八分音符压缩到十六分音符,从而使事情变得更简单。但是我认为那是作弊:-)
Level River St

Answers:


4

qb64,100个 84字节

旧Qbasic的更新版本,可从http://www.qb64.net/下载

Count排除了不需要的空格,为了清楚起见,仅在此处将数据分成三个注释的短语。

PLAY"T99L4C.L8CL1F. L4C.L8FL1A. L4CFL2A L4CFL2A L4CFL1A. L4F.L8AL1>C< L2AFL1C. L4C.L8CL1F."

播放字符串中的命令

T99     set tempo to 99 quarter notes per minute (default is 120, only just too short)
CDEFGAB play notes in the current octave
><      up or down one octave
Lx      following notes are of note of 1/x duration
.       extend previous note duration by 50%

高尔夫历史:

第一篇文章:4/4次至4/2次,这意味着我有一些完整的音符,但没有十六分音符。

编辑1:密钥从C(范围GG)更改为F(范围CC)。现在,我只需要执行一次八度音调更改,因为高C仅发生一次,而不是像以前一样执行所有低G。

摆脱了所有这些八度的变化之后,我认为高尔夫没有更多的用途了。共有20个L,但是没有明显的方法来避免它们。

最后一个词组(11个字符)与第一个词组相同,但是无法在11个字符以内插入两次。如果L4消除了首字母,重复的数据将只有9个字符(由于默认的音符长度似乎是四分音符,因此似乎没有必要,但是没有记录,因此我将其保留了下来。)


9

JavaScript中,203个 198 196 195字节

with(new AudioContext)for(t=i=0;n="301093301396202346202346202396331699464390301093"[i++];)with(createOscillator())i%2?l=n/2:(frequency.value=392+n*44,connect(destination),start(t+.1),stop(t+=l))

由于节省了5个字节 Dendrobium,@ PatrickRoberts 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=                        // n = note pitch (or temporarily length)

    // This string contains the values of each note alternating between length and pitch
    //     (l1, p1, l2, p2, etc...)
    // Length value is in 16th notes (1 = 1/16th note, 2 = 1/8th, etc...)
    //     The longer notes are limited to 9 but I think it still sounds OK
    // Pitch value 0 = G4, 3 = C5, 6 = E5, 9 = G5 (multiples of 3 saves 1 byte)
    "301093301396202346202346202396331699464390301093"

  [i++];)
    with(createOscillator())  // create the note oscillator
      i%2?                    // alternate between length and pitch characters
        l=n/2                 // l = length (stored for use in the next iteration)
                              // dividing it by 2 sets the speed to 60 beats per minute
                              //     and casts it to a number
      :(
        frequency.value=392   // base note = G5 (392hz)
          +n*44,              // there is (conveniently) roughly 132hz between each note
        connect(destination), // send the note's sound through the speakers
        start(t               // schedule the note to sound
          +.1),               // short delay to distinguish two notes of the same pitch
        stop(t+=l)            // schedule the end of the note and increment the time
      )

在浏览器中进行测试!在任何支持HTML5 Web Audio API的浏览器上均可使用


1
-5个字节:c = new AudioContext(); for(t = i = 0; n =“ 301093301396202346202346202396331699464390301093” [i ++];)with(c.createOscillator())i%2?l = n / 2 :(频率。值= 392 + n * 44,connect(c.destination),start(t + .1),stop(t + = l))
Dendrobium

我会说持续时间(将12个单位更改为9个单位)是不正确的;由于虚线的半音符上面有fermatas,并且实际上应该是12个或更长时间,因此情况变得更糟。
lirtosiast 2015年

@ThomasKwa是的,它并不完美,但是要求是易于识别的,所以我会说它通过了。(也请听问题中的SoundCloud音轨,第一个点缀的半音符正好是10/16分音,所以如果我们要使用该版本,它将非常接近!:P)
user81655 2015年

8

Mathematica,361 287 285字节

我在这里追求准确性。输出与小号演奏的乐谱完全相同。您可以在此处找到文件。

"G"
e="E5";c="C5";EmitSound@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{%,8,17,%,24,20,c,2,23,%,8,26,c,24,29,e,2,32,%,12,35,c,12,38,e,6,41,%,12,44,c,12,47,e,6,50,%,12,53,c,12,56,e,2,59,c,8,62,e,24,65,"G5",3,68,e,6,170/3,c,6,136/3,%,2,34,%,8,34,%,24,34,c,2,34}~Partition~3]

感谢@MartinBüttner提供的高尔夫建议。


4
链接不允许我听这首歌。由于权限问题,它似乎已被删除或无法收听。
d0nut 2015年

2
要进一步学究,您没有考虑费马!
wchargin

“旋律的持续时间必须在30到70秒之间。” 这在24秒时有点短。
加尔文的爱好2015年

4
@ Calvin'sHobbies等待...我正在以建议的50 BPM进行所有操作...我怪你:|
LegionMammal978

1
%1%2并且%%实际上不要在x="E5"->上保存任何字节x(实际上,看看使用它们的频率,实际上应该通过使用变量来节省很多)。然后,您可以通过使用EmitSount@Sound[SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17]&@@@{{%%,8,17},{%%,24,20},...}和将最常用的笔记存储在中来节省大量字节%。并以24个音符分割一个平面列表可能会更短:SoundNote[#,5/#2,"Trumpet",SoundVolume->#3/17&@@@{%%,8,17,%%,24,20,%2,2,23,...}~Partition~3
Martin Ender

5

Sonic Pi,899个字节

时机还没到,但我认为还可以。

轻轻打高尔夫球:

use_synth:刀片
use_synth_defaults持续时间:0.70,发布时间:0.0
播放:G4,发布:0.05
等待0.75
播放:G4,持续时间:0.25
等待0.25
hold = rrand_i(3,4)
播放:C5,持续音:保持,释放:0.5
等待保持+0.5
播放:G4,发布:0.05
等待0.75
播放:C5,持续时间:0.25
睡觉0.25
hold = rrand_i(3,4)
播放:E5,持续:保持,释放:1.25
睡眠保持+1.25
玩:G4
睡眠0.70
玩:C5
睡眠0.70
2.次做
  播放:E5,持续时间:1,发布:0.25
  睡1.25
  玩:G4
  睡0.7
  玩:C5
  睡0.7
结束
hold = rrand_i(3,5)
播放:E5,持续:保持,释放:0.75
睡眠保持+1
播放:C5,发布:0.05
睡0.75
播放:E5,持续时间:0.25
睡觉0.25
播放:G5,持续时间:2.45,发行:0.05
睡觉2.5
播放:E5,持续时间:1,发布:0.25
睡1.25
播放:C5,持续时间:1,发行时间:0.25
睡1.25
hold = rrand_i(3,5)
播放:G4,维持:保持,释放:0.5
睡眠保持+0.5
播放:G4,发布:0.05
睡0.75
播放:G4,持续时间:0.25
睡觉0.25
hold = rrand_i(3,5)
播放:C5,持续音:保持,释放:1.5

是的,有人在使用Sonic Pi!
Mega Man

可以通过将h重命名为hold,将release:0.0更改为release:0并删除空格来稍微打高尔夫球。
Mega Man

4

MATLAB,338个 327 262 258 230字节

o=@(L,f)sin(pi*.11*2^(f/12))*(1:600*L))
sound([o(3,-1) o(1,-1) o(12,2) o(3,-1) o(1,2) o(12,4) o(2,-1) o(2,2) o(4,4) o(2,-1) o(2,2) o(4,4) o(2,-1) o(2,2) o(12,4) o(3,2) o(1,4) o(8,6) o(4,4) o(4,2) o(12,-1) o(3,-1) o(1,-1) o(12,4)])

2

SmileBASIC,73个字节

BGMPLAY"@56T50L2.G8.G16B+G8.<C16E>[G8<C8E4>]2G8<C8EC8.E16G2E4C4>GG8.G16B+

所有注意事项和时间安排均正确。我用了小号,因为它是MIDI中最接近的东西

<audio autoplay controls src="//12me21.github.io/resources/taps.mp3"></audio>


1

Powershell,183 175 159字节

怀旧之旅,谁不喜欢哔哔声?

foreach($i in 0..23){[console]::beep((196,262,330,392)[(001012012012012123210001-split'')[$i]],(3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12)[$i]*400)}


说明(sortof)

foreach($i in 0..23) { # foreach loop which ranges from 0 to 23
    [console]::beep( # [console]::beep(Pitch, Duration)
        (196,262,330,392) # the notes in Hertz
            [ # select which note to use
                (001012012012012123210001-split'') # -split '' creates an array of [0,0,1,0,1 ...], spaces can be omitted
                [$i] # select the n-th element
            ],
        (3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12) # array of durations
        [$i]*400 # duration in milliseconds * 400
    )
}


这将在大约45秒内播放。

这是我第一次使用Windows的Powershell,欢迎打高尔夫球。


旧版本

175

foreach($i in(0..23)){[console]::beep((196,262,330,392)[(0,0,1,0,1,2,0,1,2,0,1,2,0,1,2,1,2,3,2,1,0,0,0,1)[$i]],(3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12)[$i]*400)}

183

$d=3,1,12,3,1,12,2,2,4,2,2,4,2,2,12,3,1,8,4,4,12,3,1,12;$n=0,0,1,0,1,2,0,1,2,0,1,2,0,1,2,1,2,3,2,1,0,0,0,1;foreach($i in(0..23)){[console]::beep((196,262,330,392)[$n[$i]],$d[$i]*400)}

1

BBC基础版111

在以下位置下载口译员 http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

分数不包括空格和换行符,这些空格和换行符不是必需的,并且为了提高可读性而添加

FORk=1TO24
  x=ASC(MID$("')F'Lb(Ke(Ke(KbJhxeI#')F",k))
  SOUND1,-9,x DIV7*4+60,INT(12/1.4^(x MOD7))*5
  SOUND1,0,1,1
NEXT

相当标准的压缩,每个音符1个ASCII字符。的参数SOUND如下:

Channel (always 1 for the purposes of this challenge)
Amplitude (negative for on, 0 for off, positive is an envelope index)
Pitch (in increments of 1/4 semitone, with middle C at 100)
Duration (20ths of a second)

尽管只使用了4个音符,但歌曲的范围是13个音符。为了使此范围进入可打印ASCII的95个数字范围,我不得不将持续时间压缩为7的整数范围,并将其取模7。使用以下持续时间(十六分之一)(除了6之外,永远不会使用):1,2,3,4,6,8,12。为了产生这些数字,我想到了将12除以sqrt(2)(约1.4)的幂并进行截断的想法。

SOUND1,0,1,1是一种烦恼,花费12个字节。必须在音高相同的音符之间稍作停顿。


1

Ruby +哔哔声,178个字节

f=[260,346,416,499]
n=[12,*1..4]
l=(a="001012012012012123210001310310224224220318440310".chars.map(&:to_i))[24..-1]
`beep#{24.times.map{|i|" -f#{f[a[i]]} -l#{n[l[i]]}00"}*" -n"}`

花了我一段时间让我做这个,我想我错过了船,但是无论如何。

f 保持使用的四个频率。 n保留使用的五个音符长度,以16音符的倍数为单位。

a="00101...保留所有音符音高和所有音符长度,作为进入各个数组的索引。l然后将设置为第24个索引,然后从a。然后,通过重复上述所有操作来构造蜂鸣命令,并执行


0

C-(原始:318 | WAV:437)

8位(无符号)单声道PCM,频率为44800 Hz,33.60秒。

中强力,强力和强力的动力学在某种程度上是艺术性的。Fermatas可能更好。

代码依赖于unsigned long long8个八位位组和系统小尾数。

#include<stdio.h>
#include<math.h>
#ifdef RAW
main(){unsigned long long D[]={0x422422c13c13,0xc13c44813c22},X[]={27863,37193,46860,55727},O=0x406e64924910,i=0,j;float Z,A,U=40,P;for(;i<24;D[i++/12]>>=4){Z=X[O&3]/1e6;P=0;O>>=2;A=i>18?--U:i<14?U+i/2:U+30;for(j=(D[i/12]&15)*13440;j;A-=--j<7e3&&A>0?.01:0)putchar(A*sin(P+=Z)+128);}}
#else
main(){unsigned long long D[]={0x422422c13c13,0xc13c44813c22},X[]={27863,37193,46860,55727},O=0x406e64924910,i=0,j;float Z,A,U=40,P;int W[]={0x46464952,1570852,0x45564157,544501094,16,65537,44800,44800,524289,0x61746164,1505280};fwrite(W,4,11,stdout);for(;i<24;D[i++/12]>>=4){Z=X[O&3]/1e6;P=0;O>>=2;A=i>18?--U:i<14?U+i/2:U+30;for(j=(D[i/12]&15)*13440;j;A-=--j<7e3&&A>0?.01:0)putchar(A*sin(P+=Z)+128);}}
#endif

编译并运行类似以下内容:

gcc -std=c99 -o taps taps.c -lm
./taps > taps.wav
play taps.wav

添加-DRAW到原始变量的编译行。

原始输出可以使用例如SoX播放play为:

play -c 1 -b 8 -r 44800 -t u8 <file>
       |    |       |       |
       |    |       |       +--- Unsigned 8-bit
       |    |       +----------- Sample rate
       |    +------------------- 8 Bits
       +------------------------ 1 Channel
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.