Wyjście dźwięku o określonej częstotliwości


25

To dość proste wyzwanie, ale nie mogłem znaleźć żadnego pytania, które byłoby do niego podobne. Wyzwanie polega na przyjęciu częstotliwości przy użyciu STDIN lub jej odpowiednika, a następnie wygenerowaniu tonu pasującego do tej częstotliwości, w Hz, przez 5 sekund. Na przykład

Input: 400
Output: (a tone of 400 Hz with a duration of 5 seconds)

Zasady

  • Dane wejściowe muszą być pobierane za pośrednictwem STDIN lub odpowiednika w Twoim języku
  • Odpowiedź musi być pełnym programem
  • Wbudowane mogą być używane
  • Częstotliwość będzie wynosić od 50 do 5000 Hz
  • Odtwarzanie musi być odtwarzane przez 5 sekund
  • Wyjście musi mieć postać fali sinusoidalnej

Przypadki testowe

Wkład: 440

Wydajność:

Wkład: 200

Wydajność:

Wkład: 4000

Wydajność:


  • Nie chodzi o znalezienie języka z najkrótszym rozwiązaniem tego problemu (są takie, w których pusty program rozwiązuje problem) - chodzi o znalezienie najkrótszego rozwiązania w każdym języku. Dlatego żadna odpowiedź nie zostanie oznaczona jako zaakceptowana.

  • W przeciwieństwie do naszych zwykłych zasad, możesz swobodnie używać języka (lub wersji językowej), nawet jeśli jest nowszy niż to wyzwanie. Języki napisane specjalnie w celu przesłania 0-bajtowej odpowiedzi na to wyzwanie są uczciwą grą, ale nie są szczególnie interesujące.

    Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Dozwolone jest (a nawet zachęcane) samodzielne pisanie tego tłumacza dla wcześniej niewdrożonego języka.

    Pamiętaj też, że języki muszą spełniać nasze zwykłe kryteria dotyczące języków programowania .


Katalog

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Czy funkcja byłaby akceptowalna?
spaghetto

@ quartata Powinien to być pełny program.
Chris Loonam,

2
Widzę, że wiele osób korzysta z beep()funkcji. Czy to gwarancja, że ​​jest to fala sinusoidalna?
geokavel

2
Windows System.Console.Beepto fala sinusoidalna na mojej (nowoczesnej, Windows 10) maszynie, więc myślę, że to się liczy. Rozwiązania dotyczące PPCG zasadniczo nie muszą być przenośne.
Lynn

Czy wydruk pliku audio jest prawidłowym sposobem na „wyjście tonu”?
Ilmari Karonen,

Odpowiedzi:


13

QBasic, 18 bajtów (zdyskwalifikowany)

Jak wspomniano @pabouk, wykorzystuje głośnik PC, więc odtwarza falę prostokątną , a nie sinusoidalną, jak pyta problem. (Wymóg ten został dodany do problemu po opublikowaniu tej odpowiedzi, stąd głosy.) Zostawię to tutaj dla potomności.


INPUT F
SOUND F,91

Odtwórz dźwięk na wprowadzonej częstotliwości dla 91 taktów, co jest równe 5 sekundom.


Ten program nie spełnia ostatniego wymagania: „Wyjście musi mieć postać fali sinusoidalnej”. SOUNDpolecenie korzysta z głośnika PC, który zgodnie z projektem był napędzany przez układ czasowy 8254, który wytwarza falę prostokątną. --- Chociaż we współczesnych komputerach 8254 może brakować poprawnej emulacji SOUNDpolecenia, powinno ono wytwarzać falę prostokątną.
pabouk

3
To wymaganie zostało dodane po opublikowaniu mojej odpowiedzi. : / Dodam notatkę, ale dziwnie czuję się, gdy usuwam tę odpowiedź, gdy głosuje ona na szczyt.
Lynn

12

Python2, 40 bajtów

from winsound import*
Beep(input(),5000)

Działa tylko w systemie Windows.


1
Czy 5e3zadziała?
Lynn

3
@ Mauris Nie, próbowałem już tego, ale chce tylko liczb całkowitych.
orlp

10

Mathematica, 42 bajty

Cóż, jeśli możemy użyć wbudowanych ...

Input[]
EmitSound@Play[Sin[2t%Pi],{t,0,5}]

Dzięki wymogu pełnego programu, to był pierwszy raz muszę użyć mojego niedawno odkrytej końcówki golfa z użyciem %(wynik ostatniej oceny), aby zapisać dwa bajty.

Mathematica ma również wbudowaną funkcję, Soundktóra jako argument przyjmuje wysokość i czas trwania, ale niestety wysokość ta musi być podana jako nuta muzyczna. Określenie własnej fali dźwiękowej Playwydaje się być jedynym sposobem pracy z częstotliwością.


7

C #, 80 bajtów

class P{static void Main(string[]a){System.Console.Beep(int.Parse(a[0]),5000);}}

