Rung động tốt


20

Âm thanh của Theremin đã được bất tử trong bài hát Good rung động của The Beach Boys . Nhiều người cũng liên kết âm thanh của nó với chủ đề cho loạt Star Trek nguyên bản , mặc dù rõ ràng đó là sự mô phỏng của một giọng nữ cao .

Thử thách này đòi hỏi bạn phải thực hiện một Theremin .

Đầu vào

  • Lấy đầu vào 2 chiều từ chuột hoặc thiết bị đầu vào khác (ví dụ: bạn có thể sử dụng cần điều khiển), sẽ tạo ra âm báo từ thiết bị đầu ra âm thanh như sau:
    • tăng x sẽ tăng tần số của âm. Lưu ý rằng tần số tăng theo cấp số nhân với nốt nhạc, vì vậy bạn phải thực hiện mối quan hệ tuyến tính giữa vị trí chuột x và nốt nhạc và
    • tăng y sẽ tăng âm lượng của âm.
  • Dường như có sự nhầm lẫn về dạng sóng được tạo ra bởi một trị liệu thực , do đó, để đơn giản, phải sử dụng sóng hình sin (hoặc gần đúng của chúng).

Quy tắc

  • Âm được tạo ra phải có ít nhất một phạm vi 2 quãng tám. Nhiều phạm vi được chấp nhận. A-440 phải nằm trong phạm vi.
  • Để tạo sự xuất hiện rõ ràng của tần số và biên độ biến thiên liên tục, phạm vi giá trị được xem xét ở cả hai chiều từ thiết bị đầu vào phải có ít nhất 500 Triển khai có thể mở một cửa sổ (ít nhất 500x500 pixel) để đọc đầu vào từ vị trí con trỏ chuột. Hoặc không mở cửa sổ, tọa độ có thể được đọc trực tiếp từ chuột hoặc thiết bị đầu vào khác.
  • Phải có một phương tiện đơn giản để dừng chương trình - tổ hợp phím, nhấp chuột hoặc thiết bị đầu vào phổ biến khác. CTRL-c là đủ.
  • Bất kỳ thư viện tiêu chuẩn nào cũng có thể được sử dụng, miễn là chúng không hoàn toàn thực hiện giải pháp mà không yêu cầu công việc nào khác.
  • Các quy tắc chuẩn cho Code GolfI / O
  • Bạn có thể dừng bằng cách để chuột hoặc thiết bị đầu vào mất tập trung vào hộp nhập.

Ghi chú

  • Bởi vì âm đầu ra được tạo động, nên phải cẩn thận để đảm bảo âm đó là dạng sóng liên tục; đó là không có tiếng click hoặc pops gây ra bởi sự thay đổi đột ngột của pha hoặc biên độ.
  • Bạn có thể giới hạn vùng kích thước đầu vào là 500 bằng 500 nhưng nó có thể lớn hơn.

Đây là , vì vậy câu trả lời ngắn nhất trong bất kỳ ngôn ngữ nào đều thắng.

Cảm tạ

Đặc biệt cảm ơn Digital Trauma vì đã thực hiện thử thách này và đăng nó trong Sandbox của Secret Santa. Tôi đã thực hiện một vài chỉnh sửa và đây là bài viết gốc.

Câu trả lời:


10

JavaScript ES6, 215 188 byte

Điều này dường như hoạt động tốt trong Chrome và Edge. Firefox và Safari không quá nhiều.

with(new AudioContext)o=createOscillator(onmousemove=e=>{o.frequency.value=9/innerWidth*e.x**2,v.gain.value=1-e.y/innerHeight}),v=createGain(),v.connect(destination),o.start(),o.connect(v)

Đã lưu 27 byte nhờ @darrylyeo

Hãy thử trực tuyến!

with(new AudioContext)o=createOscillator(onmousemove=e=>{o.frequency.value=9/innerWidth*e.x**2,v.gain.value=1-e.y/innerHeight}),v=createGain(),v.connect(destination),o.start(),o.connect(v)
<button onClick="o.stop()">Stop</button>


1
Đó là khá tốt! Tôi đã có quá nhiều niềm vui
Christopher

2
Cảm ơn. Tôi nghĩ nó thậm chí còn vui hơn với một sóng vuông
powelles

1
Dùng thử và mất màng nhĩ
Christopher

o.type='sine'là không cần thiết vì nó là mặc định. Bạn có thể đơn giản hóa document.onmousemoveđể chỉ onmousemove.
darrylyeo

Được đánh gôn từ 215 đến 188 byte:with(new AudioContext)o=createOscillator(onmousemove=e=>{o.frequency.value=9/innerWidth*e.x**2,v.gain.value=1-e.y/innerHeight}),v=createGain(),v.connect(destination),o.start(),o.connect(v)
darrylyeo
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.