Produire un son d'une certaine fréquence

25

C'est un défi assez simple, mais je n'ai trouvé aucune question qui lui soit vraiment similaire. Le défi consiste à prendre une fréquence en utilisant STDIN ou un équivalent, puis à émettre une tonalité qui correspond à cette fréquence, en Hz, pendant 5 secondes. Par exemple

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

Règles

  • La saisie doit être effectuée via STDIN ou l'équivalent de votre langue
  • La réponse doit être un programme complet
  • Les Builtins peuvent être utilisés
  • La fréquence sera comprise entre 50 et 5000 Hz
  • La sortie doit être lue pendant 5 secondes
  • La sortie doit être sous la forme d'une onde sinusoïdale

Cas de test

Contribution: 440

Sortie:

Contribution: 200

Sortie:

Contribution: 4000

Sortie:


  • Il ne s'agit pas de trouver la langue avec la solution la plus courte pour cela (il y en a où le programme vide fait l'affaire) - il s'agit de trouver la solution la plus courte dans chaque langue. Par conséquent, aucune réponse ne sera marquée comme acceptée.

  • Contrairement à nos règles habituelles, n'hésitez pas à utiliser une langue (ou une version linguistique) même si elle est plus récente que ce défi. Les langues spécifiquement écrites pour soumettre une réponse de 0 octet à ce défi sont équitables mais pas particulièrement intéressantes.

    Notez qu'il doit y avoir un interprète pour que la soumission puisse être testée. Il est permis (et même encouragé) d'écrire cet interprète vous-même pour une langue non implémentée auparavant.

    Notez également que les langues ne doivent fullfil nos critères habituels pour les langages de programmation .


Catalogue

L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) en tant que liste des solutions les plus courtes par langue et b) en tant que classement général.

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

## Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:

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

Chris Loonam
la source
Une fonction serait-elle acceptable?
un spaghetto du
@quartata Ce devrait être un programme complet.
Chris Loonam
2
Je vois que beaucoup de gens utilisent une beep()fonction. Est-il garanti qu'il s'agit d'une onde sinusoïdale?
geokavel
2
Le System.Console.Beeptruc de Windows est une onde sinusoïdale sur ma machine (moderne, Windows 10), donc je pense que ça compte. Les solutions sur PPCG n'ont généralement pas besoin d'être portables.
Lynn
Est-ce que l'impression d'un fichier audio est un moyen valide de "produire une tonalité"?
Ilmari Karonen

Réponses:

13

QBasic, 18 octets (disqualifié)

Comme @pabouk l'a mentionné, cela utilise le haut-parleur du PC, donc il joue une onde carrée , pas une onde sinusoïdale comme le problème le demande. (Cette exigence a été ajoutée au problème après la publication de cette réponse, d'où les votes.) Je vais quand même le laisser ici pour la postérité.


INPUT F
SOUND F,91

Jouez un son à la fréquence entrée pendant 91 ticks, ce qui équivaut à 5 secondes.

Lynn
la source
Ce programme ne satisfait pas à la dernière exigence: "La sortie doit être sous la forme d'une onde sinusoïdale". SOUNDLa commande utilise le haut-parleur PC qui, tel que conçu, était piloté par une puce de minuterie 8254 qui produit une onde carrée. --- Bien que dans les PC modernes 8254 puisse manquer, l'émulation correcte de la SOUNDcommande devrait produire une onde carrée.
pabouk
3
Cette exigence a été ajoutée après avoir posté ma réponse. : / Je vais ajouter une note, mais je me sens bizarre de supprimer cette réponse quand c'est celle qui a voté en haut.
Lynn
12

Python2, 40 octets

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

Fonctionne uniquement sous Windows.

orlp
la source
1
Ça 5e3marcherait?
Lynn
3
@Mauris Non, j'avais déjà essayé ça mais il ne veut que des entiers.
orlp
10

Mathematica, 42 octets

Eh bien, si nous pouvons utiliser des modules intégrés ...

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

Grâce à l'exigence d'un programme complet, c'était la première fois que j'utilisais mon astuce de golf récemment découverte% (résultat de la dernière évaluation) pour économiser deux octets.

Mathematica a également un intégré Soundqui prend un pitch et une durée comme arguments, mais malheureusement le pitch doit être donné comme une note de musique. La spécification de votre propre onde sonore via Playsemble être la seule façon de travailler avec une fréquence.

