Âm thanh của từ


11

Mọi người đã viết nhiều thứ cho phép một thứ được hình dung như một thứ khác. Bây giờ tôi đề nghị có thể dịch thư sang nhạc! Công việc của bạn là viết một chương trình lấy một tệp văn bản và xuất ra một tệp âm thanh với mỗi chữ cái được chuyển đổi thành một ghi chú cụ thể từ đó C3-C8.

Tuyên bố miễn trừ trách nhiệm - Tôi thực sự không mong đợi âm nhạc phát ra âm thanh hay nhưng tôi hy vọng sẽ ngạc nhiên.

Thông số kỹ thuật

  • Bạn lấy tên của một tệp là một chuỗi và BPM (nhịp mỗi phút) là một int
  • Bạn viết hoa Ađể làm ghi chúC3
  • Và đi lên nửa bước cho mỗi nhân vật sau theo thứ tự này: ABCDEFGHIJKLMNOPQRSTUVWXYZ ()-,;.'"abcdefghijklmnopqrstuvwxyz
  • Có, không phải mọi nhân vật sẽ được sử dụng vì nó kéo dài quá nhiều quãng tám.
  • Bạn dịch mọi ký tự trong tệp theo cách này
  • Đặt các ghi chú lại với nhau tại BPM đã cho dưới dạng ghi chú quý
  • Lưu dưới dạng tệp âm thanh (Tôi đoán midi sẽ là dễ nhất, nhưng mọi thứ đều ổn) hoặc chơi nó
  • Bất kỳ định dạng đầu vào lành mạnh là tốt
  • Không có sơ hở tiêu chuẩn
  • Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Tiền thưởng

  • Cho phép hoán đổi đầu ra - 50 byte
  • Cho phép nhiều bản nhạc được chồng lên nhau bằng cách lấy nhiều tệp - 75 byte
  • Nối các chữ cái liên tiếp vào một ghi chú dài hơn - 50 byte

Chỉnh sửa: Wow, chúng tôi có điểm số âm. Tôi sẽ công bố người chiến thắng vào thứ bảy.


Khi nào bạn sẽ quyết định người chiến thắng?
LegionMammal978

Chúng ta có thể cho rằng đầu vào sẽ không chứa bất kỳ ký tự không được liệt kê nào không? Hoặc, chúng ta nên làm gì khi gặp phải những nhân vật chưa được liệt kê?
apsillers

@apsillers Trong Snap ! Trả lời, anh ta nói rằng anh ta cho phép hành vi không xác định.
LegionMammal978

Tôi đã tải lên một mẫu; bạn đã hoàn toàn chính xác, nó thực sự nghe không hay chút nào ...
Sanchise

Câu trả lời:


6

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

Đầu vào mẫu

Sản lượng mẫu

Tạo ra sóng âm thanh sin thuần túy, rất vui nhộn (răng cưa cũng có thể, với số điểm thậm chí còn tốt hơn, nhưng âm thanh đó hơi ... quá vui nhộn). Hoạt động như một hàm, do đó, mong đợi nó là một mảng ký tự ( ['abc';'def']) với một hàng trên mỗi 'rãnh'. Tôi nghĩ rằng nó được bao phủ trong 'bất kỳ định dạng đầu vào lành mạnh nào' , nhưng nếu sự đồng thuận chung là tôi cần đọc một tệp, tôi cho rằng tôi có thể thay đổi nó. Đầu vào ilà các rãnh văn bản (có độ dài bằng nhau), bnhịp mỗi phút và tchuyển vị (cung cấp 0 cho không chuyển đổi). Nó pha trộn hai sin thành một bằng cách bù đắp đầu vào sin, vì vậy tôi nhận được cả ba phần thưởng, cho tôi điểm âm.

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

Phiên bản sử dụng tệp đầu vào: 211-175 = 36

Đối số đầu vào ibây giờ đại diện cho tên tệp, các tham số khác không thay đổi. Có thể không hoạt động trên các bản phát hành mới hơn vì tôi nhận được cảnh báo textreadcó thể sớm bị từ chối. EDIT: textread rõ ràng sẽ tự động tách ra tại các khoảng trắng, vì vậy tôi đã sửa nó. Ngoài ra, tôi nghĩ rằng tôi có thể đã vô tình liên lạc với một số người ngoài hành tinh với những âm thanh kỳ lạ được tạo ra trong khi thử nghiệm.

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

Những phiên bản nào bạn thích? :)


Chà, thông số kỹ thuật nói rõ ràng là lấy đầu vào từ một tập tin ...
LegionMammal978

@ LegionMammal978 Nếu bạn nhấn mạnh: .matcác tệp có định dạng đầu vào lành mạnh. Tạo một tệp .mat với biến 'i' có văn bản của bạn. Sau đó, thêm load(i);vào đầu dòng 2 của phiên bản hàng đầu. Điểm: -16 + 8 = -8. Tôi sẽ làm điều này khi bình luận của bạn được nhiều upvotes hơn tôi, hoặc khi OP có một ý kiến :)
Sanchises

4

Chộp lấy ! - 401 - 75 = 326

Hãy thử trực tuyến tại đây.

Tôi đang sử dụng phương pháp đếm byte cho chương trình.

nhập mô tả hình ảnh ở đây

Tôi đã thêm chơi nhiều âm thanh cùng một lúc.

Cấu trúc cơ bản giống như bản gốc (xem bên dưới), nhưng có thêm launch{}. launch{}bắt đầu một chủ đề mới với mã bên trong, cho phép đồng thời.

Mã dưới dạng văn bản là:

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

Mã gốc, 308.

nhập mô tả hình ảnh ở đây

Chụp may mắn! có chơi MIDI tích hợp .;)

Thật không may, nó không có indexOfchức năng, vì vậy tôi phải thực hiện một cuộc gọi JavaScript bên ngoài, khá tốn kém.

Các repeat () (#)khối xuất phát từ thư viện lặp.

Mã này có thể được viết ra dưới dạng văn bản như thế này, đó là cách tôi nhận được 308 byte:

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 có bộ sưu tập / giới thiệu mà bạn có thể thêm những thứ này để thích Scratch không? Liên kết trực tiếp đến phiên bản có thể chạy sẽ là IMO tiện dụng.
Geobits

Đúng. Tôi đã thêm một liên kết đến dự án của tôi. Ý tưởng tốt. :)
Scimonster

Nó bỏ qua -1từ indexOf? Ngay bây giờ có vẻ như nếu nó không nằm trong chuỗi, nó có midi số 47.
Maltysen

@Maltysen Câu hỏi không bao giờ nói phải làm gì với đầu vào ngoài phạm vi thích hợp.
Scimonster

Thật. Tôi có nghĩa là để nó bị bỏ qua nhưng vì tôi đoán đó là lỗi của tôi vì không đủ cụ thể, tôi sẽ cho phép nó.
Maltysen

4

Toán học, 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}]]/@#]&

Đưa ra danh sách các tệp đầu vào, BPM và số nửa bước để chuyển đổi bằng cách nhập và phát âm thanh (từ piano, bất kỳ nhạc cụ nào khác sẽ mất nhiều byte hơn.) Nghe không tệ lắm!


1

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

Đầu tiên, đây là đoạn mã có thể chạy được sử dụng <input>các trường thay vì đọc tệp:

<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>

Và bây giờ, mục thực tế:

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)})}

Ba đối số là một chuỗi các chuỗi filepath để phát đồng thời, ghi chú mỗi phút và số nửa bước để chuyển đổi tất cả các đầu vào.

Với khoảng trắng và bình luận:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.