Biến bàn phím của bạn thành bàn phím


10

Bài tập

Bạn nên viết một chương trình khi nhấn nút, nó sẽ phát ra âm thanh khác nhau cho mỗi phím.

Các khóa mà bạn sẽ sử dụng là:

1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm

Các ghi chú bắt đầu tại Cvà mỗi khóa ở trên thêm một nửa cung.

Hãy làm cho nó một chút dễ dàng hơn cho bạn mặc dù. Bạn có thể chọn giữa 2 nhiệm vụ tương tự,

1) Xuất một ghi chú khác khi nhấn phím tiếp tục cho đến khi nhấn phím khác. Chương trình này chạy vô thời hạn

2) Lấy một chuỗi làm đầu vào chỉ chứa các ký tự ở trên sẽ xuất ra mỗi ghi chú trong đúng 1 giây (cho phép biến thể 0,05 giây)

Đầu vào

  1. Một phím được nhấn
  2. Một chuỗi chỉ chứa các ký hiệu ở trên

Đầu ra

  1. Một nốt nhạc duy nhất phát ra âm thanh cho đến khi nhấn phím khác
  2. Một loạt các ghi chú, mỗi một giây dài

Ghi chú

Letter | Note
-------+-------
   1   |  C
   !   |  C#
   2   |  D
   "   |  D#
   3   |  E
   4   |  F
   $   |  F#
   5   |  G
   %   |  G#
   6   |  A
   ^   |  A#
   7   |  B
   8   |  C
   *   |  C#
   9   |  D
   (   |  D#
   0   |  E
   q   |  F
   Q   |  F#
   w   |  G
   W   |  G#
   e   |  A
   E   |  A#
   r   |  B
   t   |  C    <-- middle C
   T   |  C#
   y   |  D
   Y   |  D#
   u   |  E
   i   |  F
   I   |  F#
   o   |  G
   O   |  G#
   p   |  A
   P   |  A#
   a   |  B
   s   |  C
   S   |  C#
   d   |  D
   D   |  D#
   f   |  E
   g   |  F
   G   |  F#
   h   |  G
   H   |  G#
   j   |  A
   J   |  A#
   k   |  B
   l   |  C
   L   |  C#
   z   |  D
   Z   |  D#
   x   |  E
   c   |  F
   C   |  F#
   v   |  G
   V   |  G#
   b   |  A
   B   |  A#
   n   |  B
   m   |  C

Quy tắc

  • Bạn có thể chọn giữa các nhiệm vụ nhưng vui lòng cho biết câu hỏi nào trong câu trả lời của bạn
  • Bạn được cung cấp một biến thể ± 0,05 giây trong nhiệm vụ 2
  • Mỗi biểu tượng cùng tăng âm bằng 1 nửa cung.
  • Các ghi chú cá nhân được hiển thị ở trên
  • Đây là một nên mã ngắn nhất sẽ thắng

Điều này ban đầu được lấy từ đây với sự đồng ý của caird coinheringaahing


Để mở ngôn ngữ này không có thư viện âm thanh, tôi khuyên dùng định dạng đầu ra thứ ba: tệp WAV chứa đầu ra tùy chọn 2, được ghi vào thiết bị xuất chuẩn. Điều đó sẽ cho phép các mục trong bất kỳ ngôn ngữ có thể in dữ liệu nhị phân.
Ray

Câu trả lời:


6

Python 3, 154 140 byte

from winsound import*
for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),999)

Tôi đã chọn loại nhiệm vụ thứ hai.

Vòng lặp đi qua từng ký tự và tìm chỉ mục của phần tử này trong chuỗi. Chỉ số này là số lượng nửa cung tăng từ Thấp C ('1'). Tính toán tần số mong muốn được thực hiện theo công thức này .

PS Thư viện này chỉ hoạt động trong Windows.

-13 byte nhờ vào các lò nướng.

-1 byte nhờ Jonathan Allan.


1
Bạn có lẽ nên đề cập rằng điều này chỉ hoạt động trên Windows.
hoàn toàn là

1
from winsound import* for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),1000)
Chơi gôn

Nhưng câu hỏi yêu cầu một chương trình ....
Neil A.

Các 0.05dung sai sẽ cho phép bạn sử dụng 999.
Jonathan Allan


3

JavaScript (ES6), 247 hoặc 230 byte

Quyết định thử cả hai lựa chọn.

Đã lưu một vài byte nhờ @darrylyeo vì đã đề xuất withtuyên bố.
Nhờ @ Кирилл Малышев để chỉ ra một vấn đề với .search().

Tùy chọn 1 - Nhập bàn phím, 252 246 247 byte

