Produce un sonido de cierta frecuencia

25

Este es un desafío bastante simple, pero no pude encontrar ninguna pregunta que fuera realmente similar. El desafío es tomar una frecuencia al usar STDIN o un equivalente, y luego emitir un tono que coincida con esa frecuencia, en Hz, durante 5 segundos. Por ejemplo

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

Reglas

  • La entrada debe ingresarse a través de STDIN, o el equivalente de su idioma
  • La respuesta debe ser un programa completo.
  • Se pueden usar builtins
  • La frecuencia será de 50 a 5000 Hz.
  • La salida debe reproducirse durante 5 segundos.
  • La salida debe tener la forma de una onda sinusoidal.

Casos de prueba

Entrada: 440

Salida:

Entrada: 200

Salida:

Entrada: 4000

Salida:


  • No se trata de encontrar el idioma con la solución más corta para esto (hay algunos en los que el programa vacío hace el truco), se trata de encontrar la solución más corta en cada idioma. Por lo tanto, ninguna respuesta se marcará como aceptada.

  • A diferencia de nuestras reglas habituales, siéntase libre de usar un idioma (o versión de idioma) incluso si es más nuevo que este desafío. Los idiomas específicamente escritos para enviar una respuesta de 0 bytes a este desafío son juegos justos pero no particularmente interesantes.

    Tenga en cuenta que debe haber un intérprete para que se pueda probar el envío. Está permitido (e incluso alentado) escribir este intérprete usted mismo para un lenguaje previamente no implementado.

    También tenga en cuenta que los idiomas deben cumplir nuestros criterios habituales para los lenguajes de programación .


Catalogar

El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

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

Chris Loonam
fuente
¿Sería aceptable una función?
un espagueti
@quartata Debería ser un programa completo.
Chris Loonam
2
Veo que mucha gente está usando una beep()función. ¿Se garantiza que es una onda sinusoidal?
geokavel
2
Lo de Windows System.Console.Beepes una onda sinusoidal en mi máquina (moderna, Windows 10), así que creo que eso cuenta. Las soluciones en PPCG generalmente no necesitan ser portátiles.
Lynn
¿Imprimir un archivo de audio es una forma válida de "emitir un tono"?
Ilmari Karonen

Respuestas:

13

QBasic, 18 bytes (descalificado)

Como mencionó @pabouk, esto usa el altavoz de la PC, por lo que reproduce una onda cuadrada , no una onda sinusoidal como el problema pregunta. (Este requisito se agregó al problema después de que se publicó esta respuesta, de ahí los votos). Lo dejaré aquí para la posteridad de todos modos.


INPUT F
SOUND F,91

Reproduzca un sonido a la frecuencia introducida durante 91 ticks, que es igual a 5 segundos.

Lynn
fuente
Este programa no cumple el último requisito: "La salida debe tener la forma de una onda sinusoidal". SOUNDEl comando utiliza el altavoz de la PC que, según lo diseñado, fue impulsado por un chip temporizador 8254 que produce una onda cuadrada. --- Aunque en las PC modernas 8254 podría faltar, la emulación correcta del SOUNDcomando debería producir una onda cuadrada.
Pabouk
3
Este requisito se agregó después de que publiqué mi respuesta. : / Agregaré una nota, pero me siento extraño por eliminar esta respuesta cuando es la que votó en la parte superior.
Lynn
12

Python2, 40 bytes

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

Solo funciona en Windows.

orlp
fuente
1
Funcionaria 5e3?
Lynn
3
@Mauris No, ya lo había intentado pero solo quiere enteros.
orlp
10

Mathematica, 42 bytes

Bueno, si podemos usar incorporados ...

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

Gracias al requisito de un programa completo, esta fue la primera vez que utilicé mi punta de golf descubierta recientemente% (resultado de la última evaluación) para guardar dos bytes.

Mathematica también tiene una función incorporada Soundque toma un tono y una duración como argumentos, pero desafortunadamente el tono tiene que ser dado como una nota musical. Especificar su propia onda de sonido a través Playparece ser la única forma de trabajar con una frecuencia.