Martin Ender
la source
7

C #, 80 octets

class P{static void Main(string[]a){System.Console.Beep(int.Parse(a[0]),5000);}}
Sean Latham
la source
Savez-vous quelle est l'alternative pour Beeping en Java?
Kritixi Lithos
7

MATLAB, 36 octets

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

Merci à flawr avoir économisé deux octets.

Trou noir
la source
2
Vous pouvez enregistrer un caractère en utilisant 2^-12au lieu de 1/4096.
flawr
Oh idiot moi, 8^-4c'est encore plus court!
flawr
6

PowerShell, 32 octets

[console]::beep((read-host),5kb)
Nacht - Rétablir Monica
la source
4
L'espace est-il vraiment nécessaire?
kasperd
wow, bâclé de moi
Nacht - Réinstallez Monica
4

FakeASM , 12 octets

RDA
BEEP 5e3

Fonctionne avec l'implémentation de référence Windows (téléchargement) . Il appelle la Beepfonction Windows , qui est une onde sinusoïdale sur les plates-formes modernes.

Lynn
la source
Où est le STDIN?
chat
1
RDAlit un nombre dans STDIN et le met en registre A.
Lynn
J'ai fini par lire la spécification et le remarquer, mais j'ai oublié de supprimer mon commentaire. merci, cependant
chat
4

Bash + X11, 27 20 octets

xset b 9 $1 5;echo 

Celui-ci contient un fichier non imprimable, voici donc un hexdump:

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

