Buenas vibraciones

20

El sonido del theremin ha sido inmortalizado en la canción de The Beach Boys Good Vibrations . Muchos también asocian su sonido con el tema de la serie original de Star Trek , aunque aparentemente fue una emulación de soprano .

Este desafío requiere que implemente un theremin .

Entrada

  • Tome la entrada bidimensional de un mouse u otro dispositivo de entrada (por ejemplo, podría usar un joystick), que producirá un tono desde un dispositivo de salida de audio de la siguiente manera:
    • aumentar x aumentará la frecuencia del tono. Tenga en cuenta que la frecuencia aumenta exponencialmente con la nota musical, por lo que debe implementar una relación lineal entre la posición del mouse x y la nota musical, y
    • al aumentar y aumentará el volumen del tono.
  • Parece haber confusión con respecto a la forma de onda producida por un theremin real , por lo que, por simplicidad, debe usarse una onda sinusoidal (o una aproximación cercana de la misma).

Reglas

  • El tono producido debe tener al menos un rango de 2 octavas. Más rango es aceptable. A-440 debe estar dentro del rango.
  • Para crear la apariencia audible de frecuencia y amplitud continuamente variables, el rango de valores considerado en ambas dimensiones desde el dispositivo de entrada debe ser de al menos 500 Implementaciones pueden abrir una ventana (al menos 500x500 píxeles) para leer la entrada desde la posición del cursor del mouse. O sin abrir una ventana, las coordenadas pueden leerse directamente desde el mouse u otro dispositivo de entrada.
  • Debe haber un medio simple para detener el programa: combinación de teclas, clic del mouse u otro dispositivo de entrada común. CTRL-c es suficiente.
  • Se puede usar cualquier biblioteca estándar, siempre que no implementen totalmente la solución sin ningún otro trabajo requerido.
  • Reglas estándar para Code Golf y I / O
  • Puede detenerse haciendo que el mouse o el dispositivo de entrada pierdan el foco en el cuadro de entrada.

Notas

  • Debido a que el tono de salida se genera dinámicamente, se debe tener cuidado para garantizar que el tono sea una forma de onda continua; es decir, no hay clics o pops audibles causados ​​por cambios repentinos de fase o amplitud.
  • Puede limitar la zona de tamaño de entrada a 500 por 500 pero puede ser más grande.

Este es el , por lo que gana la respuesta más corta en cualquier idioma.

Gracias especiales

Un agradecimiento especial a Digital Trauma por hacer este desafío y publicarlo en el Secret Santa's Sandbox. He hecho algunas ediciones y aquí está la publicación original.

Christopher
fuente

Respuestas:

10

JavaScript ES6, 215 188 bytes

Esto parece funcionar bien en Chrome y Edge. Firefox y Safari no tanto.

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)

Guardado 27 bytes gracias a @darrylyeo

Pruébalo en línea!

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
fuente
1
Eso es bastante bueno! Me divertí demasiado
Christopher
2
Gracias. Creo que es aún más divertido con una con una onda cuadrada
powelles
1
Probándolo y perdiendo un tímpano
Christopher
o.type='sine'es innecesario ya que es el predeterminado. Puedes simplificar document.onmousemovea solo onmousemove.
darrylyeo
Golfó de 215 a 188 bytes: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