言语之声


11

人们写了很多东西,使一件东西可视化为另一件。现在,我建议能够将字母翻译成音乐!您的工作是编写一个程序,该程序需要一个文本文件并输出一个声音文件,并将每个字母转换成一个特定的音符C3-C8

免责声明-我实际上并不期望音乐听起来不错,但我希望对此感到惊讶。

技术指标

  • 您将文件名作为字符串,并将BPM(每分钟心跳数)作为整数。
  • 您使大写A成为笔记C3
  • 然后按以下顺序为每个字符上半步: ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • 是的,因为跨度过多,所以不会使用每个字符。
  • 您以这种方式翻译文件中的每个字符
  • 以给定的BPM将这些笔记放在一起作为四分音符
  • 要么另存为声音文件(我猜Midi将是最简单的,但是一切正常)或播放它
  • 任何理智的输入格式都可以
  • 标准漏洞
  • 这是代码高尔夫球,因此以字节为单位的最短代码胜出!

奖金

  • 允许转置输出-50字节
  • 通过获取多个文件,允许多个轨道相互叠加-75字节
  • 将连续字母连接成一个较长的音符-50个字节

编辑:哇,我们的分数是负数。我将在周六宣布获胜者。


您什么时候决定获胜者?
LegionMammal978

我们可以假设输入中将不包含任何未列出的字符吗?或者,遇到未列出的字符该怎么办?
apsillers 15-4-8

@apsillers在瞬间回答,他说他将允许未定义的行为。
LegionMammal978

我上传了一个样本;您说得很对,听起来真的没什么好……
Sanchises 2015年

Answers:


6

MATLAB,159-50-50-75 = -16

样品输入

样品输出

产生纯正弦的声波,非常时髦(也可以锯齿,具有更高的分数,但是听起来有点…… 时髦了)。可作为函数使用,因此希望它是一个字符数组(['abc';'def']),每个“磁道”都有一行。我认为这涵盖在“任何理智的输入格式”下,但是如果普遍的共识是我需要读取文件,那么我想可以对其进行更改。输入的i是文本轨道(等长),b每分钟的节拍数和t移调(未移调时为0)。它通过抵消正弦输入将两个正弦混合为一个,因此我获得了全部三个奖金,给了我一个负数。

function v(i,b,t)
s=0;for r=1:size(i)
o=[];for k=i(r,:)
o=cat(2,o,sin(55*pi*2^((k-28+t)/12)*(numel(o)/2^13+(0:1/2^13:60/b))));end
s=s+o;end
sound(s/max(s))
end

使用输入文件的版本:211-175 = 36

输入参数i现在代表文件名,其他参数不变。可能不适用于较新的版本,因为我收到一条警告,该警告textread可能很快就会被弃用。编辑:textread显然会自动在空白处拆分,因此我将其修复。另外,我认为我可能不小心将测试过程中发出的奇怪声音与某些外星人联系了。

function v(i,b,t)
i=textread(i,'%s','whitespace','','delimiter','\n');s=0;for r=1:size(i)
o=[];for k=i{r,:}
o=cat(2,o,sin(55*pi*2^((k-28+t)/12)*(numel(o)/2^13+(0:1/2^13:60/b))));end
s=s+o;end
sound(s/max(s))
end

您喜欢哪个版本?:)


好吧,规范明确指出要从文件中获取输入...
LegionMammal978

@ LegionMammal978如果您坚持认为:.mat文件采用合理的输入格式。使用包含您的文本的'i'变量创建一个.mat文件。然后,load(i);在最高版本的第2行的开头添加。得分:-16 + 8 = -8。当您的评论比我的评论更多时,或者在OP有意见时,我
会这样做

4

快点-401-75 = 326

在这里在线尝试。

我正在使用这种为程序计数字节的方法

在此处输入图片说明

我添加了一次播放多个声音的功能。

基本结构与原始结构相同(见下文),但增加了launch{}launch{}使用内部代码启动一个新线程,并发。

文本代码为:

