Вывести звук определенной частоты


25

Это довольно простой вызов, но я не смог найти ни одного вопроса, который был бы действительно похож на него. Задача состоит в том, чтобы взять частоту при использовании STDIN или ее эквивалента, а затем вывести тон, соответствующий этой частоте, в Гц, в течение 5 секунд. Например

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

правила

  • Входные данные должны быть приняты через STDIN или эквивалент вашего языка
  • Ответ должен быть полной программой
  • Встроенные могут быть использованы
  • Частота будет где-то от 50 до 5000 Гц
  • Выход должен быть воспроизведен в течение 5 секунд
  • Выход должен быть в форме синусоиды

Контрольные примеры

Входные данные: 440

Выход:

Входные данные: 200

Выход:

Входные данные: 4000

Выход:


  • Речь идет не о поиске языка с кратчайшим решением для этого (есть такие, где пустая программа делает свое дело) - речь идет о поиске кратчайшего решения в каждом языке. Поэтому ни один ответ не будет помечен как принятый.

  • В отличие от наших обычных правил, не стесняйтесь использовать язык (или языковую версию), даже если он новее этой задачи. Языки, специально написанные для предоставления 0-байтового ответа на этот вызов, являются честной игрой, но не особенно интересными.

    Обратите внимание, что должен быть переводчик, чтобы представление можно было проверить. Разрешается (и даже поощряется) самостоятельно писать этот переводчик для ранее не реализованного языка.

    Также обратите внимание , что языки действительно должны в полной мере ощутить наши обычные критерии для языков программирования .


Каталог

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## 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


Будет ли функция приемлемой?
спагетто

@quartata Это должна быть полная программа.
Крис Лунам

2
Я вижу, что многие люди используют beep()функцию. Гарантируется ли это, что это синусоида?
геокавель

2
Windows System.Console.Beep- синусоида на моей (современной Windows 10) машине, так что я думаю, что это важно. Решения по PPCG обычно не должны быть переносимыми.
Линн

Является ли распечатка аудиофайла верным способом «вывести тон»?
Ильмари Каронен

Ответы:


13

QBasic, 18 байт (дисквалифицирован)

Как упомянуто @pabouk, здесь используется динамик ПК, поэтому он воспроизводит прямоугольную волну, а не синусоидальную, как задает проблема. (Это требование было добавлено к проблеме после того, как этот ответ был опубликован, отсюда и голоса.) Я все равно оставлю это здесь для потомков.


INPUT F
SOUND F,91

Воспроизведите звук на введенной частоте в течение 91 такта, что равно 5 секундам.


Эта программа не удовлетворяет последнему требованию: «Выходной сигнал должен быть в форме синусоиды». SOUNDКоманда использует динамик ПК, который, как и было задумано, приводится в действие микросхемой таймера 8254, которая генерирует прямоугольную волну. --- Хотя в современных компьютерах 8254 может отсутствовать правильная эмуляция, SOUNDкоманда должна производить прямоугольную волну.
Пабук

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}]

Благодаря требованию полной программы, я впервые использовал мой недавно обнаруженный совет по использованию в гольфе% (результат последней оценки), чтобы сэкономить два байта.

Mathematica также имеет встроенную функцию, Soundкоторая принимает высоту и длительность в качестве аргументов, но, к сожалению, высоту следует указывать в качестве музыкальной ноты. Задание собственной звуковой волны с помощью Playкажется единственным способом работы с частотой.



7

MATLAB, 36 байт

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

Спасибо flawr за сохранение двух байтов.


2
Вы можете сохранить один символ, используя 2^-12вместо 1/4096.
Flawr

О, глупый я, 8^-4еще короче!
Flawr


4

FakeASM , 12 байт

RDA
BEEP 5e3

Работает с эталонной реализацией Windows (скачать) . Он вызывает Beepфункцию Windows , которая является синусоидой на современных платформах.


Где STDIN?
кот

1
RDAчитает число из STDIN и помещает его в регистр A.
Линн

Я закончил тем, что прочитал спецификацию и заметил это, но я забыл удалить свой комментарий. спасибо, хотя
кошка

4

Bash + X11, 27 20 байт

xset b 9 $1 5;echo 

