Хорошие колебания

20

Звук термена был увековечен в песне 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. Я сделал несколько правок и вот оригинальный пост.

Кристофер
источник

Ответы:

10

JavaScript ES6, 215 188 байт

Похоже, это хорошо работает в Chrome и Edge. Firefox и Safari не так уж и много.

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)

Сохранено 27 байт благодаря @darrylyeo

Попробуйте онлайн!

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>

powelles
источник
1
Это очень хорошо! Мне было слишком весело
Кристофер
2
Благодарю. Я думаю, что это еще веселее с прямоугольной волной
Пауэлл
1
Испытывая это и о потерянной барабанной перепонке
Кристофер
o.type='sine'не нужен, так как это по умолчанию. Вы можете упростить document.onmousemoveдо просто onmousemove.
Даррильо
Гольф от 215 до 188 байт: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