Vibrazioni positive


20

Il suono del theremin è stato immortalato nella canzone dei The Beach Boys, Good Vibrations . Molti associano anche il suo suono al tema della serie originale di Star Trek , sebbene apparentemente fosse un'emulazione di soprano .

Questa sfida richiede di implementare un theremin .

Ingresso

  • Prendi un input bidimensionale da un mouse o da un altro dispositivo di input (ad esempio potresti usare un joystick), che produrrà un tono da un dispositivo di uscita audio come segue:
    • aumentando x aumenterà la frequenza del tono. Si noti che la frequenza aumenta in modo esponenziale con la nota musicale, quindi è necessario implementare una relazione lineare tra la posizione del mouse x la nota musicale e
    • aumentando y si aumenta il volume del tono.
  • Sembra esserci confusione riguardo alla forma d'onda prodotta da un vero theremin , quindi per semplicità, deve essere usata un'onda sinusoidale (o una sua approssimazione ravvicinata).

Regole

  • Il tono prodotto deve avere un intervallo di almeno 2 ottave. Più gamma è accettabile. L'A-440 deve trovarsi all'interno dell'intervallo.
  • Per creare l'aspetto udibile della frequenza e dell'ampiezza continuamente variabili, l'intervallo di valori considerato in entrambe le dimensioni dal dispositivo di input deve essere almeno 500 Le implementazioni possono aprire una finestra (almeno 500x500 pixel) per leggere l'input dalla posizione del cursore del mouse. O senza aprire una finestra, le coordinate possono essere lette direttamente dal mouse o da un altro dispositivo di input.
  • Ci deve essere un mezzo semplice per interrompere il programma: combinazione di tasti, clic del mouse o altro dispositivo di input comune. CTRL-c è sufficiente.
  • È possibile utilizzare qualsiasi libreria standard, a condizione che non implementino totalmente la soluzione senza richiedere altro lavoro.
  • Regole standard per Code Golf e I / O
  • È possibile interrompere la perdita del focus del mouse o del dispositivo di input sulla casella di input.

Appunti

  • Poiché il tono di uscita viene generato in modo dinamico, è necessario prestare attenzione per garantire che il tono sia una forma d'onda continua; cioè non ci sono clic o pop udibili causati da improvvisi cambiamenti di fase o ampiezza.
  • È possibile limitare la dimensione dell'area di input a 500 per 500, ma potrebbe essere più grande.

Questo è , quindi vince la risposta più breve in qualsiasi lingua.

Ringraziamenti speciali

Un ringraziamento speciale a Digital Trauma per aver raccolto questa sfida e averla pubblicata nella Secret Santa's Sandbox. Ho apportato alcune modifiche ed ecco il post originale.

Risposte:


10

JavaScript ES6, 215 188 byte

Questo sembra funzionare bene in Chrome e Edge. Firefox e Safari non 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)

Salvato 27 byte grazie a @darrylyeo

Provalo 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>


1
Questo è abbastanza buono! Mi sono divertito troppo
Christopher

2
Grazie. Penso che sia ancora più divertente con un a onda quadra
Powelles

1
Provandolo e perdendo un timpano
Christopher

o.type='sine'non è necessario poiché è l'impostazione predefinita. Puoi semplificare document.onmousemovesolo onmousemove.
darrylyeo

Golfato da 215 a 188 byte: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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.