Génère du bruit blanc

15

Le défi est: générer un fichier audio fait de bruit blanc.
Exigences et instructions:

  • Votre programme doit générer un fichier audio contenant uniquement du bruit blanc, ce qui signifie que son intensité est la même pour toutes les fréquences (raisonnables) et non nulles [voir un exemple de tracé ];
  • Il faut être capable de lire le fichier audio sur la dernière version de VLC [au moment d'écrire votre réponse];
  • Le programme n'a pas besoin d'aléatoire cryptographique fort, de randfonctions ou de lecture /dev/randest correct;
  • Le programme doit être capable de générer au moins 1 heure d'audio, au moins en théorie (ce qui signifie que les limitations du système comme la taille maximale des fichiers ne s'appliquent pas);
  • Votre score est le nombre d'octets dans votre code source, plus tous les bonus qui s'appliquent;
  • L'utilisation d'une bibliothèque externe tierce est correcte;
  • Le programme doit fonctionner sans accès à Internet.

Les bonus sont:

  • -15%: Permet de spécifier le format du fichier audio (au moins deux choix; le nombre de choix possibles ne change pas la partition);
  • -10%: Permet de spécifier la durée du fichier audio;
  • -5%: Permet de spécifier le débit binaire du fichier audio.

Les paramètres peuvent être stockés dans des variables, des fichiers ou donnés en tant que paramètres de ligne de commande, selon votre choix. Les pourcentages sont calculés à partir du nombre d'octets d'origine, avant que tout bonus ne soit appliqué.

Giulio Muscarello
la source
La spécification du problème semble décrire un défi de colfing de code, mais les balises disent le contraire.
undergroundmonorail
Oups! Je vais arranger ça.
Giulio Muscarello
Le défi devrait peut-être être révisé pour n'autoriser que "les bibliothèques tierces existantes" au lieu de "toute bibliothèque".
jpmc26
Allez-vous être un bâton sur le bruit étant blanc? Si vous voulez vraiment vérifier: son autocorrélogramme devrait avoir un pic clair autour de zéro, et presque rien à tout autre délai. Si vous n'allez pas être un stickler, je dis qu'il est inutile de spécifier que ce soit du bruit blanc. Dis juste du bruit.
Tim Seguine
Qu'en est-il de WebAudioAPI? J'ai codé le programme js, qui joue du bruit blanc
Евгений Новиков

Réponses:

4

MATLAB, 25

wavwrite(rand(8e3,1),'a')

écrit un nouveau fichier WAV sur le disque appelé a. Il a une fréquence d'échantillonnage de 8 kHz et 16 bits par échantillon au format entier signé. Les données source sont réparties uniformément sur l'intervalle [0,1], qui est mappé sur l'intervalle[0,32767] après la conversion au format entier.

MATLAB, 28-4 (10% + 5%) = 24

Je ne sais pas ce que l'OP signifiait sur la façon dont les paramètres pouvaient être stockés dans des variables, mais je l'ai interprété d'une manière favorable à ce cas. En admettant que:

  • Le débit binaire souhaité (en bits / seconde) est fourni par l'utilisateur dans la variable b. Les bits par échantillon sont codés en dur à 16.

  • La durée souhaitée du fichier (en échantillons) est donnée dans la variable d.

Le résultat est:

wavwrite(rand(d,1),b/16,'a')

MATLAB, 16-4 (15% + 10%) = 12

En ajoutant une autre couche de sleaze à la recherche de bonus, je fais une autre hypothèse: la fonction souhaitée à utiliser pour sortir le fichier doit être spécifiée dans la variable f. Ensuite, le code se simplifie pour:

f(rand(d,1),'a')

Les valeurs autorisées pour la fonction sont:

f = @wavwrite

ou

f = @auwrite

Chaque fonction entraînera l'extrait ci-dessus à écrire un fichier du format approprié (WAV ou .au) à une fréquence d'échantillonnage de 8 kHz avec la durée spécifiée. J'ai retiré le bonus pour la spécification du débit ici, car par auwritedéfaut à 8 bits par échantillon au lieu de 16 comme le wavwritefait. Je ne vois pas de moyen d'harmoniser les deux sans utiliser plus de caractères.

Jason R
la source
10

Bash, 34

dd if=/dev/sda of=file.wav count=1

Si vous ne voulez pas que le disque dur soit aléatoire, (beaucoup plus lent)

dd if=/dev/random of=file.wav count=9

SPIN, 28

word x=0
repeat
 word[?x]=?x