Czy wiesz, jaka jest alternatywa dla Beeping w Javie?
Kritixi Lithos

7

MATLAB, 36 bajtów

sound(sin(pi*input('')*(0:8^-4:10)))

Dzięki flawr za oszczędność dwóch bajtów.


2
Możesz zapisać jedną postać, używając 2^-12zamiast 1/4096.
flawr

O głupi ja, 8^-4jest jeszcze krótszy!
flawr


4

FakeASM , 12 bajtów

RDA
BEEP 5e3

Współpracuje z implementacją referencyjną Windows (pobierz) . Nazywa Beepfunkcję Windows , która jest sinusoidą na nowoczesnych platformach.


Gdzie jest STDIN?
kot

1
RDAodczytuje liczbę ze STDIN i zapisuje ją w rejestrze A.
Lynn,

W końcu przeczytałem specyfikację i zauważyłem to, ale zapomniałem usunąć swój komentarz. dzięki jednak
kot

4

Bash + X11, 27 20 bajtów

xset b 9 $1 5;echo 

Zawiera to niedrukowalne, więc oto zrzut heksowy:

0000000: 7873 6574 2062 2039 2024 3120 353b 6563  xset b 9 $1 5;ec
0000010: 686f 2007                                ho .

Pobiera częstotliwość jako argument wiersza poleceń i odtwarza odpowiedni sygnał dźwiękowy o głośności 9% (ponieważ nie określono głośności).

(Uwaga: nie mogłem tego przetestować z powodu problemów z komputerem, ale jestem pewien, że 99% działa).


Czy jest tam \ x07?
TheDoctor,

Nie, xset wykonuje wszystkie sygnały dźwiękowe.
spaghetto

@TheDoctor Oh Rozumiem, co masz na myśli ... potrzebuje \ x07, aby zrobić rzeczywisty hałas. Ustalenie.
spaghetto

echo <BEL>gdzie <BEL>jest rzeczywisty znak, oszczędza 6 bajtów.
Dennis,

@Dennis D'oh. Dzięki!
spaghetto

4

JavaScript, 114 bajtów

p=prompt();c=new AudioContext;with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}

Wymaga nieco nowatorskiej przeglądarki, wpisz częstotliwość w monicie. JSFiddle


Nie będzie odtwarzany przez 5 sekund, ponieważ prompt()wywoływany jest po uruchomieniu timera audio o godzinie new AudioContext(). Uważam, że najkrótszy z nich to 115 bajtów c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655,

Dzięki za heads-upy, doceniam pomysł używania „z”.
Nickson

Nie widziałem wcześniej <script>tagów, które są wymagane, aby JavaScript mógł uznać pełny program wcześniej. Myślę, że jesteś dobry na 114. Ponadto usunięcie pzadania i samo ustawienie frequency.value=prompt()powinno doprowadzić cię do 110.
Mwr247,

@ Mwr247 Niestety, jak wskazał użytkownik 81655, licznik czasu, który określa, kiedy dźwięk się zatrzymuje, rozpoczyna się po utworzeniu AudioContext. Pytanie musi pojawić się wcześniej, w przeciwnym razie wolne wejście może spowodować krótszy dźwięk lub jego brak.
Nickson

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)oszczędza to 3 bajty
Patrick Roberts,

4

Narzędzia Bash + Linux, 95

bc -l<<<"obase=16;for(;t<5;t+=1/8000){a=s($1*t*6.3);scale=0;a*30/1+99;scale=9}"|xxd -p -r|aplay

To jest prawdziwa fala sinusoidalna. Brak sygnałów dźwiękowych. Częstotliwość wejściowa wprowadzona za pomocą wiersza polecenia:

./hz.sh 440

3

Przetwarzanie, 148 114 106 bajtów

import processing.sound.*;
Engine.start().sinePlay(int(loadStrings("s")[0]),1,0,0,0);delay(5000);exit();

(Z jakiegoś powodu Przetwarzanie wymaga zarówno użycia instrukcji importu, jak i nowego wiersza, w przeciwnym razie nie rozpoznaje biblioteki).

Nadal nie wiem, jak przekazać argumenty do Przetwarzania, choć wiem, że jest to możliwe, więc ten kod wymaga posiadania pliku o nazwie „s” w folderze szkicu, który ma wartość częstotliwości. Jeśli potrafię wymyślić, jak przekazać argumenty, mógłbym zastąpić ładowanie pliku args[0].


3

VB.net, 90 bajtów , 74 bajty

Module m
Sub Main(a() as String)
Console.Beep(a(0),5000)
End Sub
End Module

Dzięki Sehnsucht

Module m
Sub Main()
Console.Beep(My.Application.CommandLineArgs.First,5000)
End Sub
End Module

To jest mój pierwszy post, więc jeśli zrobiłem coś źle, proszę dać mi znać