Cela prend la fréquence comme argument de ligne de commande et émet le bip approprié à un volume de 9% (car aucun volume n'a été spécifié).

(Remarque: je n'ai pas pu tester cela en raison de certains problèmes avec mon ordinateur, mais je suis sûr à 99% que cela fonctionne.)

un spaghetto
la source
Y a-t-il un \ x07 là-dedans?
TheDoctor
Non, xset fait tout le bip.
un spaghetto du
@TheDoctor Oh je vois ce que tu veux dire ... il a besoin d'un \ x07 pour faire le bruit réel. Fixation.
un spaghetto du
echo <BEL><BEL>est le caractère réel, enregistre 6 octets.
Dennis
@Dennis D'oh. Merci!
un spaghetto du
4

JavaScript, 114 octets

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

Nécessite un navigateur un peu avant-gardiste, entrez la fréquence dans l'invite. JSFiddle

Nickson
la source
Cela ne jouera pas pendant 5 secondes car il prompt()est appelé après le démarrage de la minuterie audio new AudioContext(). Je crois que le plus court que vous pouvez obtenir est de 115 octets c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655
Merci pour votre attention, j'apprécie également l'idée d'utiliser "avec".
Nickson
Je n'ai pas vu de <script>balises comme étant requises pour que JavaScript considère un programme complet auparavant. Je pense que vous êtes bon pour le 114. En outre, la suppression de l' paffectation et le simple réglage frequency.value=prompt()devraient vous ramener à 110.
Mwr247
@ Mwr247 Malheureusement, comme l'a souligné user81655, le minuteur qui détermine le moment où l'audio s'arrête démarre lorsque l'AudioContext est créé. L'invite doit apparaître avant cela, sinon une entrée lente pourrait entraîner un son plus court ou aucun son du tout.
Nickson
p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)cela économise 3 octets
Patrick Roberts
4

Utilitaires 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

Il s'agit d'une véritable onde sinusoïdale. Aucun bip. Fréquence d'entrée saisie via la ligne de commande:

./hz.sh 440
Traumatisme numérique
la source
3

Traitement, 148 114 106 106 octets

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

(Pour une raison quelconque, le traitement nécessite à la fois l'utilisation de l'instruction d'importation et la nouvelle ligne, sinon il ne reconnaît pas la bibliothèque.)

Je n'ai toujours pas compris comment passer des arguments dans Processing, bien que je sache que c'est possible, donc ce code nécessite d'avoir un fichier appelé "s" dans le dossier d'esquisse qui a la valeur de fréquence. Si je peux comprendre comment passer des arguments, je pourrais remplacer le chargement de fichiers par args[0].

geokavel
la source
3

VB.net, 90 octets , 74 octets

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

Merci à Sehnsucht

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

Ceci est mon premier message, donc si j'ai fait quelque chose de mal, faites le moi savoir

Eric Johnson
la source
1
Cela pourrait être réduit en obtenant l'argument de ligne de commande dans les arguments principaux à la place Main(a()As Stringet en Beep(a(0),5000)réduisant le total à 74 octets selon le compteur d'octets
Sehnsucht
2

Turbo / Borland / Free / GNU Pascal, 95 octets

En raison de problèmes avec la fonction de retard sur les ordinateurs modernes (enfin, quelque chose de plus rapide que 200Mhz) essayant d'exécuter Turbo / Borland pascal, cela peut ne pas attendre 5 secondes, même avec une bibliothèque CRT corrigée

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

La conversion de chaîne en nombre entier peut être effectuée plus court (77 octets) sur FreePascal et les dérivés modernes, car ils ont la StrToIntfonction:

Program a;Uses crt;BEGIN Sound(StrToInt(ParamStr(1)));Delay(5000);NoSound;END.
SztupY
la source
1
Pour autant que je sache, un programme Pascal fonctionnera très bien avec tous les compilateurs même sans la Program a;partie, vous pouvez donc gagner 10 octets en l'omettant.
vsz
@vsz FPC pourrait être bien (donc je peux le supprimer du deuxième extrait), je dois encore vérifier certains anciens, comme TP5.5, pour autant que je me souvienne qu'ils en avaient besoin.
SztupY
Les exigences stipulent «L'entrée doit être prise en charge via STDIN», alors ignorez cela longuement ParamStr()et juste Read()comme requis: pastebin.com/1Tw2d0D6
manatwork
2

Perl, 27 octets

Fondamentalement, une version Perl de la réponse Python (ne fonctionne également que sous Windows), si nous autorisons les modules.

use Audio::Beep;beep<>,5000
ChicagoRedSox
la source
2

Vitsy + X11, 20 octets

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

Une traduction de ma réponse bash. Ne fonctionne pas dans l'interprète en ligne (évidemment).

Prend l'entrée comme n'importe quel caractère non numérique suivi de la fréquence (donc pour une entrée de 440 Hz, vous pouvez faire "a440").

Explication

"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 spaghetto
la source
Cool réponse. Bon travail.
Rɪᴋᴇʀ
Vous avez utilisé Vitsy. <3 Mon enfant est racheté.
Addison Crump
1

C avec WinAPI, 82 octets

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

Utilise la fonction WinAPI Beep ().

user2064000
la source
Tu n'as pas besoin de passer &xà scanf? Vous pouvez également déclarer xcomme paramètre à main et laisser le compilateur par défaut son type.
Neil
@Neil, je ne sais pas comment je l'ai mal écrit sans passer &xà scanf(). Fixé maintenant; Merci.
user2064000
1

Hassium , 38 octets

func main()Console.beep(input(), 5000)
Jacob Misirian
la source
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" est donné via #define. Émet une onde sinusoïdale avec une fréquence approximative deF Hz. Arrondi 2 * Pi à 6,3, au lieu de "par défaut" 6.2831, mais sonne à peu près la même chose.

Malheureusement, il n'y a pas grand-chose à jouer au golf ici.

Kroltan
la source
L'entrée doit être prise via STDIN et non codée en dur.
flawr
@flawr Je ne connais aucune méthode de saisie précise sur Shadertoy. Veuillez m'éclairer.
Kroltan
C'est votre tâche, pas la mienne. Mais je ne connais pas Shadertoy de toute façon, donc je ne peux pas vous aider.
flawr
@flawr la seule méthode de précision raisonnable serait la position du curseur, mais qui n'est disponible que pour les shaders d'image, pas les shaders de son. Je suis donc assez coincé avec les définitions.
Kroltan
Pouvez-vous charger des fichiers? C'est ce que j'ai fait.
geokavel
0

Jolf, 4 octets, sans concurrence

Cet ajout de langue est venu après le défi.

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

L'onde par défaut est une onde sinusoïdale.

Conor O'Brien
la source
0

SmileBASIC, 84 octets

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

Convertit de Hz en demi-pas et joue la certaine note avec la valeur de désaccord pour produire la fréquence.

12Me21
la source