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 golf de code , 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.
o.type='sine'
est inutile car c'est la valeur par défaut. Vous pouvezdocument.onmousemove
simplement simplifieronmousemove
.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)