1
Można to zmniejszyć, uzyskując zamiast tego argument wiersza poleceń w głównych argumentach Main(a()As Stringi Beep(a(0),5000)zmniejszając całkowitą liczbę do 74 bajtów zgodnie z licznikiem bajtów
Sehnsucht

2

Turbo / Borland / Free / GNU Pascal, 95 bajtów

Z powodu problemów z funkcją opóźnienia na nowoczesnych komputerach (cóż, wszystko szybszych niż 200 MHz) próbujących uruchomić pascal Turbo / Borland, może to nie czekać 5 sekund, nawet z poprawioną biblioteką CRT

Program a;Uses crt;Var i,k:Integer;BEGIN Val(ParamStr(1),i,k);Sound(i);Delay(5000);NoSound;END.

Konwersję ciągu na liczbę całkowitą można wykonać na FreePascal w krótszych (77 bajtów) i nowoczesnych pochodnych, ponieważ mają one StrToIntfunkcję:

Program a;Uses crt;BEGIN Sound(StrToInt(ParamStr(1)));Delay(5000);NoSound;END.

1
O ile mi wiadomo, program Pascal będzie działał poprawnie ze wszystkimi kompilatorami nawet bez Program a;części, dzięki czemu można wygrać 10 bajtów, pomijając go.
vsz

@vsz FPC może być w porządku (więc mogę usunąć to z drugiego fragmentu), wciąż muszę sprawdzać niektóre starożytne, takie jak TP5.5, o ile pamiętam, że tego wymagały.
SztupY,

Wymagania mówią: „Dane wejściowe muszą być pobierane przez STDIN”, więc pomiń to zbyt długo ParamStr()i po prostu Read()w razie potrzeby: pastebin.com/1Tw2d0D6
manatwork

2

Perl, 27 bajtów

Zasadniczo wersja Perla odpowiedzi na Python (działa również tylko w systemie Windows), jeśli zezwalamy na moduły.

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 bajtów

"5 "WX" 9 b tesx",7O

Tłumaczenie mojej odpowiedzi na bash. Nie działa w tłumaczu online (oczywiście).

Pobiera dane wejściowe jako dowolny znak nienumeryczny, po którym następuje częstotliwość (więc dla danych wejściowych 440 Hz można wykonać „a440”).

Wyjaśnienie

"5 "WX" 9 b tesx",7O
"5 "                   Push " 5"
    WX                 Reads input and removes the first character (which is used to force string context)
      " 9 b tesx"      Push "xset b 9 "
                 ,     Pop everything and execute as a shell command.
                  7O   Output bell char.

Fajna odpowiedź. Dobra robota.
R

Użyłeś Vitsy. <3 Moje dziecko zostało wykupione.
Addison Crump

1

C z WinAPI, 82 bajty

#include<windows.h>
#include<stdio.h>
main(){int x;scanf("%i",&x);Beep(x,5000);}

Używa funkcji WinAPI Beep ().


Nie musisz przejść &xdo scanf? Możesz również zadeklarować xjako parametr main i pozwolić kompilatorowi na domyślny typ.
Neil,

@Neil, nie wiem, jak źle to napisałem, nie przechodząc &xdo scanf(). Naprawiono teraz; dzięki.
user2064000,


0

Shadertoy GLSL Sound Shader, 86

#define F 440.0
vec2 mainSound(float t){return vec2(sin(6.3*F*t)*(t<5.0?1.0:0.0));}

„Wejście” podaje się za pomocą #define. Wysyła falę sinusoidalną o przybliżonej częstotliwości FHz. Zaokrąglone 2 * Pi do 6.3, zamiast „domyślnego” 6.2831, ale brzmi prawie tak samo.

Niestety nie ma tu wiele do golfa.


Dane wejściowe należy pobierać przez STDIN, a nie na stałe.
flawr

@flawr Nie znam żadnych metod precyzyjnego wprowadzania Shadertoy. Proszę, oświeć mnie.
Kroltan

To powinno być twoje zadanie, a nie moje. Ale i tak nie znam Shadertoya, więc nie mogę ci pomóc.
flawr

@ flawr jedyną metodą o rozsądnej precyzji byłaby pozycja kursora, ale jest ona dostępna tylko dla shaderów obrazu, a nie shaderów dźwięku. Więc prawie utknąłem w definicjach.
Kroltan

Czy możesz załadować pliki? To jest to co zrobiłem.
geokavel

0

Jolf, 4 bajty, niekonkurujące

Ten dodatek językowy pojawił się po wyzwaniu.

Αc5j
Αc     create a beep
  5     five seconds long
   j    with the input as a frequency

Fala domyślna to fala sinusoidalna.


0

SmileBASIC, 84 bajtów

INPUT F
N=LOG(F/440,POW(2,1/12))+57BGMPLAY FORMAT$("@D%D@255T12N%D",(N-(N<<0))*63,N)

Konwertuje od Hz do pół kroku i odtwarza określoną nutę z wartością detune w celu uzyskania częstotliwości.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.