좋은 진동


20

The Beach Boys의 노래 Good Vibrations 에서 저기 의 소리 가 불멸되었습니다 . 많은 사람들이 그 사운드를 스타 트랙 오리지널 시리즈의 주제와 연관 짓지소프라노의 에뮬레이션 인 것 같습니다 .

이 도전은 당신이 theremin 을 구현해야합니다 .

입력

  • 마우스 또는 다른 입력 장치 (예 : 조이스틱을 사용할 수 있음)에서 2 차원 입력을 가져 오면 다음과 같이 오디오 출력 장치에서 톤이 생성됩니다.
    • x를 증가 시키면 톤의 주파수가 증가합니다. 음표에 따라 주파수가 기하 급수적으로 증가하므로 마우스 x 위치와 음표 사이에 선형 관계를 구현해야합니다.
    • y를 높이면 톤의 음량이 증가합니다.
  • 실수에 의해 생성 된 파형과 관련하여 혼동 되는 것으로 보이 므로, 단순화를 위해 사인파 (또는 그 근사)를 사용해야한다.

규칙

  • 생성 된 톤은 최소 2 옥타브 범위를 가져야합니다. 더 많은 범위가 허용됩니다. A-440은 범위 내에 있어야합니다.
  • 연속적으로 가변적 인 주파수 및 진폭의 가청 외관을 생성하기 위해, 입력 장치로부터의 두 차원에서 고려되는 값의 범위는 500 이상이어야한다. 구현은 마우스 커서 위치로부터 입력을 판독하기 위해 윈도우 (최소 500x500 픽셀)를 열 수있다. 또는 창을 열지 않고 마우스 나 다른 입력 장치에서 직접 좌표를 읽을 수 있습니다.
  • 키 조합, 마우스 클릭 또는 기타 일반적인 입력 장치 등 프로그램을 중지 할 수있는 간단한 방법이 있어야합니다. CTRL-c로 충분합니다.
  • 다른 작업이 필요없이 솔루션을 완전히 구현하지 않는 한 모든 표준 라이브러리를 사용할 수 있습니다.
  • 코드 골프I / O에 대한 표준 규칙
  • 마우스 나 입력 장치가 입력 상자에 초점을 잃게하여 중지 할 수 있습니다.

노트

  • 출력 톤이 동적으로 생성되므로 톤이 연속 파형인지 확인해야합니다. 즉, 위상이나 진폭의 갑작스러운 변화로 인해 들리는 클릭이나 팝이 없습니다.
  • 입력 크기 영역을 500 x 500으로 제한 할 수 있지만 더 클 수 있습니다.

이것은 이므로 모든 언어에서 가장 짧은 답변이 이깁니다.

특별한 감사

이 도전에 도전하고 Secret Santa 's Sandbox에 게시 한 Digital Trauma에게 특별한 감사를드립니다. 몇 가지 수정 작업을 수행했으며 여기 에 원래 게시물이 있습니다.

답변:


10

자바 스크립트 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
감사. 나는 그것이 심지어 더 재미 있다고 생각 구형파로
powelles

1
시도해 고막을 잃어버린
Christopher

o.type='sine'기본값이므로 불필요합니다. 당신은 document.onmousemove그냥 단순화 할 수 있습니다 onmousemove.
darrylyeo

(215) 188 바이트에서 Golfed :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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.