Martin Ender
fuente
7

C #, 80 bytes

class P{static void Main(string[]a){System.Console.Beep(int.Parse(a[0]),5000);}}
Sean Latham
fuente
¿Sabes cuál es la alternativa para Beeping en Java?
Kritixi Lithos
7

MATLAB, 36 bytes

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

Gracias a flawr por guardar dos bytes.

Agujero negro
fuente
2
Puedes guardar un personaje usando en 2^-12lugar de 1/4096.
falla
¡Oh tonto, 8^-4es aún más corto!
falla
6

PowerShell, 32 bytes

[console]::beep((read-host),5kb)
Nacht - Restablece a Monica
fuente
44
¿Se necesita realmente el espacio?
Kasperd
wow, descuidado de mi parte
Nacht - Restablece a Monica el
4

FakeASM , 12 bytes

RDA
BEEP 5e3

Funciona con la implementación de referencia de Windows (descarga) . Llama a la Beepfunción de Windows , que es una onda sinusoidal en las plataformas modernas.

Lynn
fuente
¿Dónde está el STDIN?
gato
1
RDAlee un número de STDIN y lo coloca en el registro A.
Lynn
Terminé leyendo las especificaciones y notando eso, pero olvidé eliminar mi comentario. gracias, sin embargo
gato
4

Bash + X11, 27 20 bytes

xset b 9 $1 5;echo 

Este contiene un no imprimible, así que aquí hay un hexdump:

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

Esto toma la frecuencia como un argumento de línea de comando y reproduce el pitido apropiado a un volumen del 9% (ya que no se especificó ningún volumen).

(Nota: no pude probar esto debido a algunos problemas con mi computadora, pero estoy 99% seguro de que funciona).

un espagueti
fuente
¿Hay un \ x07 allí?
TheDoctor
No, xset hace todos los pitidos.
un espagueti
@TheDoctor Oh, ya veo lo que quieres decir ... necesita un \ x07 para hacer el ruido real. Fijación.
un spaghetto
echo <BEL>donde <BEL>está el carácter real, guarda 6 bytes.
Dennis
@Dennis D'oh. ¡Gracias!
un spaghetto
4

JavaScript, 114 bytes

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

Requiere un navegador de vanguardia, ingrese la frecuencia en el indicador. JSFiddle

Nickson
fuente
Esto no se reproducirá durante 5 segundos porque prompt()se llama después de que se inicia el temporizador de audio new AudioContext(). Creo que lo más corto que puedes obtener es 115 bytes c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655
Gracias por el aviso, aprecio la idea de usar 'con' también.
Nickson el
No he visto <script>etiquetas como necesarias para que JavaScript se considere un programa completo antes. Creo que eres bueno para el 114. Además, eliminar la pasignación y solo establecerlo frequency.value=prompt()debería llevarte a 110.
Mwr247
@ Mwr247 Desafortunadamente, como señaló user81655, el temporizador que determina cuándo se detiene el audio comienza cuando se crea el AudioContext. El aviso tiene que aparecer antes de eso, o una entrada lenta podría dar como resultado un audio más corto o ningún audio.
Nickson
p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)esto ahorra 3 bytes
Patrick Roberts
4

Bash + utilidades de 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

Esta es una verdadera onda sinusoidal. No hay pitidos. Frecuencia de entrada ingresada a través de la línea de comando:

./hz.sh 440
Trauma digital
fuente
3

Procesamiento, 148 114 106 bytes

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

(Por alguna razón, el procesamiento requiere el uso de la declaración de importación y la nueva línea; de lo contrario, no reconoce la biblioteca).

Todavía no he descubierto cómo pasar argumentos al procesamiento, aunque sé que es posible, por lo que este código requiere tener un archivo llamado "s" en la carpeta de croquis que tiene el valor de frecuencia. Si puedo descubrir cómo pasar argumentos, podría reemplazar la carga de archivos con args[0].

geokavel
fuente
3

VB.net, 90 bytes , 74 bytes

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

