莫尔斯新年


33

这是每周挑战#1。主题:音频处理

你的任务是写一个程序,这将写入音频文件光盘(在您所选择的格式),其中包含了摩尔斯电码2015,即

..--- ----- .---- .....

您可以自由选择片段的任何声音,例如单频正弦波,和弦,杂音和某些乐器(例如,使用MIDI文件),只要可以听到即可。但是,在时间安排上有一些限制:

  • 短片段的长度至少应为0.2秒。
  • 长片段的长度至少应为短片段的3倍。
  • 一个数字段之间的中断应与短段的长度相同。
  • 数字之间的间隔应与长段的长度相同。
  • 每个细分市场和细分可能会偏离该细分市场/细分类型的平均长度最多10%。
  • 整个音频文件不得超过30秒。

休息时间不必完全保持沉默,但莫尔斯电音片段的声音应该比休息时间大。

请注意,您必须编写一个音频文件。您不能仅仅播放声音,例如使用系统提示音。您可以使用任何类型的库来处理文件格式和音频生成,但不得使用内置功能进行Morse编码。

这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。

请考虑链接到生成的音频文件的上载(在SoundCloud或类似设备上),以便人们可以检出结果而不必运行您的代码。如果您上传到SoundCloud,请确保在曲目的“权限”选项卡中启用下载。

如果您的输出使用的是不太常见的文件格式,请添加一些有关如何播放和/或将其转换为更常见的格式并上载的信息。

示例轨道

这是一个手动生成的示例音轨,符合规范,并使用了莫尔斯线段的噪声(准确地说是麦克风背景噪声)。如果嵌入式播放器不适合您,这是指向SoundCloud的链接

赏金详情

我将奖励以音频编程语言(即一种旨在合成声音的语言)中提交时间最短的方法。该列表不完整,因此,如果您知道的话,请随时使用另一种音频编程语言。如果您不确定您要使用的某种语言是否分类为音频编程语言,请在评论中或在聊天中告知我,我们可以进行讨论。

请注意,您提交的内容仍必须遵守所有规则-特别是必须写入文件,这可能并非在所有音频编程语言中都可行。例如,据我所知,gibber只能播放声音,而不能将其保存到文件中。


1
附加挑战:听起来真的不错。
卡兹·沃尔夫

6
@Mew莫尔斯听起来可能有多好?
马丁·恩德

1
在Brainf ** k中执行此操作将使它在这么多的奖金级别上都很棒。
2015年

@Mast可能,但不幸的是,BF无法写入文件。;)(我下次一定会再宽容。)
Martin Ender 2015年

仅包含乐谱但不包含音频(以下显示为.mid,.abc的音乐)的音乐符号格式是否被视为“音频文件”?包含样本和乐谱但没有渲染的音轨(.mod,.xm)的“跟踪器”格式呢?
Tobia'1

Answers:


4

AWK BASH:66 86 67 74字节

根据MartinBüttner的要求,我添加了速度,因为在检查ABC注释标准后,似乎没有为此定义的默认值(感谢nutki指出了这一点)。
我还写了一个而不是STDOUT的磁盘文件(a),因为该问题明确要求“磁盘上的文件”。

a=C3z;echo "X:1
K:A
Q:99
CzCz$a$a$a3$a$a$a$a${a}3Cz$a$a$a${a}3CzCzCzCzC">a

我将速度设置为99,这会导致音频文件持续22秒。它比我以前的版本慢,但至少现在应该是每个ABC播放器都相同的长度,并且适合30秒以内。

它看起来很像以前的版本,如您所见: 最后(我希望:o))版本的2015年分数

这是新的midi文件

BASH的第一个版本(速度丢失)

我为什么不首先想到这个...:o)

相同的结果比AWK少了22个字节

a=C3z;echo "X:1
K:A
CzCz$a$a$a3$a$a$a$a${a}3Cz$a$a$a${a}3CzCzCzCzC"

像AWK中的先前版本一样,它在stdout上写入有效的“ ABC”注释文件(感谢Tobia发现“ L”语​​句是可选的)

看起来像这样: 最新版本的“ 2015”分区

听起来和以前的版本完全一样

AWK的先前版本(86字节)

这是新版本;稍长一点,但时间更准确。我让第一个版本进行比较/参考:

