Pozytywne Wibracje

20

Dźwięk tamtej pamięci został uwieczniony w piosence The Beach Boys Good Vibrations . Wiele osób kojarzy też jego brzmienie z tematem oryginalnej serii Star Trek , choć najwyraźniej była to emulacja sopranu .

To wyzwanie wymaga wdrożenia Theremin .

Wejście

  • Weź dwuwymiarowe wejście z myszy lub innego urządzenia wejściowego (np. Możesz użyć joysticka), który wytworzy dźwięk z urządzenia wyjściowego audio w następujący sposób:
    • zwiększenie x zwiększy częstotliwość tonu. Zauważ, że częstotliwość rośnie wykładniczo wraz z nutą muzyczną, dlatego musisz zaimplementować liniową zależność między pozycją myszy x i nutą, a
    • zwiększenie y zwiększy głośność tonu.
  • Wydaje się, że istnieje zamieszanie dotyczące kształtu fali wytwarzanej przez prawdziwą tamminę , więc dla uproszczenia należy zastosować falę sinusoidalną (lub jej przybliżenie).

Zasady

  • Wytworzony ton musi mieć zakres co najmniej 2 oktaw. Dopuszczalny jest większy zasięg. A-440 musi znajdować się w zasięgu.
  • Aby stworzyć słyszalny wygląd bezstopniowej częstotliwości i amplitudy, zakres wartości branych pod uwagę w obu wymiarach z urządzenia wejściowego musi wynosić co najmniej 500 Implementacje mogą otworzyć okno (co najmniej 500 x 500 pikseli) w celu odczytania danych wejściowych z pozycji kursora myszy. Lub bez otwierania okna współrzędne można odczytać bezpośrednio z myszy lub innego urządzenia wejściowego.
  • Musi istnieć prosty sposób zatrzymania programu - kombinacja klawiszy, kliknięcie myszą lub inne popularne urządzenie wejściowe. CTRL-c jest wystarczające.
  • Można używać dowolnych standardowych bibliotek, o ile nie wdrażają one całkowicie rozwiązania bez konieczności wykonywania innych czynności.
  • Standardowe zasady dla Code Golf i I / O
  • Możesz przerwać, gdy mysz lub urządzenie wejściowe przestaną być aktywne w polu wprowadzania.

Uwagi

  • Ponieważ ton wyjściowy jest generowany dynamicznie, należy zachować ostrożność, aby zapewnić ciągły przebieg fali; oznacza to, że nie ma słyszalnych kliknięć ani trzasków spowodowanych nagłymi zmianami fazy lub amplitudy.
  • Możesz ograniczyć strefę rozmiaru wejściowego do 500 na 500, ale może być większa.

To jest , więc wygrywa najkrótsza odpowiedź w dowolnym języku.

Szczególne podziękowania

Specjalne podziękowania dla Digital Trauma za podjęcie tego wyzwania i opublikowanie go w Piaskownicy Sekretnego Mikołaja. Wprowadziłem kilka zmian i oto oryginalny post.

Krzysztof
źródło

Odpowiedzi:

10

JavaScript ES6, 215 188 bajtów

Wydaje się, że działa to dobrze w Chrome i Edge. Firefox i Safari nie tak bardzo.

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)

Zaoszczędź 27 bajtów dzięki @darrylyeo

Wypróbuj 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
źródło
1
To całkiem nieźle! Świetnie się bawiłem
Christopher
2
Dzięki. Myślę, że jest jeszcze bardziej zabawnie z falą kwadratową
powelles
1
Wypróbowanie tego i stracenie błony bębenkowej
Christopher
o.type='sine'jest niepotrzebny, ponieważ jest domyślny. Możesz uprościć document.onmousemovepo prostu onmousemove.
darrylyeo
Grał w golfa od 215 do 188 bajtów: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