输出一定频率的声音


25

这是一个相当简单的挑战,但是我找不到任何与之非常相似的问题。面临的挑战是使用STDIN或同等频率获取一个频率,然后输出与该频率匹配的音调,以Hz为单位,持续5秒钟。例如

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

规则

  • 输入必须通过STDIN或您的语言的等效输入
  • 答案必须是完整的程序
  • 可以使用内建函数
  • 频率范围为50-5000 Hz
  • 输出必须播放5秒钟
  • 输出必须为正弦波形式

测试用例

输入: 440

输出:

输入: 200

输出:

输入: 4000

输出:


  • 这并不是要找到具有最短解决方案的语言(有些地方空程序会解决问题),而不仅仅是找到每种语言的最短解决方案。因此,没有答案将被标记为已接受。

  • 与我们通常的规则不同,即使使用的语言(或语言版本)比此挑战新,也可以使用。专门针对此挑战提交0字节答案的语言是公平的游戏,但并不是特别有趣。

    请注意,必须有一个解释器,以便可以测试提交。允许(甚至鼓励)自己为以前未实现的语言编写此解释器。

    还要注意,语言确实必须满足我们编程语言的通常标准


目录

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

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

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

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

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

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


功能可以接受吗?
意大利面条2015年

@quartata应该是完整程序。
克里斯·洛南

2
我看到很多人都在使用beep()函数。是否可以保证这是一个正弦波?
geokavel 2015年

2
Windows的System.Console.Beep事情在我的(现代Windows 10)计算机上是正弦波,所以我认为这很重要。PPCG的解决方案通常不需要移植。
林恩

打印出音频文件是“输出音调”的有效方法吗?
Ilmari Karonen

Answers:


13

QBasic,18个字节(不合格)

就像@pabouk提到的那样,它使用PC扬声器,因此它播放波,而不是问题所要求的正弦波。(此要求在发布此答案后才被添加到问题中,因此是投票权。)无论如何,我将其保留在此处以供后代使用。


INPUT F
SOUND F,91

以输入的频率播放声音 91滴答声,等于5秒。


该程序不满足最后一个要求:“输出必须为正弦波形式”。SOUND命令使用PC扬声器,该扬声器由设计好的计时器芯片8254驱动,该计时器芯片产生方波。---尽管在现代PC 8254中可能会丢失SOUND命令的正确仿真,但会产生方波。
pabouk

3
我发布答案后添加了此要求。:/我会添加一个注释,但是当它被投票选为最高答案时,我很想删除此答案。
林恩

12

Python2,40个字节

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

仅适用于Windows。


1
5e3工作吗?
林恩(Lynn)2015年

3
@Mauris不,我已经尝试过了,但是它只想要整数。
orlp

10

Mathematica,42个字节

好吧,如果我们可以使用内置...

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

由于一个完整的程序的要求,这是我第一次用我最近发现打高尔夫球尖使用的%(一次评估的结果),以节省两个字节。

Mathematica还具有一个内置功能,Sound该功能以音高和持续时间作为参数,但是不幸的是,音高必须作为音符给出。指定自己的声波通孔Play似乎是使用频率的唯一方法。



7

MATLAB,36个字节

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

多亏了furr节省了两个字节。


2
您可以使用2^-12代替来保存一个字符1/4096
瑕疵的

噢,愚蠢的我,8^-4甚至更短!
瑕疵的


4

FakeASM,12个字节

RDA
BEEP 5e3

与Windows参考实现(下载)一起使用。它调用Windows的Beep功能,这是现代平台上的正弦波。


STDIN在哪里?

1
RDA从STDIN读取一个数字并将其放入寄存器A
林恩

我最终阅读了规范并注意到了这一点,但是我忘记删除我的评论了。不过,谢谢你
cat

4

击+ X11,27 20个字节

xset b 9 $1 5;echo 

其中包含不可打印的内容,因此这是一个十六进制转储:

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

这将频率作为命令行参数,并以9%的音量播放适当的提示音(因为未指定音量)。

(注意:由于计算机的某些问题,我无法对此进行测试,但是我99%的确定它可以工作。)


那里有\ x07吗?
TheDoctor 2015年

不,xset会发出所有提示音。
意大利面条

@TheDoctor哦,我明白您的意思了……它确实需要\ x07才能发出实际的噪音。定影。
意大利面条2015年

echo <BEL><BEL>实际字符在哪里,节省6个字节。
丹尼斯

@Dennis D'oh。谢谢!
意大利面条

