Перетворіть клавіатуру в клавіатуру


10

Завдання

Ви повинні написати програму, яка при натисканні кнопки видає різний звук для кожної клавіші.

Ключами, які ви будете використовувати, є:

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

Нотатки починаються одразу, Cі кожна клавіша зверху додає один півтон.

Нехай це полегшить вам трохи легше. Ви можете вибрати між двома подібними завданнями,

1) Виберіть іншу примітку при натисканні клавіші, яка продовжується, поки не буде натиснута інша клавіша. Ця програма працює нескінченно

2) Візьміть рядок як вхідний текст, який містить лише символи вище, які будуть виводити кожну ноту рівно за 1 секунду (дозволено варіацію 0,05 секунди)

Вхідні дані

  1. Натискається клавіша
  2. Одина рядок, що містить лише символи, наведені вище

Вихідні дані

  1. Єдина музична нота, яка звучить до натискання іншої клавіші
  2. Серія приміток, кожна по 1 секунді

Примітки

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

Правила

  • Ви можете вибирати між завданнями, але будь ласка, скажіть, яке з ваших відповідей
  • У задачі 2 вам задано варіацію ± 0,05 секунди
  • Кожен символ по кроках збільшує тон на 1 півтона.
  • Окремі нотатки показані вище
  • Це тому виграє найкоротший код

Спочатку це було взято з тут з Керд coinheringaahing в згоді


Щоб відкрити це для мов, у яких немає бібліотеки аудіо, я рекомендую третій формат виводу: файл WAV, що містить вихід 2 варіанту, записаний у stdout. Це дозволить записувати будь-якою мовою, яка може друкувати двійкові дані.
Рей

Відповіді:


6

Python 3, 154 140 байт

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

Я обрав другий тип завдання.

Цикл проходить через кожен символ і шукає індекс цього елемента в рядку. Цей показник - кількість півтону вище від низького С ('1'). Розрахунок потрібної частоти проводиться за цією формулою .

PS Ця бібліотека працює лише в Windows.

-13 байт завдяки ов.

-1 байт завдяки Джонатану Аллану.


1
Вам, мабуть, слід згадати, що це працює лише в Windows.
повністюлюдський

1
Golfed до 141 байт:from winsound import* for i in input():Beep(int(65.406*2**('1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm'.find(i)/12)),1000)
овс

Але питання задало програму ....
Ніл А.

0.05Допуск повинен дозволити вам використовувати 999.
Джонатан Аллан


3

JavaScript (ES6), 247 або 230 байт

Вирішили спробувати обидва варіанти.

Збережено кілька байт завдяки @darrylyeo за пропозицію withзаяви.
Дякуємо @ Кирилл Малышев, що вказав на проблему .search().

Варіант 1 - Введення клавіатури, 252 246 247 байт

_=>{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

Покладається на елемент введення, який отримує фактичну букву, а не коди символів. Фокус повинен бути у вікні введення.

Варіант 2 - Введення рядків, 234 229 230 байт

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

Просто приймає рядок як параметр функції.

Комбінований фрагмент

Я пропоную зменшити гучність, виконуючи це, це може бути голосно. Щоб зупинити відтворення, фрагмент вимагає додавання o=всередині кожного 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>


Ви можете поставити об’єкт осцилятора в withзаяві, щоб o._=>{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)))}
виграти

1
@darrylyeo Спасибі, реалізує withзаяву, але він порушує останній біт ( o.r||(o.start(),o.r=1)), оскільки я використовував той факт, який o.rне визначений до цього моменту, але тепер він помилок, оскільки rне був оголошений. Виявляється, було коротше просто оголосити цю змінну окремо від будь-яких об'єктів, тому я це зробив.
Джастін Марінер

Коли ви вводите символ "$", утворюється дуже висока частота.
Кирилл Малышев

@ КириллМалышев Хороший улов, це спричиняє .search()введення як регулярний вираз. Переключено на .indexOf().
Джастін Марінер

1

AHK , 130 байт

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

Я вибрав варіант 2.

Пояснення:

Збереження рядка пошуку як змінної sбуло коротше, ніж уникнути цього безладу безпосередньо у SoundBeepфункції. Мені довелося уникати знаку відсотка, оскільки це символ втечі для імен змінних, але решта рядка в порядку, як є.

За замовчуванням змінна 1є першим вхідним параметром. Подання цього циклу розбору без зазначення роздільника призведе до того, що кожен символ вхідного рядка буде проаналізований окремо.

SoundBeep приймає частоту в Гц і тривалість в мілісекундах і відтворює цю ноту так довго.

Веселою частиною було з'ясування правильних частот. Посилаючись на таблицю частот ключових фортепіано з Вікіпедії та формулу на одній сторінці, я виявив, що найкоротшим кодуванням було використання A 1 в якості опорної ноти, оскільки частота - це хороший круглий 55 Гц. Оскільки ми хочемо почати з C 1 , ми повинні перейти від A 1 (13-а примітка) до C 1 (4-та нота). Це, плюс той факт, що InStrє одноіндексованим, тому ми віднімаємо 10 від результату InStrфункції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.