BEGIN{a="C3z";print"X:1\nK:A\nL:1/8\nCzCz"a a a"3"a a a a a"3Cz"a a a a"3CzCzCzCzCz";}

这仍然是有效的“ abc”文件,如下所示: 2015年得分

这是新的midi文件(我加快了速度以将其保持在30秒的限制内)。

AWK的第一个版本(66字节):

这比我以前的答案有趣得多,但是要短得多,所以:

BEGIN{print"X:1\nK:A\nL:1/4\nCCC2C2C2zC2C2C2C2C2zCC2C2C2C2zCCCCC"}

这将输出一个有效的“ abc”文件,该文件可以(除其他外)读入EasyABC。它看起来像这样: 在摩尔斯分数为“ 2015”

听起来像是(midi文件)。+


您应将其发布为ABC,而无需AWK包装,并要求赏金!
Tobia

Tobia,ABC是一种文件格式,而不是一种编程语言。到目前为止,只有86个字节,这是最短的答案……问题是“结果声音是否足够接近有效答案的要求?”
LeFauve 2015年

我也将其称为文件格式,但是OP链接的Wiki页面将其列出为Sound编程语言。我将自己的ABC文件添加为一个条目,以及一个更合适的Csound程序。让我们看看他们对此有何看法。
Tobia'1

这就是Wiki的问题...有时,编辑它们的人会犯错:o)。许多不同的事物可以称为“编程语言”,但我认为ABC并不是其中之一。无论如何,感谢您发现“ L”是可选的。它节省了我几个字节; o)
LeFauve 2015年

“长片段的长度至少应是短片段的3倍。” 显示的最后一个音乐行不符合要求。
mbomb007'1

13

x86机器代码(.COM文件): 121 120 113 109字节

十六进制转储:

00000000  b4 3e bb 01 00 cd 21 b4  3c 31 c9 ba 3e 01 cd 21  |.>....!.<1..>..!|
00000010  4a b4 09 cd 21 be 56 01  8a 0c 46 e8 0c 00 b1 32  |J...!.V...F....2|
00000020  e8 07 00 81 fe 6d 01 75  ef c3 88 cb c0 e3 07 c1  |.....m.u........|
00000030  e1 04 30 d2 b4 02 00 da  cd 21 e2 fa c3 2e 73 6e  |..0......!....sn|
00000040  64 00 00 00 18 ff ff ff  ff 00 00 00 02 00 00 10  |d...............|
00000050  00 00 00 00 01 24 33 33  99 99 99 66 99 99 99 99  |.....$33...f....|
00000060  99 66 33 99 99 99 99 66  33 33 33 33 33           |.f3....f33333|
0000006d

可以在DosBox下轻松运行;输出是名为的.SND文件SND这里是一个FLAC版本,其输出的(和这里的.COM文件)。

评论程序集:

    org 100h

start:
    ; close stdout
    mov ah,3eh
    mov bx,1
    int 21h
    ; open snd
    mov ah,3ch
    xor cx,cx
    mov dx,filename
    int 21h
    ; write the header
    ; we used the `snd` part of the header as file name, back off one byte
    dec dx
    mov ah,9h
    int 21h
    mov si,data
.l:
    ; data read cycle
    ; read the current byte in cl (zero-extending to 16-bit)
    ; notice that ch is already zero (at the first iteration it's 0 from the
    ; int 21h/3ch, then we are coming from gen, which leaves cx to zero)
    mov cl,[si]
    ; move to next byte
    inc si
    ; generate the tone
    call gen
    ; generate the pause
    mov cl,50
    call gen
    ; repeat until we reach the end of data
    cmp si,eof
    jne .l
    ; quit
    ret

gen:
    ; generate a sawtooth wave at sampling frequency/2 Hz
    ; receives length (in samples>>4) in cx, with lowest bit indicating if
    ; it has to write a wave or a pause
    mov bl,cl
    ; shift the rightmost bit all the way to the left; this kills the
    ; unrelated data and puts a 128 in bl (if cx & 1 != 0)
    shl bl,7
    ; rescale the samples number
    shl cx,4
    ; zero the starting signal
    xor dl,dl
    ; prepare the stuff for int 21h
    mov ah,2h
.l:
    ; increment the signal
    add dl,bl
    ; write it
    int 21h
    ; decrement iteration count and loop
    loop .l
    ret

    ; .SND file header (4096 samples, mono, PCM)