Это содержит непечатаемый, поэтому вот hexdump:

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

Он принимает частоту в качестве аргумента командной строки и воспроизводит соответствующий звуковой сигнал с громкостью 9% (поскольку громкость не указана).

(Примечание: я не смог проверить это из-за некоторых проблем с моим компьютером, но я на 99% уверен, что это работает.)


Там есть \ x07?
Доктор

Нет, xset делает все, что нужно.
спагетто

@TheDoctor О, я понимаю, что ты имеешь в виду ... ему нужен \ x07, чтобы сделать настоящий шум. Закрепление.
спагетто

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

Спасибо за внимание, я также ценю идею использования «с».
Никсон

Я не считал <script>теги необходимыми для того, чтобы JavaScript считался полной программой раньше. Я думаю, что вы хороши для 114. Кроме того, удаление pназначения и просто настройка frequency.value=prompt()должны привести вас к 110.
Mwr247

@ 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();

(По какой-то причине для обработки требуется использовать оператор импорта и новую строку, в противном случае она не распознает библиотеку.)

Я до сих пор не выяснил, как передать аргументы в 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 Stringи Beep(a(0),5000)сократить общее количество до 74 байтов в соответствии с счетчиком байтов
Sehnsucht

2

Turbo / Borland / Free / GNU Pascal, 95 байт

Из-за проблем с функцией задержки на современных компьютерах (ну, все, что быстрее 200 МГц), пытающихся запустить Turbo / Borland Pascal, это может не ждать 5 секунд, даже с исправленной библиотекой CRT

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

Преобразование строки в целое число может быть сделано короче (77 байт) на FreePascal и современных производных, так как они имеют StrToIntфункцию:

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

1
Насколько я знаю, программа на Паскале будет отлично работать со всеми компиляторами, даже без Program a;части, поэтому вы можете выиграть 10 байт, если ее опустить.
vsz

@vsz FPC может быть в порядке (так что я могу удалить это из второго фрагмента), я все еще должен проверить некоторые древние, такие как TP5.5, насколько я помню, они требовали этого.
Штупы

В требованиях говорится: «Ввод должен быть принят через STDIN», поэтому пропустите это по длине ParamStr()и просто по Read()мере необходимости: pastebin.com/1Tw2d0D6
manatwork

2

Perl, 27 байт

В основном, версия Perl для Perthon (также работает только в Windows), если мы разрешаем модули.

use Audio::Beep;beep<>,5000

2

Витси + X11, 20 байт

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

Перевод моего bash ответа. Не работает в онлайн-переводчике (очевидно).

Принимает ввод как любой нечисловой символ, за которым следует частота (поэтому для входа 440 Гц вы можете сделать «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ɪᴋᴇʀ

Вы использовали Витси. <3 Мой ребенок искуплен.
Эддисон Крамп

1

C WinAPI, 82 байта

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

Использует функцию WinAPI Beep ().


Вам не нужно переходить &xна scanf? Также вы можете объявить xв качестве параметра main и позволить компилятору установить его тип по умолчанию.
Нил

@ Нейл, я не знаю, как я это опечатал, не переходя &xна scanf(). Исправлено сейчас; Спасибо.
user2064000


0

Шадертой 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));}

«Ввод» осуществляется через #define . Вывод синусоиды с приблизительной частотой FГц. Округлено 2 * Пи до 6,3, вместо «по умолчанию» 6,2831, но звучит почти так же.

К сожалению, здесь не так много для гольфа.


Ввод должен быть сделан через STDIN, а не жестко закодирован.
Flawr

@flawr Я не знаю никаких методов точного ввода в Shadertoy. Пожалуйста, просветите меня.
Кролтан

Это должно быть вашей задачей, а не моей. Но я все равно не знаю Шадертой, поэтому не могу вам помочь.
Flawr

@flawr единственный метод разумной точности - это позиция курсора, но она доступна только для шейдеров изображения, но не для шейдеров звука. Так что я в значительной степени застрял с определениями.
Кролтан

Вы можете загружать файлы? Это то, что я сделал.
геокавель

0

Джольф, 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)

Преобразует из Гц в полшага и воспроизводит определенную ноту со значением отстройки, чтобы получить частоту.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.