_=>{c=new AudioContext;q=1;with(c.createOscillator())connect(c.destination),I.oninput=_=>(~(i='1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(I.value,I.value=""))&&(frequency.value=65.4*2**(i/12),q&&start(q=0)))}
<input id=I

Dựa vào phần tử đầu vào nhận chữ cái thực tế được nhập, thay vì mã ký tự. Tập trung phải vào hộp đầu vào.

Tùy chọn 2 - Nhập chuỗi, 234 229 230 byte

s=>{c=new AudioContext;with(c.createOscillator())connect(c.destination),[...s].map((c,i)=>frequency.setValueAtTime(65.4*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(c)/12),i)),start(),stop(s.length)}

Đơn giản chỉ cần lấy chuỗi làm tham số hàm.

Đoạn kết hợp

Tôi đề nghị giảm âm lượng của bạn đang chạy này, nó có thể lớn. Để dừng phát lại, đoạn mã yêu cầu thêm vào o=bên trong mỗi đoạn with(c.createOscillator()).

f= // keyboard input
_=>{c=new AudioContext;q=1;with(o=c.createOscillator())connect(c.destination),I.oninput=_=>(~(i='1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(I.value,I.value=""))&&(frequency.value=65.4*2**(i/12),q&&start(q=0)))}

g= // string input
s=>{c=new AudioContext;with(o=c.createOscillator())connect(c.destination),[...s].map((c,i)=>frequency.setValueAtTime(65.4*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.indexOf(c)/12),i)),start(),stop(s.length)}

swap=_=>{keyboard=!keyboard;A.innerHTML=keyboard?"Keyboard":"String";S.style.display=keyboard?"none":"inline";window.c&&c.close();window.o&&o.stop();keyboard?f():I.oninput=null;I.value="";}
keyboard=0;
swap();
<span id="A"></span> Input:<br>
<input id="I">
<button id="S" onclick="g(I.value)">Run</button><br>
<button onclick="swap()">Swap</button>


Bạn có thể đặt đối tượng dao động trong một withtuyên bố để loại bỏ tất cả các trường hợp o.như thế này:_=>{c=new AudioContext;with(c.createOscillator())connect(c.destination),I.oninput=_=>(~(i='1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.search(I.value,I.value=""))&&(frequency.value=65.4*2**(i/12),r||(start(),r=1)))}
darrylyeo

1
@darrylyeo Cảm ơn, sẽ thực hiện withcâu lệnh, nhưng nó phá vỡ bit cuối cùng ( o.r||(o.start(),o.r=1)) vì tôi đã sử dụng thực tế không o.rđược xác định cho đến thời điểm đó, nhưng bây giờ nó đã bị lỗi do rchưa được khai báo. Hóa ra nó ngắn hơn khi chỉ khai báo biến đó tách biệt với bất kỳ đối tượng nào, vì vậy tôi đã làm điều đó.
Justin Mariner

Khi bạn nhập ký hiệu '$', tần số rất cao được tạo ra.
Кирилл Малышев

@ КириллМалышев Good catch, đó là nguyên nhân .search()xử lý đầu vào như regex. Đã chuyển sang .indexOf().
Justin Mariner

1

AHK , 130 byte

s=1!2"34$5`%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm
Loop,Parse,1
SoundBeep,55*2**((InStr(s,A_LoopField,1)-10)/12),999

Tôi đã chọn phương án 2.

Giải trình:

Lưu trữ chuỗi tìm kiếm dưới dạng biến sngắn hơn thoát khỏi mớ hỗn độn đó trực tiếp trong SoundBeephàm. Tôi đã phải thoát dấu phần trăm vì đó là ký tự thoát cho tên biến nhưng phần còn lại của chuỗi vẫn ổn.

Theo mặc định, biến 1là tham số đầu vào đầu tiên. Việc đưa nó vào một vòng lặp phân tích cú pháp mà không chỉ định một dấu phân cách sẽ dẫn đến mỗi ký tự trong chuỗi đầu vào được phân tích riêng lẻ.

SoundBeep mất một tần số tính bằng Hz và thời lượng tính bằng mili giây và phát nốt đó trong thời gian dài.

Phần thú vị là tìm ra tần số phù hợp. Tham khảo bảng tần số phím đàn piano từ Wikipedia và công thức trên cùng một trang, tôi thấy mã hóa ngắn nhất là sử dụng A 1 làm ghi chú tham chiếu vì tần số của nó là vòng 55 Hz đẹp. Vì chúng tôi muốn bắt đầu tại C 1 , chúng tôi phải điều chỉnh từ A 1 (nốt thứ 13) sang C 1 (nốt thứ 4). Điều đó, cộng với thực tế InStrlà một chỉ mục, là lý do tại sao chúng tôi trừ 10 từ kết quả của InStrhàm.

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.