Bonnes vibrations

20

Le son du theremin a été immortalisé dans la chanson Good Vibrations des Beach Boys . Beaucoup associent également son son au thème de la série originale de Star Trek , bien qu'il s'agisse apparemment d'une émulation de soprano .

Ce défi vous oblige à implémenter un theremin .

Contribution

  • Prenez une entrée bidimensionnelle à partir d'une souris ou d'un autre périphérique d'entrée (par exemple, vous pouvez utiliser un joystick), qui produira une tonalité à partir d'un périphérique de sortie audio comme suit:
    • augmenter x augmentera la fréquence de la tonalité. Notez que la fréquence augmente de façon exponentielle avec la note de musique, vous devez donc implémenter une relation linéaire entre la position x de la souris et la note de musique, et
    • augmenter y augmentera le volume de la tonalité.
  • Il semble y avoir une confusion concernant la forme d'onde produite par un vrai theremin , donc pour plus de simplicité, une onde sinusoïdale (ou une approximation proche de celle-ci) doit être utilisée.

Règles

  • La tonalité produite doit avoir au moins une plage de 2 octaves. Une plus grande portée est acceptable. L'A-440 doit se trouver dans la plage.
  • Afin de créer l'apparence audible d'une fréquence et d'une amplitude variables en continu, la plage de valeurs considérée dans les deux dimensions à partir du périphérique d'entrée doit être d'au moins 500.Les implémentations peuvent ouvrir une fenêtre (au moins 500x500 pixels) pour lire l'entrée à partir de la position du curseur de la souris. Ou sans ouvrir une fenêtre, les coordonnées peuvent être lues directement à partir de la souris ou d'un autre périphérique d'entrée.
  • Il doit y avoir un moyen simple d'arrêter le programme - combinaison de touches, clic de souris ou autre périphérique d'entrée commun. CTRL-c est suffisant.
  • Toutes les bibliothèques standard peuvent être utilisées, tant qu'elles n'implémentent pas totalement la solution sans autre travail requis.
  • Règles standard pour Code Golf et I / O
  • Vous pouvez arrêter en laissant la souris ou le périphérique d'entrée perdre le focus sur la zone de saisie.

Remarques

  • Comme la tonalité de sortie est générée dynamiquement, il faut veiller à ce que la tonalité soit une forme d'onde continue; c'est-à-dire qu'il n'y a pas de clics ou de claquements audibles causés par des changements soudains de phase ou d'amplitude.
  • Vous pouvez limiter la zone de taille d'entrée à 500 par 500 mais elle peut être plus grande.

C'est le , donc la réponse la plus courte dans n'importe quelle langue l'emporte.

Remerciement spécial

Un merci spécial à Digital Trauma pour avoir relevé ce défi et l'avoir affiché dans le Sandbox du Secret Santa. J'ai fait quelques modifications et voici le message d'origine.

Christophe
la source

Réponses:

10

JavaScript ES6, 215 188 octets

Cela semble bien fonctionner dans Chrome et Edge. Firefox et Safari pas tellement.

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 octets enregistrés grâce à @darrylyeo

Essayez-le en ligne!

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
la source
1
C'est plutôt bien! Je me suis beaucoup trop amusé
Christopher
2
Merci. Je pense que c'est encore plus amusant avec une onde carrée
powelles
1
Essayer et perdre un tympan
Christopher
o.type='sine'est inutile car c'est la valeur par défaut. Vous pouvez document.onmousemovesimplement simplifier onmousemove.
darrylyeo
Golfé de 215 à 188 octets: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