Le docteur
la source
4
D'une manière ou d'une autre, je ne pense pas que l'en-tête du fichier puisse être entièrement aléatoire / identique au premier secteur du lecteur de disque dur
John Dvorak
1
Herr Doctor peut avoir raison, si le harnais de test est VLC. VLC est assez indulgent.
Jonathan Van Matre
1
Vous avez généré du bruit, mais s'agit-il d'un bruit blanc?
Stephen Melvin
1
/ dev / random existe également sur Mac, yay! Malheureusement, iTunes ne peut pas lire le fichier wav résultant. Non pas que je puisse me plaindre - j'ai opté pour VLc en raison de sa tolérance et de la multitude de codecs natifs.
Giulio Muscarello
1
Vous pouvez enregistrer cinq caractères en exécutant la commande pendant que le répertoire de travail est /dev.
David Richerby
4

Mathematica 52 - 5 = 47

gexporte un fichier .wav de bruit blanc de ssecondes et 8000 bps.

g@s_:=Export["p.wav",RandomReal@{-1,1}~Play~{t,0,s}]

Exemple: un fichier de bruit blanc de 6 secondes est exporté.

g[6]

p.wav

DavidC
la source
4

Supercollider, 89 - 10% = 80,1 octets

Malheureusement, bien qu'il ait été délibérément conçu pour la génération de sons / audio, ce langage ne va pas gagner ici. Mais c'est la première apparition de Supercollider sur Code Golf, donc c'est cool!

Cette soumission perd principalement parce que la configuration de l'enregistrement et sa réalisation est un processus prolixe en raison de la conception client / serveur de cette langue. Pourtant, c'est un langage cool avec beaucoup de puissance dans très peu de code lorsque vous lui demandez de faire choses plus complexes qu'un simple bruit blanc.

La durée du fichier est définie en modifiant la valeur wait (). Je pourrais le mettre dans une variable, mais cela ne sert à rien car Supercollider n'a pas de stdio à proprement parler. L'interactivité consiste à manipuler le code en direct pendant que le serveur est en cours de lecture. Essentiellement, l'IDE est l'E / S (sauf si vous créez une interface utilisateur pour votre création).

Voici la version golfée:

{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

Voici une version golfée avec l'option d'enregistrer en aiff ou wav, et spécifiez un format d'échantillon (int16, int8 et float sont toutes des options). Malheureusement, même avec tous les bonus, la version ci-dessus se porte mieux. Ce serait 139 - 30% = 97,3 octets.

s.recSampleFormat='int16';s.recHeaderFormat='wav';{WhiteNoise.ar(1)}.play;s.prepareForRecord;Routine.run{s.record;wait(99);s.stopRecording}

Et voici une version non golfée de ce dernier, afin que vous puissiez voir ce qui se passe.

s.recSampleFormat='int16';
s.recHeaderFormat='wav';

{WhiteNoise.ar(1)}.play;
s.prepareForRecord;

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}
Jonathan Van Matre
la source
un vote pour l'utilisation de Supercollider. Il y a beaucoup d'autres puzzles pour lesquels ce serait bien. Découvrez la musique et l' audio
pas que Charles
4

Bash + ALSA, score: 44 (52 caractères - (10% + 5%) bonus)

Plus long que l'autre bashréponse, mais accepte la durée et le débit binaire. Ajoute également un en-tête raisonnablement correct au fichier, donc devrait être raisonnablement portable:

arecord -r$2|head -c44;head -c$[$2*$1] /dev/urandom

Enregistrez-le en tant que script, chmod +xexécutez-le:

$ ./wav.sh 1 44100 > c.wav
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 44100 Hz, Mono
$ 

Notez que la sortie .wav est vers stdout, elle doit donc être redirigée vers un fichier.

Traumatisme numérique
la source
Vous pouvez enregistrer environ 1,20 caractère en lisant / dev / random au lieu de / dev / urandom, car la vitesse n'est pas une exigence.
Giulio Muscarello
1
la sortie est à stdin ?
user253751
0

C 127 115 octets

#define H htonl
main(c){for(write(1,(int[]){H(779316836),H(24),-1,H(2),H(8000),H(1)},24);;write(1,&c,1))c=rand();}

La majorité du code écrit l'en-tête d'un fichier * .au. Cela imprime un fichier son pseudo-aléatoire en sortie standard.

La fréquence d'échantillonnage peut être ajustée en changeant le 8000.

La durée peut être ajustée en appuyant sur ctrl-cquand vous voulez arrêter :-)

plafond
la source
0

JavaScript, 167 octets

ATTENTION: diminuez le volume avant l'exécution. Le bruit blanc est méchant

Ne génère pas de fichier, peut-être pas ce qui était attendu.

-4 octets pirater le bruit de lecture sur le canal gauche uniquement

c=new AudioContext()
n=c.createScriptProcessor(s=512)
n.connect(c.destination)
n.onaudioprocess=e=>{a=s;while(a--){e.outputBuffer.getChannelData(0)[a]=Math.random()}}

Евгений Новиков
la source