人们写了很多东西,允许把一件事想象成另一件事。现在我建议能把字母翻译成音乐!您的工作是编写一个程序,该程序接受一个文本文件,并输出一个声音文件,并将每个字母转换为来自C3-C8的特定音符。
免责声明-我并不期望音乐听起来很好,但我希望能感到惊讶。
A变成便笺C3ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz。编辑:哇,我们有负分数。我将在星期六宣布获胜者。
发布于 2015-04-08 14:52:08
产生纯粹的正弦波,非常时髦(锯齿也是可能的,有更好的分数,但听起来有点.太时髦了)。作为函数工作,因此期望它是一个字符数组(['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使用输入文件的
输入参数i现在表示文件名,其他参数不变。可能对较新的版本不起作用,因为我收到了一个警告,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你更喜欢哪个版本?:)
发布于 2015-04-07 22:56:52
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,以及作为输入并播放声音(从钢琴,任何其他乐器将花费更多字节)的半步转换的数目。听起来没那么糟!
发布于 2015-04-08 16:17:34
首先,下面是一个可运行的片段,它使用<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)https://codegolf.stackexchange.com/questions/48522
复制相似问题