header:
    db "."
    ; we also use "snd" as the file name
filename:
    db "snd",0,0,0,24,0xff,0xff,0xff,0xff,0,0,0,2,0,0,0x10,0,0,0,0,1
    ; terminator for int 21h/ah=9h
    db '$'
data:
    ; generated by gendata.py
    incbin "data.dat"
eof:

data.dat上述包括的是莫尔斯串的容易使用的表示(下位:声音开/关闭声音,高7位:在样品音长>> 4)由一个Python脚本生成:

#!/usr/bin/env python2
import sys

# source string
s = "..--- ----- .---- ....."
# samples
sr = 4096
conv =  {
            '.': 1 | (((sr/5) >> 4) & ~1),    # dot:   1/5 second, dI/dt=1
            '-': 1 | (((sr/5*3) >> 4) & ~1),  # line:  3/5 second, dI/dt=1
            ' ':     ((sr/5*2) >> 4) & ~1     # space: 2/5 second (+1/5 from the always-present pause), dI/dt=0 (silent)
        }
sys.stdout.write(''.join(chr(conv[a]) for a in s))

您不一定需要文件扩展名,如果这样可以节省四个字节。
马丁·恩德

4
@MartinBüttner:实际上,它允许我保存3个字节。该aa.snd只是SND头,这与开始前就把.snd后跟一个零字节,所以我得到了.snd免费的一部分,我回收其零终止。另外,标头在文件名后一个字节开始的事实使我可以使用a inc dx移到标头(1个字节),而不是a mov dx, header(3个字节)。OTOH,如果允许我一个人叫它,.snd我可以节省两个字节,但是我不确定真正的DOS是否会允许这样做(在DOS下对扩展名的处理是很特殊的)。
Matteo Italia

我对文件进行了一些测试.SND:我在FreeDOS .SND上安装了DosBox,SND~1在“真实” DOS上期望了其他功能。因此,这绝对是“未定义行为”区域。最后,我解决了调用文件的问题SND(由于删除了文件,因此减少了1个字节a,从而使-的成本保持inc dx不变dec dx)。
Matteo Italia 2015年

8

Mathematica-130