4

JavaScript,114字节

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

需要一个稍微先进的浏览器,在提示符下输入频率。 JSFiddle


这不会播放5秒钟,因为prompt()在开启音频计时器后会调用new AudioContext()。我相信使用可以得到的最短长度是115个字节c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}
user81655 2015年

感谢您的注意,我也感谢使用“ with”的想法。
尼克森2015年

我以前没有看到<script>标签是JavaScript视为完整程序所必需的。我想你的114也不错,去掉p分配,只是设置frequency.value=prompt()应该让你下降到110
Mwr247

@ Mwr247不幸的是,正如user81655所指出的,确定Audio停止时间的计时器是在创建AudioContext时启动的。提示必须在此之前出现,否则输入速度慢可能会导致音频变短或根本没有音频。
尼克森,2015年

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)这将节省3个字节
Patrick Roberts

4

Bash + Linux utils,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

这是一个真正的正弦波。没有蜂鸣声。通过命令行输入的输入频率:

./hz.sh 440

3

处理,148个 114 106字节

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

(由于某些原因,Processing需要同时使用import语句和换行,否则它将无法识别该库。)

尽管我知道有可能,但我仍然没有弄清楚如何将参数传递给Processing,因此此代码要求在草图文件夹中有一个名为“ s”的文件,该文件具有频率值。如果我能弄清楚如何传递参数,则可以用替换文件加载args[0]


3

VB.net,90字节,74字节

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

感谢Sehnsucht

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

这是我的第一篇文章,所以如果我做错了任何事情,请告诉我


1
可以减少在主参数中获取命令行参数,Main(a()As StringBeep(a(0),5000)根据字节计数器
Sehnsucht 2015年

2

Turbo / Borland / Free / GNU Pascal,95个字节

由于尝试运行Turbo / Borland pascal的现代计算机(好于200Mhz的速度)上的延迟功能存在问题,即使使用已修补的CRT库,这也可能不会等待5秒

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

在FreePascal和现代派生类上,字符串到整数的转换可以更短(77个字节),因为它们具有以下StrToInt功能:

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

1
据我所知,一个Pascal程序即使没有该Program a;部分也可以在所有编译器中正常工作,因此省略它可以赢得10个字节。
vsz 2015年

@vsz FPC可能很好(因此我可以从第二个片段中删除它),据我记得他们需要它时,我仍然必须检查一些古老的东西,例如TP5.5。
SztupY

要求说“必须通过STDIN接收输入”,因此请跳过冗长的内容ParamStr()Read()并按要求进行输入:pastebin.com/1Tw2d0D6
manatwork

2

Perl,27个字节

如果我们允许模块,则基本上是Perl版本的Python答案(也仅适用于Windows)。

use Audio::Beep;beep<>,5000

2

Vitsy + X11,20个字节

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

我的bash答案的翻译。在在线解释器中不起作用(显然)。

将输入作为任何非数字字符后跟频率(因此,对于440 Hz的输入,您可以执行“ a440”)。

说明

"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.

很酷的答案。辛苦了
Rɪᴋᴇʀ

您使用了Vitsy。<3我的孩子已兑现。
Addison Crump

1

带WinAPI的C,82字节

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

使用WinAPI Beep()函数。


不要你需要传递&xscanf?您也可以x将main 声明为参数,并让编译器默认其类型。
尼尔

@Neil,我不知道在不传递&x给的情况下如何打错它scanf()。现在已修复;谢谢。
user2064000


0

Shadertoy GLSL声音着色器,86

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

通过给出“输入” #define。输出近似频率为FHz 的正弦波。将2 * Pi舍入为6.3,而不是“默认” 6.2831,但听起来几乎相同。

不幸的是,这里打高尔夫球的地方不多。


输入应通过STDIN进行,而不是硬编码。
瑕疵的

@flawr我不知道在Shadertoy上进行精确输入的任何方法。请赐教。
Kroltan

这应该是您的任务,而不是我任务。但是我还是不知道Shadertoy,所以我无能为力。
瑕疵的

@flawr唯一合理精度的方法是光标位置,但这仅适用于图像着色器,不适用于声音着色器。因此,我对定义几乎一无所知。
Kroltan

可以加载文件吗?那就是我所做的。
geokavel

0

Jolf,4字节,无竞争

挑战之后增加了这种语言。

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

默认波为正弦波。


0

SmileBASIC,84字节

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

从Hz转换为半步,并用失调值播放某个音符以产生频率。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.