set[c v]to[ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
set[l v]to(list>
ask[BPM]and wait
set tempo to(answer)bpm
repeat until<(answer)=[
ask[notes]and wait
add(answer)to(l
end
delete(last v)of(l
for each(i)of(l
launch{
repeat(length of(i))(#
play note(i(c)(letter(#)of(i)))for(0.25)beats

(i(h)(n))
report(call(JavaScript function ([h][n]) {[return h.indexOf(n)+48]})with inputs(h)(n

原始代码308。

在此处输入图片说明

幸运快照!内置MIDI播放功能。

不幸的是,它没有indexOf功能,因此我必须进行外部JavaScript调用,这非常昂贵。

repeat () (#)块来自迭代库。

代码可以像这样写成文本,这就是我得到308个字节的方式:

set[c v]to[ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
ask[BPM]and wait
set tempo to(answer)bpm
ask[notes]and wait
repeat(length of(answer))(#)
play note(i(c)(letter(#)of(answer)))for(0.25)beats

(i(h)(n))
report(call(JavaScript function ([h][n]) {[return h.indexOf(n)+48]})with inputs(h)(n

SNAP是否有收藏/展示柜,您可以像Scratch一样添加它们?直接链接到可运行的版本将很方便。
Geobits,2015年

是。我向我的项目添加了一个链接。好主意。:)
Scimonster's

是否忽略-1indexOf?现在看来,如果它不在字符串中,它的编号是
47。– Maltysen

@Maltysen问题从来没有说过在适当范围之外的输入该怎么办。
Scimonster 2015年

真正。我的意思是要忽略它,但是由于我猜这是我的错,因为我不够具体,所以我允许它。
Maltysen 2015年

4

Mathematica,219-50-75-50 = 44

c=CharacterRange;d=Import;EmitSound[Function[b,Sound[Split@Characters@d@b/.a:{__String}:>SoundNote[StringPosition[c["A","Z"]<>" ()-,;.'\""<>c["a","z"],a[[1]]][[1,1]]+#3-12,60Length@a/#2],{0,60StringLength@d@b/#2}]]/@#]&

接收输入文件,BPM和要转移的半步数的列表作为输入并播放声音(从钢琴,任何其他乐器会占用更多字节。)听起来还不错!


1

JavaScript(ES6)377-50-50-75 = 202

首先,这是一个使用<input>字段而不是文件读取的可运行代码段:

<b>BMP:</b> <input id="bpm" size=3 placeholder="BMP" value="120"> <b>Transpose:</b> <input size=3 id="transpose" placeholder="Transpose" value="0"><br/><br/><div id="tracks" style="float:left;padding-right:5px;"><input placeholder="Track" class="track"></div><button id="add">Add Additional Track</button><div style="clear:both; padding-top:5px;"></div><button id="play"><b>Play</b></button><script>f=function(s,b,z){C=new (window.AudioContext||window.webkitAudioContext);b=6e4/b;s.map(function(p){var o=C.createOscillator(t=setTimeout);o.connect(C.destination);o.start();p.split("").map(function(c,i){t(function(){o.frequency.value=440*Math.pow(2, ("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12)},b*i)});t(function(){o.stop()},p.length*b)})};document.getElementById("play").onclick=function(){f([].map.call(document.getElementsByClassName("track"),function(e){return e.value;}),+document.getElementById("bpm").value,+document.getElementById("transpose").value);};document.getElementById("add").onclick=function(){var i=document.createElement("input");i.placeholder="Track";i.className="track";document.getElementById("tracks").appendChild(document.createElement("br"));document.getElementById("tracks").appendChild(i);};</script>

现在,实际输入:

f=(n,b,z)=>{C=new AudioContext;b=6e4/b;s=n.map(m=>(x=new XMLHttpRequest,x.open("GET",m,0),x.send(),x.responseText));s.map(p=>{var o=C.createOscillator(t=setTimeout);o.connect(C.destination);o.start();[...p].map((c,i)=>t(_=>o.frequency.value=440*Math.pow(2,("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12),b*i)),t(_=>o.stop(),p.length*b)})}

这三个参数是要同时播放的文件路径字符串数组,每分钟的音符以及转置所有输入的半步数。

带有空格和注释:

f=(n,b,z)=>{
    C=new AudioContext;
    b=6e4/b;

    // fill s with the contents of each file
    s = n.map(m=>(x=new XMLHttpRequest,x.open("GET",m,0),x.send(),x.responseText));

    // play each track
    s.map(p=>{
        var o=C.createOscillator(t=setTimeout);
        o.connect(C.destination);
        o.start();

        // queue up each note with setTimeout
        [...p].map((c,i)=>
            t(_=>
                o.frequency.value=440*
                    Math.pow(2,
                            ("ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'\"abcdefghijklmnopqrstuvwxyz".indexOf(c)-21+z)/12
                    ),
             b*i)
        );
        // queue up termination of those track
        t(_=>o.stop(),p.length*b)})
}

f(["file:///home/users/apsillers/notes.txt",
   "file:///home/users/apsillers/notes2.txt"],
  240, 5)
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.