r = Riffle;
s = SoundNote;
Export["m.mid", 
 Sound@
   r[Flatten@
     r[
       s[0,.4(Boole@#+.5)]&/@Array[#>4&,5,5-#]&/@{2,0,1,5},
       (b=None~s~#&)@.6
     ],b@.2
   ]
]

在线玩


哦,您也可以将infix表示法用于Export,例如"m.mid"~Export~Sound@...
Martin Ender'1

(b=None~s~#&)@.6还应该(b=None~s~#&)@.4 ,您可以使用r = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
DavidC

马丁,但是每个休息时间已经有一个.2。.4 + .2
DavidC

@DavidCarraher啊,你是对的。
马丁·恩德

7

Perl 5中:94 122 140

SND文件的标题更简单,无需以二进制格式打印。此版本产生名为“ a”的8khz单声道SND文件:

open A,'>a';print
A".snd",pack"N*",24,-1,2,8e3,1,map{(--$|x3)x(894261072>>$_&1?1600:400)}0..39

结果文件

旧的解决方案。产生一个名为“ a”的1khz 8位单声道WAV文件:

open
A,'>a';print
A pack"A4lA8lssllssA4ls*",RIFF,17040,WAVEfmt,16,1,1,(1e3)x2,1,8,data,17004,map{($_)x(894261072>>$v++&1?400:100)}(255,0)x20

结果文件

要获得122个字符,我必须将标头粘贴为二进制而不是打包,这使得代码很难在此处复制。转义的版本是:

open
A,'>a';print
A"RIFF\x90B\0\0WAVEfmt \0\0\0\0\0\xe8\0\0\xe8\0\0\0\0datalB\0\0",pack"s*",map{($_)x(894261072>>$v++&1?400:100)}(255,0)x20

实际122字节解决方案的Base64编码:

b3BlbgpBLCc+YSc7cHJpbnQKQSJSSUZGkEIAAFdBVkVmbXQgEAAAAAEAAQDoAwAA6AMAAAEACABk
YXRhbEIAACIscGFjayJzKiIsbWFweygkXyl4KDg5NDI2MTA3Mj4+JHYrKyYxPzQwMDoxMDApfSgy
NTUsMCl4MjA=

您可以使用.au扩展名。做得好!
F. Hauri

7

AWK:172170字节

...而无需使用任何wave库!(*)

BEGIN{for(;++i<204;){d=d"\177\177\n";D=D"\n\n"}t=d d d D;d=d D;T=D D D;u=t t t;print".snd\0\0\0\30\0\0\221\306\0\0\0\2\0\0\20\0\0\0\0\1"d d u T u t t T d u t T d d d d d}

这将在stdout上输出一个Sun au音频文件,该文件可以由vlc播放(以及其他)。尽管au文件格式没有任何采样率限制,但VLC拒绝播放采样率低于4096 Hz的任何文件,因此我使用了该频率

编辑:链接到DropBox上的结果音频文件


(*)难道不应该为此加分吗?; o)


您不需要d=d "\177...串联中的空格。这样可以节省一个字节。但是,当我玩得到的音频文件,它听起来就像是缺少了5的最后DIT
马克·里德

谢谢。我使用相同的技巧保存了另一个连接的第二个字节。我刚刚用vlc 2.1.1检查了音频文件,听起来很完整。您使用什么播放器?
LeFauve 2015年

我在OS X上使用的是QuickTime Player。我在VLC中打开了它,听起来不错,所以没关系。苹果的错,不是你的错。
马克·里德

7

Python,155

使用python内置的wave模块。

import wave
n=wave.open(*"nw")
k=17837
n.setparams((2,2,k,0,"NONE",0))
h=k*1314709609
while h:[n.writeframes(`i%9`)for i in[0]*(2-h%2)*k+range(h%4*k)];h/=4

写入名为的文件n

感谢Sp3000提供有关将列表理解用于循环的建议(这有助于消除一些缩进)。

听这个:

https://soundcloud.com/bitpwner/morse-the-new-year-2015

如果嵌入式播放器不适合您,这是指向SoundCloud的链接

注释代码:

import wave
n=wave.open("n.wav","w")         # Open a wav file for writing
k=44100                            
n.setparams((2,2,k,0,"NONE","")) # Sets the minimal params for the wav file
w=n.writeframes
h=23450475295733                 # Contains base-4 morse: '.'=1, '-'=3, ' '=0
while h:
    for i in range(h%2*k):w(h%4*chr(i%99)) # Writes saw-tooth signal using i%99
    w((2-h%2)*k*" ")                       # Writes the pauses
    h/=4

由于w有副作用,我认为您可以列出comp来保存两个字节:while h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
Sp3000 2015年

@ Sp3000 oo ...没想到那个= D。谢谢!
2015年

这可能是一个愚蠢的问题,但是如果每次迭代将h除以4,while循环如何停止?
德里克·朕会功夫,2015年

@Derek朕会功夫对于python,当h变为0时,其求值为False,从而终止循环。while循环是一种打高尔夫球的技巧,可以一步一步地提取序列“ 11333033333013333011111”中的值。
矢量化

@bitpwner我知道0的计算结果为false,但不是所有正数都可以,如果将其除以另一个正数,就无法从中得到0?
德里克·朕会功夫,2015年

6

C#,556 552 536 535 516 506个 503 491 483字节

使用库Wav.Net

using System;using System.Linq;namespace WavDotNet.Core{using S=Samples<float>;class P{static void Main(){var w=new WavFileWrite<float>("a",9999);var b=new Tools.Generators.Sawtooth(9999);Func<long,float,S>g=(t,a)=>b.Generate32Bit(new TimeSpan(t),99,a);var l=2500000;S x=g(l,1),y=g(l*3,1),z=g(l*3,0),_=g(l,0),v=new S(new[]{x,_,x,_,y,_,y,_,y,z,y,_,y,_,y,_,y,_,y,z,x,_,y,_,y,_,y,_,y,z,x,_,x,_,x,_,x,_,x}.SelectMany(c=>c).ToList());w.AudioData.Add(new Channel<float>(v,0));w.Flush();}}}

输出到名为的文件a

结果托管在Dropbox上

取消程式码:

using System;
using System.Linq;
namespace WavDotNet.Core
{
    using FloatSamples = Samples<float>;
    class P
    {
        static void Main()
        {
            var file = new WavFileWrite<float>("output.wav", 9999);
            var sawtoothGen = new Tools.Generators.Sawtooth(9999);
            Func<long, float, FloatSamples> generate = (t, amplitude) => sawtoothGen.Generate32Bit(new TimeSpan(t), 99, amplitude);
            var length = 2500000;
            FloatSamples shortBeep = generate(length, 1),
            longBeep = generate(length * 3, 1),
            shortPause = generate(length * 3, 0),
            longPause = generate(length, 0),
            allSamples = new FloatSamples(new[] { shortBeep, longPause, shortBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, shortPause,
                longBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, shortPause, 
                shortBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, shortPause, 
                shortBeep, longPause, shortBeep, longPause, shortBeep, longPause, shortBeep, longPause, shortBeep }
                .SelectMany(c => c).ToList());
            file.AudioData.Add(new Channel<float>(allSamples, 0)); // 0 == ChannelPositions.Mono
            file.Flush();
        }
    }
}

5

蟒蛇 3 2, 191 188 174 171(无图书馆)

Wav文件非常简单。想要尝试不带库。由于某种原因,我的文件似乎使Windows Media Player崩溃。快速时间作品在文件中途出现错误。使用Audition转换为更大的采样率可以解决此问题。

更新:从Perl答案中实现了一些优化。现在仅输出名称,n并以1000Hz采样。相应地编辑了上面的信息。

w,s=200*" ",50*"~~  "
a,b,c=s+w,3*s+w,2*w
open(*"nw").write("RIFF\xD46\0\0WAVEfmt \20\0\0\0\1\0\1\0\xE8\3\0\0\xE8\3\0\0\1\0\10\0data\xB06\0\0"+a*2+b*3+c+b*5+c+a+b*4+c+a*5)

旧版

w,s=1600*" ",200*"~~~~    "
a,b,c=s+w,3*s+w,2*w
open("n.wav","wb").write("RIFF\244\265\1\0WAVEfmt \20\0\0\0\1\0\1\0@\x1f\0\0@\x1f\0\0\1\0\10\0data\200\265\1\0"+a*2+b*3+c+b*5+c+a+b*4+c+a*5)

4

C#〜485字节

使用Wav.Net库。

using WavDotNet.Core;namespace System.Collections.Generic{using f=Single;class T{static void Main(){var i=new WavFileWrite<f>("x",8000);Func<long,Samples<f>>g=d=>new WavDotNet.Tools.Generators.Sawtooth(8000).Generate32Bit(new TimeSpan(d),600,1);var s=new List<f>();var k="..--- ----- .---- .....";foreach(var c in k){s.AddRange(c=='.'?g(2000000):g(6000000));s.AddRange(new f[1600]);if(c==' '){s.AddRange(new f[3200]);}}i.AudioData.Add(new Channel<f>(new Samples<f>(s),0));i.Flush();}}}

这里的输出。

可读版本,

using WavDotNet.Core;

namespace System.Collections.Generic
{
    using f = Single;

    class T
    {
        static void Main()
        {
            var i = new WavFileWrite<f>("x", 8000);
            Func<long, Samples<f>> g = d => new WavDotNet.Tools.Generators.Sawtooth(8000).Generate32Bit(new TimeSpan(d), 600, 1);
            var s = new List<f>();
            var k = "..--- ----- .---- .....";

            foreach (var c in k)
            {
                s.AddRange(c == '.' ? g(2000000) : g(6000000));
                s.AddRange(new f[1600]);

                if (c == ' ')
                {
                    s.AddRange(new f[3200]);
                }
            }

            i.AudioData.Add(new Channel<f>(new Samples<f>(s), 0));
            i.Flush();
        }
    }
}

您可以通过将类包装在名称空间System.Collections.Generic(实际上有效)中来节省一些字节。您还可以删除一些不必要的空格。
ProgramFOX

4

C#382 333bytes

不使用任何非标准库,写出一个8bits / sample 44100samples / second的wav,我希望是一个有效的头文件(似乎可以在WMP / .NET / Audacity中愉快地播放/加载)。

标头是base64编码的,而莫尔斯电码则被编码为开/关的信号,因为最后5位与第1位相同,因此存储在单个long(64位)中。

结果可以在这里找到

高尔夫代码:

using System.IO;class P{static void Main(){using(var w=new FileStream("w.wav",FileMode.Create)){int i=0,d=9980;w.Write(System.Convert.FromBase64String("UklGRhCCCgBXQVZFZm10IBAAAAABAAEARKwAAESsAAABAAgAZGF0YeyBCgA="),0,44);for(var k=5899114207271221109L;i++<d*69;w.WriteByte((byte)(System.Math.Sin((k>>(i/d)%64&1)*i*0.1)*127+127)));}}}

有评论:

using System.IO;

class P
{
    static void Main()
    {
        using(var w=new FileStream("w.wav",FileMode.Create))
        {
            int i=0,d=9980; // d is samples per tone

            // write wav header
            w.Write(System.Convert.FromBase64String("UklGRhCCCgBXQVZFZm10IBAAAAABAAEARKwAAESsAAABAAgAZGF0YeyBCgA="),0,44);

            for(var k=5899114207271221109L; // 0101000111011101110111010001110111011101110111000111011101110101 as long
                i++<d*69; // 69 is number of bits
                w.WriteByte((byte)(
                    System.Math.Sin(
                        (k>>(i/d)%64&1) // read bit (0 or 1)
                        *i*0.1) // mul by ticker (sin(0) = 0)
                    *127+127)) // make sensible
            );
        }
    }
}

这个挑战不需要文件名以结尾.wav,因此您可以在那里保存4个字节。
ProgramFOX 2015年

将69位PWM代码拟合为64位常量的好方法。我正在尝试类似的方法,但可能无法使用您的方法缩短代码。
nutki 2015年

2

SuperCollider625 605字节

音频编程语言提交!

输出b以AIFF格式写入文件。Windows Media Player无法打开它,但是在VLC Media Player中可以正常工作。生成的文件aOSC文件

c=0;d=0;f={c=c+d;d=0.2;[c,[\s_new,\w,1001,0,0,\freq,800]]};g={c=c+d;d=0.2;[c,[\n_free,1001]]};h={c=c+d;d=0.6;[c,[\s_new,\w,1001,0,0,\freq,800]]};i={c=c+d;d=0.6;[c,[\n_free,1001]]};x=[f.value,g.value,f.value,g.value,h.value,g.value,h.value,g.value,h.value,i.value,h.value,g.value,h.value,g.value,h.value,g.value,h.value,g.value,h.value,i.value,f.value,g.value,h.value,g.value,h.value,g.value,h.value,g.value,h.value,i.value,f.value,g.value,f.value,g.value,f.value,g.value,f.value,g.value,f.value,i.value];Score.recordNRT(x,"morse.osc","Morse2015.aiff");SynthDef("w",{arg freq=440;Out.ar(0,SinOsc.ar(freq,0,0.2))}).writeDefFile;

我创建了一些SuperCollider函数:f生成一声短促的哔哔声,g一小声中断,h一声长哔声和一声i长休。SuperCollider需要每个正弦波的起始位置而不是长度,因此我必须创建函数来生成具有正确起始位置的波,并且每次需要正弦波时都必须调用这些函数。(我无法将特定长度的wave存储在变量中以供重用)。该\w定义在代码块的末尾创建。

在我的Windows计算机上,它没有将音频文件保存在与代码相同的目录中,而是保存在以下目录中:

C:\Users\MyName\AppData\Local\VirtualStore\Program Files (x86)\SuperCollider-3.6.6

结果托管在Dropbox上

带缩进的代码:

c = 0;
d = 0;
f = { c=c+d;d=0.2;[ c, [ \s_new, \w, 1001, 0, 0,  \freq, 800 ] ] };
g = { c=c+d;d=0.2; [ c, [\n_free, 1001]] };
h = { c=c+d;d=0.6; [ c, [ \s_new, \w, 1001, 0, 0, \freq, 800]]};
i = { c=c+d;d=0.6;[ c, [\n_free, 1001]] };

x = [ f.value, g.value, f.value, g.value, h.value, g.value, h.value, g.value, h.value, i.value,
      h.value, g.value, h.value, g.value, h.value, g.value, h.value, g.value, h.value, i.value,
      f.value, g.value, h.value, g.value, h.value, g.value, h.value, g.value, h.value, i.value,
    f.value, g.value, f.value, g.value, f.value, g.value, f.value, g.value, f.value, i.value
];

Score.recordNRT(x, "morse.osc", "Morse2015.aiff");

SynthDef("w",{ arg freq = 440;
    Out.ar(0,
         SinOsc.ar(freq, 0, 0.2)
    )
}).writeDefFile;

2

ChucK- 1195 217 201 147 145 144

ChucK是一种音频编程语言。bitpwner帮助我将其从201字节减少到147字节。

SinOsc s;WvOut w=>blackhole;"y"=>w.wavFilename;int j;for(1016835=>int i;i>0;2/=>i){s=>w;j++;(i%2?200:600)::ms=>now;s=<w;(j%5?200:600)::ms=>now;}

如果嵌入式播放器不适合您,这是指向SoundCloud的直接链接


1
设法用我的答案中使用的类似技巧将其减少到164:WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
矢量化

@bitpwner您正在使用j以避免数组?
KSFT 2015年

1016835二进制数中的魔数为11111000010000000011j仅用于跟踪每个数字之间的暂停2015(每个数字有5种声音)。
矢量化

@bitpwner啊,我什至没有注意到。这是一个很酷的主意!
KSFT 2015年

您可以将其编辑为答案,以获得更高的赏金机会。imo,改进尚不足以证明新答案是正确的,因为您已经完成了查克(Chuck)的大部分工作;)
矢量化2015年

2

Csound,140 + 40 = 180

音频编程语言。

这是乐队的文件:

instr 1
a1 oscil 2^15,990,1
out a1
endin

这是分数文件:

f1 0 512 10 1
t0 300
i1 0 1
i1 2
i1 40
i1 60
i1 62
i1 64
i1 66
i1 68
i1 4 3
i1 8
i1 12
i1 18
i1 22
i1 26
i1 30
i1 34
i1 42
i1 46
i1 50
i1 54

假定没有多余的空格,单行终止符(UNIX)并且在最后一行之后没有终止符,则计算大小。

您可以使用csound命令调用它们:

csound morse.org morse.sco

它将在当前目录中生成一个输出文件,默认情况下名为“ test.aif”

https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq

通过选择较丑陋的波形,我可以剃掉2或3个字节,但是我喜欢传统的莫尔斯正弦波的声音。

PS:我是Csound的新手,任何打高尔夫球的技巧都值得赞赏,尤其是关于得分文件!


啊,我很期待CSound。如果没有人在其中发布答案,我可能会尝试自己写一个。:)
Martin Ender'1

1

脑干,649字节

++[>-[+>++[++<]>]>[>..........-..........+<-]-[+>++[++<]>]>[....................-]<<<<<-]+++[>+++[>-[+>++[++<]>]>[>..........-..........+<-]<<<-]-[+>++[++<]>]>[....................-]<<<-]-[+>++[++<]>]>[....................-]+++++[>-[+>++[++<]>]>[....................-]+++[>-[+>++[++<]>]>[>..........-..........+<-]<<<-]<<<-]+++[>-[+>++[++<]>]>[....................-]<<<-]-[+>++[++<]>]>[>..........-..........+<-]++++[>-[+>++[++<]>]>[....................-]+++[>-[+>++[++<]>]>[>..........-..........+<-]<<<-]<<<-]++[>-[+>++[++<]>]>[....................-]<<<-]+++++[>-[+>++[++<]>]>[....................-]-[+>++[++<]>]>[>..........-..........+<-]<<<<<-]

这将生成一个8位无符号样本序列,可以使用诸如aplayLinux之类的工具以每秒8000个样本的速度播放。归因于BF常数表

在线尝试!

少打些球

DIT DIT DAH DAH DAH
++[>
 -[+>++[++<]>]>[>..........-..........+<-]
 -[+>++[++<]>]>[....................-]
<<<<<-]
+++[>
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
 -[+>++[++<]>]>[....................-]
<<<-]
-[+>++[++<]>]>[....................-]
DAH DAH DAH DAH DAH
+++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
+++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DAH DAH DAH DAH
-[+>++[++<]>]>[>..........-..........+<-]
++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DIT DIT DIT DIT
+++++[>
 -[+>++[++<]>]>[....................-]
 -[+>++[++<]>]>[>..........-..........+<-]
<<<<<-]
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.