задача
Вы должны написать программу, которая при нажатии кнопки выводит различный звук для каждой клавиши.
Ключи, которые вы будете использовать:
1!2"34$5%6^78*9(0qQwWeErtTyYuiIoOpPasSdDfgGhHjJklLzZxcCvVbBnm
Примечания начинаются с, C
и каждая клавиша выше добавляет один полутон.
Позволяет сделать это немного легче для вас, хотя. Вы можете выбрать между 2 одинаковыми задачами,
1) Выводит другую ноту при нажатии клавиши, которая продолжается до нажатия другой клавиши. Эта программа работает бесконечно
2) Возьмите строку в качестве входных данных, которая содержит только символы выше, которые будут выводить каждую ноту ровно в течение 1 секунды (допускается изменение 0,05 секунды)
вход
- Нажатие клавиши
- Одна строка, содержащая только символы выше
Вывод
- Отдельная музыкальная нота, которая звучит до нажатия другой клавиши
- Серия заметок, каждая длиной 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 в согласии
Ответы:
Python 3,
154140 байтЯ выбрал второй тип задачи.
Цикл проходит через каждый символ и ищет индекс этого элемента в строке. Этот индекс представляет собой число полутонов вверх от низкого C ('1'). Расчет желаемой частоты производится по этой формуле .
PS Эта библиотека работает только в Windows.
-13 байт благодаря овс.
-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)
0.05
Допуск должен позволить вам использовать999
.JavaScript (ES6), 247 или 230 байт
Решили опробовать оба варианта.
Сохранено несколько байтов, спасибо @darrylyeo за предложение
with
.Спасибо @ Кирилл Малышев за указание на проблему с
.search()
.Вариант 1 - ввод с клавиатуры,
252246247 байтПолагается на элемент ввода, получающий введенную букву вместо кодов символов. Фокус должен быть на поле ввода.
Вариант 2 - строковый ввод,
234229230 байтовПросто принимает строку в качестве параметра функции.
Комбинированный фрагмент
Я предлагаю убавить громкость при этом, это может быть громко. Чтобы остановить воспроизведение, сниппет требовал добавления
o=
внутри каждогоwith(c.createOscillator())
.источник
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)))}
with
оператор, но он прерывает последний бит (o.r||(o.start(),o.r=1)
), так как я использовал тот факт, которыйo.r
не определен до этого момента, но теперь он выдает ошибки, такr
как не был объявлен. Оказалось, что было короче просто объявить эту переменную отдельно от любых объектов, поэтому я сделал это..search()
обрабатывает ввод как регулярное выражение. Перешел на.indexOf()
.AHK , 130 байт
Я выбрал вариант 2.
Объяснение:
Хранение строки поиска в качестве переменной
s
было короче, чем выход из этого беспорядка непосредственно вSoundBeep
функции. Мне пришлось экранировать знак процента, так как это escape-символ для имен переменных, но остальная часть строки в порядке, как есть.По умолчанию переменная
1
является первым входным параметром. Ввод этого в цикл синтаксического анализа без указания разделителя приведет к тому, что каждый символ входной строки будет проанализирован индивидуально.SoundBeep
принимает частоту в Гц и длительность в миллисекундах и воспроизводит эту ноту в течение этого времени.Самое интересное было выяснить правильные частоты. Ссылаясь на таблицу частот клавиш пианино из Википедии и формулу на той же странице, я обнаружил, что самое короткое кодирование - это использование A 1 в качестве справочной информации, потому что его частота - хороший круговой 55 Гц. Поскольку мы хотим начать с C 1 , нам нужно перейти от A 1 (13-я нота) к C 1 (4-я нота). Это, плюс тот факт, что
InStr
это одноиндексное, - вот почему мы вычитаем 10 из результатаInStr
функции.источник