首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >言语之声

言语之声
EN

Code Golf用户
提问于 2015-04-07 06:26:05
回答 3查看 518关注 0票数 11

人们写了很多东西,允许把一件事想象成另一件事。现在我建议能把字母翻译成音乐!您的工作是编写一个程序,该程序接受一个文本文件,并输出一个声音文件,并将每个字母转换为来自C3-C8的特定音符。

免责声明-我并不期望音乐听起来很好,但我希望能感到惊讶。

Specifications

  • 以文件名为字符串,以BPM (每分钟拍数)为int。
  • 你把大写的A变成便笺C3
  • 然后按照以下顺序为每个字符增加半步:ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • 是的,不是每个字符都会被使用,因为它跨越了太多的八度音阶。
  • 以这种方式翻译文件中的每个字符。
  • 在给定的BPM上将音符合并为四分之一音符。
  • 要么保存为声音文件(我猜midi将是最简单的,但任何事情都可以)或播放它
  • 任何正常的输入格式都可以。
  • 标准漏洞
  • 这是代码-高尔夫,所以最短的字节代码获胜!

奖金

  • 允许输出的转置 - 50字节
  • 通过接受多个文件-75个字节,允许多个音轨相互叠加。
  • 将连续字母连接到一个较长的便笺中- 50字节

编辑:哇,我们有负分数。我将在星期六宣布获胜者。

EN

回答 3

Code Golf用户

回答已采纳

发布于 2015-04-08 14:52:08

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

样本输入

样本输出

产生纯粹的正弦波,非常时髦(锯齿也是可能的,有更好的分数,但听起来有点.太时髦了)。作为函数工作,因此期望它是一个字符数组(['abc';'def']),每个“跟踪”有一行。我认为这是在“任何合理的输入格式”下讨论的,但如果普遍的共识是,我需要阅读一个文件,我想我可以修改它。输入i是文本音轨(长度相等)、每分钟b拍数和t转置音(不转置时提供0)。它通过抵消正弦输入将两个正弦混合成一个,所以我得到了所有三个奖金,给了我一个负面的分数。

代码语言:javascript
运行
复制
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可能很快就会被弃用。编辑:极端显然是自动分裂在白空间,所以我修正了。此外,我想我可能是偶然接触到了一些外星人在测试时发出的奇怪声音。

代码语言:javascript
运行
复制
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

你更喜欢哪个版本?:)

票数 6
EN

Code Golf用户

发布于 2015-04-07 22:56:52

Mathematica,219 - 50 - 75 - 50 = 44

代码语言:javascript
运行
复制
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,以及作为输入并播放声音(从钢琴,任何其他乐器将花费更多字节)的半步转换的数目。听起来没那么糟!

票数 4
EN

Code Golf用户

发布于 2015-04-08 16:17:34

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

首先,下面是一个可运行的片段,它使用<input>字段而不是文件读取:

代码语言:javascript
运行
复制
<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>

现在,实际的条目:

代码语言:javascript
运行
复制
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)})}

这三个参数是要并发播放的文件路径字符串数组、每分钟音符和转换所有输入的半步数。

带空格和注释:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/48522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档