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 Code-Golf , 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.
o.type='sine'
ist unnötig, da dies die Standardeinstellung ist. Sie könnendocument.onmousemove
es einfach machenonmousemove
.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)