Gracias a Sehnsucht.

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

Esta es mi primera publicación, así que si hice algo mal, hágamelo saber

Eric Johnson
fuente
1
Eso podría reducirse obteniendo el argumento de la línea de comando en argumentos principales Main(a()As Stringy Beep(a(0),5000)reduciendo el total a 74 bytes de acuerdo con el contador de bytes
Sehnsucht
2

Turbo / Borland / Free / GNU Pascal, 95 bytes

Debido a problemas con la función de retraso en las computadoras modernas (bueno, algo más rápido que 200Mhz) que intenta ejecutar Turbo / Borland pascal, esto podría no esperar 5 segundos, incluso con una biblioteca CRT parcheada

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

La conversión de Cadena a Entero se puede hacer más corta (77 bytes) en FreePascal y derivados modernos, ya que tienen la StrToIntfunción:

Program a;Uses crt;BEGIN Sound(StrToInt(ParamStr(1)));Delay(5000);NoSound;END.
SztupY
fuente
1
Hasta donde sé, un programa Pascal funcionará bien con todos los compiladores, incluso sin la Program a;parte, por lo que puede ganar 10 bytes omitiéndolo.
vsz
@vsz FPC podría estar bien (por lo que puedo eliminar eso del segundo fragmento), todavía tengo que verificar algunos antiguos, como TP5.5, por lo que recuerdo que lo requerían.
SztupY
Los requisitos dicen "La entrada debe ser ingresada a través de STDIN", así que omita esa extensión ParamStr()y solo Read()según sea necesario: pastebin.com/1Tw2d0D6
manatwork
2

Perl, 27 bytes

Básicamente, una versión de Perl de la respuesta de Python (también solo funciona en Windows), si permitimos módulos.

use Audio::Beep;beep<>,5000
ChicagoRojoSox
fuente
2

Vitsy + X11, 20 bytes

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

Una traducción de mi respuesta bash. No funciona en el intérprete en línea (obviamente).

Toma la entrada como cualquier carácter no numérico seguido de la frecuencia (por lo que para una entrada de 440 Hz puede hacer "a440").

Explicación

"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.
un espagueti
fuente
Buena respuesta. Buen trabajo.
Rɪᴋᴇʀ
Usaste a Vitsy. <3 Mi hijo es redimido.
Addison Crump
1

C con WinAPI, 82 bytes

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

Utiliza la función WinAPI Beep ().

usuario2064000
fuente
No se necesita pasar &xa scanf? También puede declarar xcomo parámetro a main y dejar que el compilador predetermine su tipo.
Neil
@Neil, no sé cómo lo escribí mal sin pasar &xa scanf(). Arreglado ahora; Gracias.
user2064000
1

Hassium , 38 Bytes

func main()Console.beep(input(), 5000)
Jacob Misirian
fuente
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));}

"Entrada" se da a través de #define. Emite una onda sinusoidal con una frecuencia aproximada de FHz. Redondeado 2 * Pi a 6.3, en lugar de "predeterminado" 6.2831, pero suena más o menos igual.

Lamentablemente, no hay mucho para jugar golf aquí.

Kroltan
fuente
La entrada debe tomarse a través de STDIN, no codificada.
falla
@flawr No conozco ningún método de entrada precisa en Shadertoy. Por favor iluminame.
Kroltan
Esta debería ser tu tarea, no la mía. Pero de todos modos no conozco a Shadertoy, así que no puedo ayudarte.
falla
@flawr el único método de precisión razonable sería la posición del cursor, pero eso solo está disponible para sombreadores de imagen, no sombreadores de sonido. Así que estoy bastante atrapado con las definiciones.
Kroltan el
¿Puedes cargar archivos? Eso fue lo que hice.
geokavel
0

Jolf, 4 bytes, sin competencia

Esta adición de lenguaje vino después del desafío.

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

La onda predeterminada es una onda sinusoidal.

Conor O'Brien
fuente
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)

Convierte de Hz a medios pasos, y toca una cierta nota con el valor de desafinación para producir la frecuencia.

12Me21
fuente