Getaran yang baik

20

Suara theremin telah diabadikan dalam lagu The Beach Boys Good Vibrations . Banyak juga yang mengaitkan suaranya dengan tema untuk seri asli Star Trek , meskipun tampaknya itu adalah emulasi sopran .

Tantangan ini mengharuskan Anda untuk mengimplementasikan theremin .

Memasukkan

  • Ambil input 2 dimensi dari mouse atau perangkat input lainnya (mis. Anda bisa menggunakan joystick), yang akan menghasilkan nada dari perangkat output audio sebagai berikut:
    • meningkatkan x akan meningkatkan frekuensi nada. Perhatikan bahwa frekuensi meningkat secara eksponensial dengan not musik, jadi Anda harus menerapkan hubungan linier antara posisi x mouse dan not musik, dan
    • meningkatkan y akan meningkatkan volume nada.
  • Tampaknya ada kebingungan mengenai bentuk gelombang yang dihasilkan oleh theremin nyata , jadi untuk kesederhanaan, gelombang sinus (atau perkiraan dekatnya) harus digunakan.

Aturan

  • Nada yang dihasilkan harus memiliki setidaknya rentang 2-oktaf. Kisaran lebih dapat diterima. A-440 harus berada dalam jangkauan.
  • Untuk membuat tampilan frekuensi dan amplitudo variabel yang dapat didengar secara terus-menerus, kisaran nilai yang dipertimbangkan dalam kedua dimensi dari perangkat input harus minimal 500 Implementasi dapat membuka jendela (setidaknya 500x500 piksel) untuk membaca input dari posisi kursor mouse. Atau tanpa membuka jendela, koordinat dapat dibaca langsung dari mouse atau perangkat input lainnya.
  • Harus ada cara sederhana untuk menghentikan program - kombinasi tombol, klik mouse atau perangkat input umum lainnya. CTRL-c sudah cukup.
  • Setiap perpustakaan standar dapat digunakan, selama mereka tidak sepenuhnya mengimplementasikan solusi tanpa pekerjaan lain yang diperlukan.
  • Aturan standar untuk Code Golf dan I / O
  • Anda dapat berhenti dengan tetikus atau perangkat input kehilangan fokus pada kotak input.

Catatan

  • Karena nada keluaran dihasilkan secara dinamis, kehati-hatian harus dilakukan untuk memastikan nada tersebut berupa gelombang berkelanjutan; yaitu tidak ada klik atau muncul suara yang disebabkan oleh perubahan fase atau amplitudo yang tiba-tiba.
  • Anda dapat membatasi zona ukuran input hingga 500 oleh 500 tetapi mungkin lebih besar.

Ini , jadi jawaban terpendek dalam bahasa apa pun menang.

Terima kasih khusus

Terima kasih khusus kepada Digital Trauma untuk membuat tantangan ini dan mempostingnya di Sandbox Secret Santa. Saya telah melakukan beberapa pengeditan dan inilah pos aslinya.

Christopher
sumber

Jawaban:

10

JavaScript ES6, 215 188 byte

Ini sepertinya bekerja dengan baik di Chrome dan Edge. Firefox dan Safari tidak banyak.

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)

Disimpan 27 byte berkat @darrylyeo

Cobalah online!

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
sumber
1
Itu cukup bagus! Saya terlalu bersenang
Christopher
2
Terima kasih. Saya pikir ini bahkan lebih menyenangkan dengan gelombang persegi
powelles
1
Mencoba dan hampir kehilangan gendang telinga
Christopher
o.type='sine'tidak perlu karena itu default. Anda dapat menyederhanakan document.onmousemovemenjadi adil onmousemove.
darrylyeo
Ditarik dari 215 hingga 188 byte: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