Gute Stimmung


20

Der Klang des Theremin wurde in The Beach Boys Song Good Vibrations verewigt . Viele assoziieren seinen Sound auch mit dem Thema der Originalserie von Star Trek , obwohl es anscheinend eine Sopran-Emulation war .

Für diese Herausforderung müssen Sie ein Theremin implementieren .

Eingang

  • Nehmen Sie zweidimensionale Eingaben von einer Maus oder einem anderen Eingabegerät (z. B. einem Joystick) auf, wodurch ein Ton von einem Audioausgabegerät wie folgt erzeugt wird:
    • Durch Erhöhen von x wird die Frequenz des Tons erhöht. Beachten Sie, dass die Frequenz mit der Musiknote exponentiell ansteigt. Sie müssen daher eine lineare Beziehung zwischen der Position der Maus x und der Musiknote und implementieren
    • Durch Erhöhen von y wird die Lautstärke des Tons erhöht.
  • Es scheint Verwirrung hinsichtlich der Wellenform zu geben, die von einem realen Theremin erzeugt wird , so dass der Einfachheit halber eine Sinuswelle (oder eine enge Annäherung davon) verwendet werden muss.

Regeln

  • Der erzeugte Ton muss mindestens einen Bereich von 2 Oktaven haben. Mehr Reichweite ist akzeptabel. A-440 muss im Bereich liegen.
  • Um ein hörbares Erscheinungsbild von kontinuierlich variabler Frequenz und Amplitude zu erzeugen, muss der Wertebereich, der in beiden Dimensionen vom Eingabegerät berücksichtigt wird, mindestens 500 betragen. Durch Implementierungen kann ein Fenster (mindestens 500 x 500 Pixel) geöffnet werden, um Eingaben von der Mauszeigerposition zu lesen. Oder ohne ein Fenster zu öffnen, können Koordinaten direkt von der Maus oder einem anderen Eingabegerät gelesen werden.
  • Es muss ein einfaches Mittel geben, um das Programm zu stoppen - Tastenkombination, Mausklick oder ein anderes gängiges Eingabegerät. STRG-c ist ausreichend.
  • Es können alle Standardbibliotheken verwendet werden, sofern sie die Lösung nicht vollständig implementieren, ohne dass weitere Arbeiten erforderlich sind.
  • Standardregeln für Code Golf und I / O
  • Sie können anhalten, indem die Maus oder das Eingabegerät den Fokus auf das Eingabefeld verlieren.

Anmerkungen

  • Da der Ausgangston dynamisch generiert wird, muss darauf geachtet werden, dass der Ton eine kontinuierliche Wellenform ist. Das heißt, es gibt keine hörbaren Klicks oder Knackgeräusche, die durch plötzliche Änderungen der Phase oder Amplitude verursacht werden.
  • Sie können die Eingabegrößenzone auf 500 mal 500 begrenzen, sie kann jedoch größer sein.

Das ist , also gewinnt die kürzeste Antwort in jeder Sprache.

Besonderen Dank

Besonderer Dank geht an Digital Trauma, die diese Herausforderung angenommen und in der Sandbox des geheimen Weihnachtsmanns veröffentlicht haben. Ich habe ein paar Änderungen vorgenommen und hier ist der ursprüngliche Beitrag.

Antworten:


10

JavaScript ES6, 215 188 Bytes

Dies scheint in Chrome und Edge gut zu funktionieren. Firefox und Safari nicht so sehr.

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 Bytes dank @darrylyeo eingespart

Probieren Sie es 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
Das ist ziemlich gut Ich hatte viel zu viel Spaß
Christopher

2
Vielen Dank. Ich denke, es macht noch mehr Spaß mit einem mit einer Rechteckwelle
Powelles

1
Probieren Sie es aus und verloren ein Trommelfell
Christopher

o.type='sine'ist unnötig, da dies die Standardeinstellung ist. Sie können document.onmousemovees einfach machen onmousemove.
darrylyeo

Golf von 215 bis 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.