Хороші вібрації


20

Звук херману був увічнений у пісні The Beach Boys Good Vibrations . Багато хто також пов'язує її звучання з темою оригінальної серії « Зоряний шлях» , хоча, мабуть, це була емуляція сопрано .

Цей виклик вимагає від вас реалізувати термін .

Вхідні дані

  • Візьміть двовимірний вхід від миші або іншого пристрою введення (наприклад, ви можете використовувати джойстик), який видаватиме сигнал від аудіовиходу пристрою таким чином:
    • збільшення x збільшить частоту тону. Зауважте, що частота збільшується експоненціально з музичною нотою, тому вам потрібно реалізувати лінійну залежність між положенням миші x та музичною нотою, і
    • збільшення y збільшить гучність тону.
  • Схоже, виникає плутанина щодо форми хвиль, що створюється справжнім терміном , тому для простоти необхідно використовувати синусоїду (або її близьке наближення).

Правила

  • Вироблений тон повинен мати принаймні 2-октавний діапазон. Більш широкий асортимент прийнятний. А-440 повинен лежати в межах діапазону.
  • Для того, щоб створити чутливий вигляд безперервно змінної частоти та амплітуди, діапазон значень, що розглядаються в обох вимірах від пристрою введення, повинен бути не менше 500 Реалізація може відкрити вікно (щонайменше 500х500 пікселів) для зчитування вводу з положення курсору миші. Або не відкриваючи вікно, координати можуть зчитуватися безпосередньо з миші чи іншого пристрою введення.
  • Для зупинки програми повинен бути простий засіб - комбінація клавіш, клацання миші або інший загальний пристрій введення. CTRL-c є достатнім.
  • Будь-які стандартні бібліотеки можуть бути використані до тих пір, поки вони повністю не реалізують рішення, не вимагаючи інших робіт.
  • Стандартні правила для Code Golf та I / O
  • Ви можете зупинитись, якщо миша чи пристрій введення втрачають фокус на поле введення.

Примітки

  • Оскільки вихідний тон динамічно генерується, слід подбати про те, щоб тон був безперервною формою хвилі; тобто немає чутних клацань або спливів, викликаних раптовими змінами фази або амплітуди.
  • Ви можете обмежити зону розміру вводу до 500 на 500, але вона може бути більшою.

Це , тому найкоротша відповідь будь-якою мовою виграє.

Особлива подяка

Особлива подяка Digital Trauma за те, що вона зробила цей виклик та опублікувала його в таємній пісочниці Санти. Я зробив декілька правок, і ось оригінальний пост.

Відповіді:


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>


1
Це досить добре! Мені було дуже забавно
Крістофер

2
Спасибі. Я думаю, що це ще веселіше з квадратною хвилею
powelles

1
Пробуючи це про втрату вушної раковини
Крістофер

o.type='sine'є непотрібним, оскільки це за замовчуванням. Ви можете спростити document.onmousemoveпросто onmousemove.
darrylyeo

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