เสียงของคำ


11

ผู้คนเขียนหลายสิ่งหลายอย่างเพื่อให้มองเห็นสิ่งหนึ่ง ตอนนี้ฉันขอเสนอความสามารถในการแปลจดหมายเป็นเพลง! C3-C8งานของคุณในการเขียนโปรแกรมที่ใช้ไฟล์ข้อความและเอาท์พุทไฟล์เสียงที่มีตัวอักษรแต่ละตัวแปลงที่จะต้องทราบที่เฉพาะเจาะจงจาก

ข้อสงวนสิทธิ์ - ฉันไม่คาดหวังว่าเพลงจะฟังดูดี แต่ฉันหวังว่าจะประหลาดใจ

ข้อมูลจำเพาะ

  • คุณใช้ชื่อของไฟล์เป็นสตริงและBPM (ครั้งต่อนาที) เป็น int
  • คุณทำให้ตัวพิมพ์ใหญ่Aเป็นบันทึกย่อC3
  • และขึ้นไปครึ่งขั้นสำหรับตัวละครทุกตัวหลังจากตามลำดับนี้: ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • ใช่ไม่ใช่ว่าทุกตัวละครจะใช้ตั้งแต่นั้นจะขยายอ็อกเทฟมากเกินไป
  • คุณแปลอักขระทุกตัวในไฟล์ด้วยวิธีนี้
  • วางบันทึกย่อไว้ด้วยกันที่ BPM ที่กำหนดเป็นบันทึกย่อรายไตรมาส
  • บันทึกเป็นไฟล์เสียง (ฉันคาดเดา midi จะเป็นวิธีที่ง่ายที่สุด แต่ก็ไม่เป็นไร) หรือเล่น
  • รูปแบบการป้อนข้อมูลใด ๆ ที่เป็นปกติ
  • ไม่มีช่องโหว่มาตรฐาน
  • นี่คือรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

โบนัส

  • อนุญาตให้transposingของการส่งออก - 50 ไบต์
  • อนุญาตให้ซ้อนทับแทร็กหลายแทร็กโดยถ่ายหลายไฟล์ - 75 ไบต์
  • เข้าร่วมจดหมายที่ต่อเนื่องกันในบันทึกย่ออีกหนึ่ง - 50 ไบต์

แก้ไข:ว้าวเรามีคะแนนติดลบ ฉันจะประกาศผู้ชนะในวันเสาร์


คุณจะตัดสินใจเลือกผู้ชนะเมื่อใด
LegionMammal978

เราสามารถสมมติว่าการป้อนข้อมูลจะไม่มีตัวอักษรที่ไม่แสดงหรือไม่? หรือเราควรทำอย่างไรเมื่อพบตัวละครที่ไม่แสดง
apsillers

@apsillers ในพริบตา! คำตอบเขาบอกว่าเขาอนุญาตพฤติกรรมที่ไม่ได้กำหนด
LegionMammal978

ฉันอัพโหลดตัวอย่าง คุณค่อนข้างถูกต้องก็จริงๆไม่ได้เสียงที่ดีใด ๆ ...
Sanchises

คำตอบ:


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อาจเลิกใช้เร็ว ๆ นี้ แก้ไข: ข้อความที่เห็นได้ชัดแยกโดยอัตโนมัติที่ช่องว่างดังนั้นฉันคงที่ นอกจากนี้ฉันคิดว่าฉันอาจติดต่อเอเลี่ยนบางตัวโดยบังเอิญด้วยเสียงแปลก ๆ ที่ทำขณะทำการทดสอบ

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ไฟล์เป็นรูปแบบอินพุตที่มีเหตุผล สร้างไฟล์. mat ด้วยตัวแปร 'i' ที่มีข้อความของคุณ จากนั้นเพิ่มload(i);ที่จุดเริ่มต้นของบรรทัด 2 ของเวอร์ชันยอดนิยม คะแนน: -16 + 8 -8= ฉันจะทำเช่นนี้เมื่อความคิดเห็นของคุณได้รับ upvotes มากกว่าเหมืองหรือเมื่อสหกรณ์มีความเห็น :)
Sanchises

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

ป้อนคำอธิบายรูปภาพที่นี่

Lucky Snap! มีการเล่น 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 หรือไม่? การเชื่อมโยงโดยตรงไปยังเวอร์ชันที่รันได้จะเป็นประโยชน์ใน IMO
Geobits

ใช่. ฉันเพิ่มลิงค์ไปยังโครงการของฉัน ความคิดที่ดี. :)
Scimonster

มันไม่สนใจ-1จากindexOf? ตอนนี้ดูเหมือนว่าหากไม่ได้ในสตริงก็ไม่จำนวน midi 47
Maltysen

@ Maltysen คำถามที่ไม่เคยบอกว่าจะทำอย่างไรกับการป้อนข้อมูลนอกช่วงที่เหมาะสม
Scimonster

จริง ฉันตั้งใจจะให้มันถูกเพิกเฉย แต่เนื่องจากฉันเดาว่ามันเป็นความผิดของฉันที่ไม่เจาะจงพอฉันจะอนุญาต
Maltysen

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.