Keluarkan suara dengan frekuensi tertentu


25

Ini adalah tantangan yang agak sederhana, tetapi saya tidak dapat menemukan pertanyaan yang benar-benar mirip dengannya. Tantangannya adalah untuk mengambil frekuensi dalam menggunakan STDIN atau yang setara, dan kemudian mengeluarkan nada yang cocok dengan frekuensi itu, dalam Hz, selama 5 detik. Sebagai contoh

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

Aturan

  • Masukan harus diambil melalui STDIN, atau setara dengan bahasa Anda
  • Jawabannya harus berupa program lengkap
  • Builtin dapat digunakan
  • Frekuensi akan berkisar antara 50 - 5000 Hz
  • Output harus dimainkan selama 5 detik
  • Outputnya harus dalam bentuk gelombang sinus

Uji kasus

Memasukkan: 440

Keluaran:

Memasukkan: 200

Keluaran:

Memasukkan: 4000

Keluaran:


  • Ini bukan tentang menemukan bahasa dengan solusi terpendek untuk ini (ada beberapa di mana program kosong melakukan trik) - ini adalah tentang menemukan solusi terpendek dalam setiap bahasa. Karenanya, tidak ada jawaban yang akan ditandai sebagai diterima.

  • Tidak seperti aturan kami yang biasa, jangan ragu untuk menggunakan bahasa (atau versi bahasa) meskipun itu lebih baru daripada tantangan ini. Bahasa yang ditulis khusus untuk mengirimkan jawaban 0-byte untuk tantangan ini adalah permainan yang adil tetapi tidak terlalu menarik.

    Perhatikan bahwa harus ada juru bahasa sehingga pengajuan dapat diuji. Diperbolehkan (dan bahkan dianjurkan) untuk menulis sendiri penerjemah ini untuk bahasa yang sebelumnya tidak diterapkan.

    Juga mencatat bahwa bahasa yang harus dapat memenuhi kriteria kami biasa untuk bahasa pemrograman .


Katalog

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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


Apakah suatu fungsi dapat diterima?
spaghetto

@quartata Ini harus berupa program lengkap.
Chris Loonam

2
Saya melihat bahwa banyak orang menggunakan beep()fungsi. Apakah dijamin itu adalah gelombang sinus?
geokavel

2
Hal Windows System.Console.Beepadalah gelombang sinus pada mesin saya (modern, Windows 10), jadi saya pikir itu penting. Solusi pada PPCG umumnya tidak harus portabel.
Lynn

Apakah mencetak file audio cara yang valid untuk "mengeluarkan nada"?
Ilmari Karonen

Jawaban:


13

QBasic, 18 byte (didiskualifikasi)

Seperti @pabouk disebutkan, ini menggunakan speaker PC, sehingga memainkan gelombang persegi , bukan gelombang sinus seperti masalahnya. (Persyaratan ini ditambahkan ke masalah setelah jawaban ini diposting, karenanya suara.) Saya akan meninggalkannya di sini untuk anak cucu.


INPUT F
SOUND F,91

Putar suara pada frekuensi yang dimasukkan untuk 91 ticks, yang sama dengan 5 detik.


Program ini tidak memenuhi persyaratan terakhir: "Output harus dalam bentuk gelombang sinus". SOUNDperintah menggunakan pengeras suara PC yang dirancang dirancang oleh chip pengatur waktu 8254 yang menghasilkan gelombang persegi. --- Padahal di PC modern 8254 bisa hilang emulasi yang benar dari SOUNDperintah harus menghasilkan gelombang persegi.
pabouk

3
Persyaratan ini ditambahkan setelah saya memposting jawaban saya. : / Saya akan menambahkan catatan, tapi saya merasa aneh menghapus jawaban ini ketika yang memilih ke atas.
Lynn

12

Python2, 40 byte

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

Hanya berfungsi di Windows.


1
Akan 5e3bekerja
Lynn

3
@Mauris Tidak, saya sudah mencobanya tetapi hanya menginginkan bilangan bulat.
orlp

10

Mathematica, 42 byte

Nah jika kita bisa menggunakan built-in ...

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

Berkat persyaratan untuk program lengkap, ini adalah pertama kalinya saya menggunakan tip golf yang baru saya gunakan% (hasil evaluasi terakhir) untuk menyimpan dua byte.

Mathematica juga memiliki built-in Soundyang membutuhkan pitch dan durasi sebagai argumen, tetapi sayangnya pitch harus diberikan sebagai not musik. Menentukan gelombang suara Anda sendiri Playtampaknya merupakan satu-satunya cara untuk bekerja dengan frekuensi.


7

C #, 80 byte

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

Apakah Anda tahu apa alternatif untuk Beepdi Jawa?
Lithos Kritixi

7

MATLAB, 36 byte

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

Terimakasih untuk flawr untuk menghemat dua byte.


2
Anda dapat menyimpan satu karakter dengan menggunakan 2^-12alih-alih 1/4096.
flawr

Oh, konyol saya, 8^-4bahkan lebih pendek!
flawr


4

FakeASM , 12 byte

RDA
BEEP 5e3

Bekerja dengan implementasi referensi Windows (unduh) . Ini memanggil Beepfungsi Windows , yang merupakan gelombang sinus pada platform modern.


Dimanakah STDIN?
kucing

1
RDAmembaca nomor dari STDIN dan memasukkannya ke dalam register A.
Lynn,

Saya akhirnya membaca spek dan memperhatikan itu tetapi saya lupa menghapus komentar saya. terima kasih,
kucing

4

Bash + X11, 27 20 byte

xset b 9 $1 5;echo 

Ini mengandung yang tidak patut dicetak, jadi inilah hexdump:

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

