Boas vibrações

20

O som do theremin foi imortalizado na música Good Vibrations, do The Beach Boys . Muitos também associam seu som ao tema da série original de Star Trek , embora aparentemente tenha sido uma emulação de soprano .

Esse desafio requer que você implemente um termo .

Entrada

  • Obtenha entrada bidimensional de um mouse ou outro dispositivo de entrada (por exemplo, você pode usar um joystick), que produzirá um tom a partir de um dispositivo de saída de áudio da seguinte maneira:
    • aumentar x aumentará a frequência do tom. Observe que a frequência aumenta exponencialmente com a nota musical; portanto, você deve implementar uma relação linear entre a posição x do mouse e a nota musical e
    • aumentar y aumentará o volume do tom.
  • Parece haver confusão em relação à forma de onda produzida por um theremin real ; portanto, para simplificar, uma onda senoidal (ou uma aproximação aproximada da mesma) deve ser usada.

Regras

  • O tom produzido deve ter pelo menos uma faixa de 2 oitavas. Mais alcance é aceitável. O A-440 deve estar dentro da faixa.
  • Para criar a aparência audível de frequência e amplitude continuamente variáveis, o intervalo de valores considerado em ambas as dimensões do dispositivo de entrada deve ser de pelo menos 500 Implementações podem abrir uma janela (pelo menos 500x500 pixels) para ler a entrada da posição do cursor do mouse. Ou, sem abrir uma janela, as coordenadas podem ser lidas diretamente do mouse ou de outro dispositivo de entrada.
  • Deve haver um meio simples para interromper o programa - combinação de teclas, clique do mouse ou outro dispositivo de entrada comum. CTRL-c é suficiente.
  • Quaisquer bibliotecas padrão podem ser usadas, desde que não implementem totalmente a solução sem nenhum outro trabalho necessário.
  • Regras padrão para Code Golf e I / O
  • Você pode parar deixando o mouse ou o dispositivo de entrada perder o foco na caixa de entrada.

Notas

  • Como o tom de saída é gerado dinamicamente, é necessário ter cuidado para garantir que o tom seja uma forma de onda contínua; ou seja, não há cliques ou estalos sonoros causados ​​por mudanças repentinas de fase ou amplitude.
  • Você pode limitar a zona de tamanho de entrada para 500 por 500, mas pode ser maior.

Isso é , então a resposta mais curta em qualquer idioma vence.

Agradecimentos especiais

Agradecimentos especiais ao Digital Trauma por fazer esse desafio e publicá-lo na Sandbox do Papai Noel Secreto. Fiz algumas edições e aqui está o post original.

Christopher
fonte

Respostas:

10

JavaScript ES6, 215 188 bytes

Isso parece funcionar bem no Chrome e Edge. Firefox e Safari nem 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 graças a @darrylyeo

Experimente online!

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
fonte
1
Isso é muito bom! Eu tive demasiado divertimento
Christopher
2
Obrigado. Eu acho que é ainda mais divertido com um com uma onda quadrada
powelles
1
Tentá-lo para fora e aproximadamente perdeu um tímpano
Christopher
o.type='sine'é desnecessário, pois é o padrão. Você pode simplificar document.onmousemovepara apenas onmousemove.
31517 darrylyeo
Golfed 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 31/03