良好的振动


20

Theremin的声音在The Beach Boys歌曲中永垂不朽 Good Vibrations”中。许多人还将其声音与原始《星际迷航》系列的主题相关联,尽管显然这是女高音的模仿

这个挑战要求您实施Theremin

输入值

  • 从鼠标或其他输入设备(例如,可以使用操纵杆)进行二维输入,这将从音频输出设备产生音调,如下所示:
    • 增加x将增加音调的频率。请注意,频率随着音符呈指数增加,因此必须在鼠标x位置和音符之间实现线性关系,并且
    • 增加y将增加音调的音量。
  • 真实的人体产生的波形似乎有些混乱,因此,为简单起见,必须使用正弦波(或其近似)。

规则

  • 产生的音调必须至少具有2个八度音阶范围。更大的范围是可以接受的。A-440必须在范围内。
  • 为了创建连续可变的频率和幅度的可听外观,从输入设备的两个维度考虑的值范围必须至少为500。实现可以打开一个窗口(至少500x500像素)以从鼠标光标位置读取输入。或者不打开窗口,就可以直接从鼠标或其他输入设备读取坐标。
  • 必须有一种简单的方法来停止程序-组合键,鼠标单击或其他常用输入设备。CTRL-c就足够了。
  • 可以使用任何标准库,只要它们无需其他工作即可完全实现解决方案即可。
  • Code GolfI / O的标准规则
  • 您可能会因为鼠标或输入设备失去对输入框的关注而停止。

笔记

  • 由于输出音是动态生成的,因此必须注意确保音是连续波形。即不会因相位或振幅的突然变化而引起咔嗒声或爆裂声。
  • 您可以将输入大小区域限制为500 x 500,但可能更大。

这是,因此任何语言中的最短答案都可以胜出。

特别感谢

特别感谢Digital Trauma提出的挑战并将其发布在Secret Santa's Sandbox中。我做了一些编辑,是原始帖子。

Answers:


10

JavaScript的ES6,215个 188字节

这似乎在Chrome和Edge中运作良好。Firefox和Safari没那么多。

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节省了27个字节

在线尝试!

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
很好!我
Christopher

2
谢谢。我认为使用矩形波
鲍威尔

1
尝试并消除耳膜
Christopher

o.type='sine'因为它是默认值,所以不必要。您可以简化document.onmousemoveonmousemove
darrylyeo

从215字节提高到188字节: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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.