Ini menggunakan frekuensi sebagai argumen baris perintah dan memainkan bunyi bip yang sesuai pada volume 9% (karena tidak ada volume yang ditentukan).

(Catatan: Saya tidak dapat menguji ini karena beberapa masalah dengan komputer saya, tapi saya yakin 99% berhasil.)


Apakah ada \ x07 di sana?
TheDoctor

Tidak, xset melakukan semua hal yang berbunyi bip.
spaghetto

@TheDoctor Oh saya mengerti maksud Anda ... perlu \ x07 untuk membuat suara yang sebenarnya. Pemasangan.
spaghetto

echo <BEL>di mana <BEL>karakter sebenarnya, menyimpan 6 byte.
Dennis

@Dennis D'oh. Terima kasih!
spaghetto

4

JavaScript, 114 byte

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

Membutuhkan peramban yang agak mutakhir, masukkan frekuensi pada prompt. JSFiddle


Ini tidak akan diputar selama 5 detik karena prompt()dipanggil setelah pengatur waktu audio dimulai new AudioContext(). Saya percaya yang terpendek yang bisa Anda dapatkan adalah 115 byte c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655

Terima kasih atas sarannya, saya menghargai gagasan menggunakan 'dengan' juga.
Nickson

Saya belum melihat <script>tag sebagai persyaratan bagi JavaScript untuk dianggap sebagai program lengkap sebelumnya. Saya pikir Anda baik untuk 114. Selain itu, menghapus ptugas, dan pengaturan hanya frequency.value=prompt()akan membuat Anda turun ke 110.
Mwr247

@ Mwr247 Sayangnya, seperti yang ditunjukkan pengguna81655, timer yang menentukan kapan audio berhenti dimulai ketika AudioContext dibuat. Prompt harus muncul sebelum itu, atau input yang lambat dapat menghasilkan audio yang lebih pendek atau tidak ada audio sama sekali.
Nickson

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)ini menghemat 3 byte
Patrick Roberts

4

Utilitas 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

Ini adalah gelombang sinus sejati. Tidak berbunyi bip. Frekuensi input dimasukkan melalui baris perintah:

./hz.sh 440

3

Memproses, 148 114 106 byte

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

(Untuk beberapa alasan, Pemrosesan mengharuskan penggunaan pernyataan impor dan baris baru, jika tidak, ia tidak mengenali pustaka.)

Saya masih belum menemukan cara untuk mengirimkan argumen ke Pemrosesan, meskipun saya tahu itu mungkin, jadi kode ini mengharuskan memiliki file bernama "s" di folder sketsa yang memiliki nilai frekuensi. Jika saya bisa mengetahui cara menyampaikan argumen saya bisa mengganti memuat file dengan args[0].


3

VB.net, 90 byte , 74 byte

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

Terima kasih untuk Sehnsucht

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

Ini adalah posting pertama saya jadi jika saya melakukan kesalahan, tolong beri tahu saya


1
Itu dapat dikurangi dengan mendapatkan argumen baris perintah dalam argumen utama Main(a()As Stringdan Beep(a(0),5000)mengurangi total menjadi 74 byte menurut byte counter
Sehnsucht

2

Turbo / Borland / Gratis / GNU Pascal, 95 byte

Karena masalah dengan fungsi penundaan pada komputer modern (yah, apa pun yang lebih cepat dari 200Mhz) mencoba menjalankan Turbo / Borland pascal, ini mungkin tidak menunggu 5 detik, bahkan dengan perpustakaan CRT yang ditambal

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

The String to Integer conversion can be done shorter (77 bytes) on FreePascal, and modern derivates, as they have the StrToInt function:

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

1
As far as I know, a Pascal program will work fine with all compilers even without the Program a; part, so you can win 10 bytes with omitting it.
vsz

@vsz FPC might be fine (so I can remove that from the second snippet), I still have to check some ancient ones, like TP5.5, as far as I remember they required it.
SztupY

The requirements say “Input must be taken in through STDIN”, so skip that lengthy ParamStr() and just Read() it as required: pastebin.com/1Tw2d0D6
manatwork

2

Perl, 27 bytes

Basically a Perl version of the Python answer (also only works on Windows), if we're allowing modules.

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 bytes

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

A translation of my bash answer. Does not work in the online interpreter (obviously).

Takes input as any non-numeric character followed by the frequency (so for an input of 440 Hz you could do "a440").

Explanation

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

Cool answer. Nice work.
Rɪᴋᴇʀ

You used Vitsy. <3 My child is redeemed.
Addison Crump

1

C with WinAPI, 82 bytes

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

Uses the WinAPI Beep() function.


Don't you need to pass &x to scanf? Also you can declare x as a parameter to main and let the compiler default its type.
Neil

@Neil, I don't know how I mistyped it without passing &x to scanf(). Fixed now; thanks.
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));}

"Input" is given via #define. Outputs a sinewave with approximate frequency of FHz. Rounded 2*Pi to 6.3, instead of "default" 6.2831, but sounds pretty much the same.

Sadly there isn't much to golf here.


Input should be taken via STDIN, not hardcoded.
flawr

@flawr I don`t know any methods of precise input on Shadertoy. Please enlighten me.
Kroltan

This is should be your task, not mine. But I do not know Shadertoy anyway so I cannot help you.
flawr

@flawr the only method of reasonable precision would be the cursor position, but that is only available to image shaders, not sound shaders. So I'm pretty much stuck with defines.
Kroltan

Can you load files? That's what I did.
geokavel

0

Jolf, 4 bytes, noncompeting

This language addition came after the challenge.

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

The default wave is a sine wave.


0

SmileBASIC, 84 bytes

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

Converts from Hz to half steps, and plays the a certain note with the a detune value to produce the frequency.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.