特定の周波数の音を出力する


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バイトの回答を送信するために特別に作成された言語は、公平なゲームですが、特に興味深いものではありません。

    提出物をテストできるようにインタープリターが必要であることに注意してください。以前に実装されていない言語用にこのインタープリターを自分で作成することは許可されています(推奨されます)。

    また、言語プログラミング言語の通常の基準を満たす必要があることに注意してください。


カタログ

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


関数は受け入れられますか?
spaghetto

@quartata完全なプログラムである必要があります。
クリスルーナム

2
多くの人がbeep()関数を使用していることがわかります。それが正弦波であることは保証されていますか?
-geokavel

2
WindowsのSystem.Console.Beepものは、私の(現代のWindows 10)マシンでの正弦波なの​​で、それは重要だと思います。PPCGのソリューションは、一般にポータブルである必要はありません。
リン

オーディオファイルの印刷は、「トーンを出力する」ための有効な方法ですか?
イルマリカロネン

回答:


13

QBasic、18バイト(失格)

前述の@paboukのように、これはPCスピーカーを使用するため、問題が求めるような正弦波ではなく方形波を再生します。(この要件はこの回答が投稿されたに問題に追加されたため、投票が行われます。)とにかく後世のためにここに残しておきます。


INPUT F
SOUND F,91

入力された周波数でを91ティック(5秒に相当)の間再生します。


このプログラムは、最後の要件「出力は正弦波の形式でなければなりません」を満たしていません。SOUNDコマンドは、設計どおり、方形波を生成するタイマーチップ8254によって駆動されるPCスピーカーを使用します。---最新のPCでは8254が欠落している可能性がありますが、SOUNDコマンドの正しいエミュレーションにより方形波が生成されるはずです。
pabouk

3
この要件は、回答を投稿した後に追加されました。:/メモを追加しますが、この回答がトップに投票されたときにこの回答を削除するのは奇妙に感じます。
リン

12

Python2、40バイト

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

Windowsでのみ機能します。


1
だろう5e3動作しますか?
リン

3
@Maurisいいえ、すでに試しましたが、整数のみが必要です。
-orlp

10

Mathematica、42バイト

ビルトインを使用できる場合は...

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

完全なプログラムのための要件のおかげで、これは私が使うようになった初めてだった私の最近発見されたゴルフのヒントを使用しての%2つのバイトを保存するために(最後の評価の結果を)。

MathematicaにSoundは、ピッチとデュレーションを引数として取る組み込み関数もありますが、残念ながらピッチは音符として指定する必要があります。を介して独自の音波を指定するPlayことが、周波数を扱う唯一の方法のようです。



7

MATLAB、36バイト

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

2バイトを節約してくれたflawrに感謝します。


2
2^-12代わりにを使用して、1文字を保存できます1/4096
flawr

ああ、愚かな、8^-4さらに短いです!
flawr


4

FakeASM、12バイト

RDA
BEEP 5e3

Windowsリファレンス実装(ダウンロード)で動作します。WindowsのBeep関数を呼び出します。これは、最新のプラットフォームでは正弦波です。


STDINはどこにありますか?

1
RDASTDINから数値を読み取り、それをregisterに入れますA
リン

仕様を読んで気づいたのですが、コメントを削除するのを忘れていました。感謝、しかし

4

バッシュ+ X11、27の、20バイト

xset b 9 $1 5;echo 

これには印刷できないものが含まれているので、16進ダンプを次に示します。

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

これは、頻度をコマンドライン引数として受け取り、9%の音量で適切なビープ音を再生します(音量が指定されていないため)。

(注:コンピューターのいくつかの問題のため、これをテストすることはできませんでしたが、99%は動作することを確信しています。)


そこに\ x07がありますか?
-TheDoctor

いいえ、xsetはすべてのビープ音を鳴らします。
spaghetto

@TheDoctorおっしゃるとおりです。実際のノイズを生成するには\ x07が必要です。修正。
spaghetto

echo <BEL>どこ<BEL>実際の文字で、6つのバイトを保存します。
デニス

@デニス・ドー ありがとう!
spaghetto

4

JavaScript、114バイト

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

最先端のブラウザが必要です。プロンプトに頻度を入力してください。 JSFiddle


これはprompt()、オーディオタイマーがで開始された後に呼び出されるため、5秒間再生されませんnew AudioContext()。あなたがこれを得ることができる最短は115バイトであると信じていますc=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}
user81655

気をつけてくれてありがとう、「with」を使用するというアイデアもありがたい。
ニックソン

<script>JavaScriptが完全なプログラムと見なされるためにタグが必要とされることは、これまで見たことがありません。また、p割り当てを削除し、設定frequency.value=prompt()するだけで110になります。
Mwr24715年

@ Mwr247残念ながら、user81655が指摘したように、AudioContextが作成されると、オーディオがいつ停止するかを決定するタイマーが開始されます。それより前にプロンプ​​トを表示する必要があります。そうしないと、入力が遅いと音声が短くなるか、音声がまったく聞こえなくなる可能性があります。
ニックソン

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)これにより3バイトが節約されます
パトリックロバーツ

4

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

これは真の正弦波です。ビープ音なし。コマンドラインから入力された入力頻度:

./hz.sh 440

3

処理中、148 114 106バイト

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

(何らかの理由で、処理には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)に従ってバイト74に合計を減らすバイトカウンタ
Sehnsucht

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および最近の派生StrToInt関数で機能が短いため、より短く(77バイト)実行できます。

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

1
私の知る限り、Pascalプログラムは、Program a;部品がなくてもすべてのコンパイラーで問題なく動作するため、10バイトを省略しても勝ちます。
-vsz

@vsz FPCは問題ない可能性があります(2番目のスニペットから削除できます)。TP5.5のような古いものを必要とする限り、チェックする必要があります。
SztupY

要件は、そのため長い飛ばし、「入力はSTDIN経由で撮影しなければならない」と言うParamStr()と、ちょうどRead()それのように必要な:pastebin.com/1Tw2d0D6
manatwork

2

Perl、27バイト

モジュールを許可している場合、基本的にはPython回答のPerlバージョン(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私の子供は償還されます。
アディソンクランプ

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、私は通過せずにそれをタイプミスか分からない&xscanf()。現在修正済み。ありがとう。
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ます。近似周波数の正弦波を出力しますF Hzのます。「デフォルト」6.2831ではなく、2 * Piを6.3に丸めましたが、ほとんど同じように聞こえます。

残念ながら、ここでゴルフをすることはあまりありません。


入力は、ハードコーディングではなく、STDINを介して取得する必要があります。
flawr

@flawr Shadertoyの正確な入力方法は知りません。教えてください。
-Kroltan

これは私のタスクではなく、あなたのタスクであるべきです。しかし、私はとにかくシェーダートイを知らないので、あなたを助けることはできません。
flawr

@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からハーフステップに変換し、デチューン値で特定のノートを演奏して周波数を生成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.