Звук термена был увековечен в песне The Beach Boys Good Vibrations . Многие также связывают его звучание с темой оригинальной серии Star Trek , хотя, очевидно, это была эмуляция сопрано .
Эта задача требует от вас реализовать термен .
вход
- Возьмите двумерный ввод с мыши или другого устройства ввода (например, вы можете использовать джойстик), который будет воспроизводить звук с устройства вывода звука следующим образом:
- увеличение х увеличит частоту тона. Обратите внимание, что частота увеличивается экспоненциально с музыкальной нотой, поэтому вы должны реализовать линейную зависимость между положением мыши x и музыкальной нотой, и
- увеличение y увеличит громкость тона.
- По-видимому, существует путаница в отношении формы волны, создаваемой реальным терменом , поэтому для простоты следует использовать синусоидальную волну (или ее близкое приближение).
правила
- Получаемый тон должен иметь диапазон не менее 2 октав. Больше диапазона приемлемо. А-440 должен находиться в пределах досягаемости.
- Чтобы создать слышимый вид бесступенчатой частоты и амплитуды, диапазон значений, рассматриваемых в обоих измерениях от устройства ввода, должен быть не менее 500. Реализации могут открывать окно (не менее 500x500 пикселей) для считывания ввода с позиции курсора мыши. Или, не открывая окно, координаты могут быть считаны непосредственно с мыши или другого устройства ввода.
- Должен быть простой способ остановить программу - комбинация клавиш, щелчок мышью или другое обычное устройство ввода. CTRL-c достаточно.
- Можно использовать любые стандартные библиотеки, если они не полностью реализуют решение, не требуя никакой другой работы.
- Стандартные правила для Code Golf и I / O
- Вы можете остановиться, если мышь или устройство ввода потеряют фокус на поле ввода.
Примечания
- Поскольку выходной тон генерируется динамически, необходимо следить за тем, чтобы тон был непрерывным сигналом; то есть нет слышимых щелчков или треск, вызванных внезапными изменениями фазы или амплитуды.
- Вы можете ограничить зону входного размера до 500 на 500, но она может быть больше.
Это код-гольф , поэтому выигрывает самый короткий ответ на любом языке.
Специальная благодарность
Особая благодарность Digital Trauma за то, что он принял этот вызов и разместил его в Песочнице Secret Santa. Я сделал несколько правок и вот оригинальный пост.
o.type='sine'
не нужен, так как это по умолчанию. Вы можете упроститьdocument.onmousemove
до простоonmousemove
.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)