良い振動


20

テルミンの音は、ザ・ビーチ・ボーイズの歌「グッド・バイブレーションズ」で不滅ですソプラノのエミュレーションであるように見えますが、多くの人はその音をスタートレックのオリジナルシリーズのテーマとも関連付けています

この課題では、テルミンを実装する必要があります。

入力

  • マウスまたは他の入力デバイス(たとえば、ジョイスティックを使用できます)から2次元入力を取得します。これにより、オーディオ出力デバイスから次のようなトーンが生成されます。
    • xを大きくすると、トーンの周波数が高くなります。周波数は音符で指数関数的に増加するため、マウスのx位置と音符の間に線形関係を実装する必要があります。
    • yを大きくすると、トーンの音量が大きくなります。
  • 実際のテルミンによって生成される波形に関して混乱があるように見えるので、簡単にするために、正弦波(またはその近似値)を使用する必要があります。

ルール

  • 生成されるトーンには、少なくとも2オクターブの範囲が必要です。より多くの範囲が許容されます。A-440は範囲内になければなりません。
  • 連続的に変化する周波数と振幅の可聴外観を作成するには、入力デバイスの両方の次元で考慮される値の範囲は少なくとも500でなければなりません。または、ウィンドウを開かずに、マウスまたは他の入力デバイスから座標を直接読み取ることができます。
  • プログラムを停止するには、キーの組み合わせ、マウスクリック、またはその他の一般的な入力デバイスなどの簡単な手段が必要です。CTRL-cで十分です。
  • 他の作業を必要とせずにソリューションを完全に実装しない限り、任意の標準ライブラリを使用できます。
  • コードゴルフI / Oの標準ルール
  • マウスまたは入力デバイスが入力ボックスにフォーカスを失うことで停止する場合があります。

ノート

  • 出力トーンは動的に生成されるため、トーンが連続波形であることを確認するように注意する必要があります。つまり、位相または振幅の突然の変化によって引き起こされる可聴クリックやポップ音はありません。
  • 入力サイズゾーンを500 x 500に制限することもできますが、それより大きくすることもできます。

これはなので、どの言語でも最短の答えが勝ちです。

特別な感謝

この挑戦をし、秘密のサンタのサンドボックスに投稿してくれたデジタルトラウマに感謝します。私はいくつかの編集を行いましたが、ここに元の投稿があります。

回答:


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
それはかなり良いです!私はあまりにも楽しかった
クリストファー

2
ありがとう。私はそれがでもっと楽しいと思う方形波で
powelles

1
試してみて、鼓膜を失った
クリストファー

o.type='sine'デフォルトであるため、不要です。あなたは簡単にすることができるdocument.onmousemoveだけにonmousemove
-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)
ダリーリオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.