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

Chris Loonam
źródło
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.

Lynn
źródło
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.

orlp
źródło
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ą.

Martin Ender
źródło
7

C #, 80 bajtów

class P{static void Main(string[]a){System.Console.Beep(int.Parse(a[0]),5000);}}
Sean Latham
źródło
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.

Czarna dziura
źródło
2
Możesz zapisać jedną postać, używając 2^-12zamiast 1/4096.
flawr
O głupi ja, 8^-4jest jeszcze krótszy!
flawr
6

PowerShell, 32 bajty

[console]::beep((read-host),5kb)
Nacht - Przywróć Monikę
źródło
4
Czy przestrzeń jest naprawdę potrzebna?
kasperd
wow, niechlujny mnie
Nacht - przywróć Monikę
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.

Lynn
źródło
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).

spaghetto
źródło
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

Nickson
źródło
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
Cyfrowa trauma
źródło
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].

geokavel
źródło
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ć

Eric Johnson
źródło
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.
Sztuczki
źródło
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
ChicagoRedSox
źródło
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.
spaghetto
źródło
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 ().

user2064000
źródło
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,
1

Sód , 38 bajtów

func main()Console.beep(input(), 5000)
Jacob Misirian
źródło
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.

Kroltan
źródło
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.

Conor O'Brien
źródło
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.

12Me21
źródło