Beyaz gürültü üret


15

Sorun: beyaz gürültüden oluşan bir ses dosyası oluşturmak.
Gereksinimler ve talimatlar:

  • Programınız yalnızca beyaz parazit içeren bir ses dosyası oluşturmalıdır, yani yoğunluğu tüm (makul) frekanslar ve sıfır olmayanlar için aynıdır [bir örnek grafiğe bakınız ];
  • Ses dosyasını [cevabınızı yazarken] VLC'nin en son sürümünde çalabilmeniz gerekir;
  • Program kriptografik olarak güçlü rasgelelik, randfonksiyonlar veya okumaya ihtiyaç duymaz /dev/rand;
  • Program en azından teoride en az 1 saatlik ses üretebilmelidir (yani maksimum dosya boyutu gibi sistem sınırlamaları geçerli değildir);
  • Puanınız, kaynak kodunuzdaki bayt sayısı ve geçerli olan tüm bonuslardır;
  • Herhangi bir üçüncü tarafın kullanılması durumunda, harici kütüphane uygundur;
  • Program internet erişimi olmadan çalışmalıdır.

Bonuslar:

  • % -15: Ses dosyasının biçimini belirtmeye izin ver (en az iki seçenek; olası seçenek sayısı puanı değiştirmez);
  • % -10: Ses dosyasının süresini belirtmeye izin ver;
  • -5%: Ses dosyasının bit hızını belirtmeye izin ver.

Ayarlar, değişkenlerde, dosyalarda saklanabilir veya seçiminize göre komut satırı parametreleri olarak verilebilir. Yüzdeler, herhangi bir bonus uygulanmadan önce orijinal bayt sayısından hesaplanır.


Sorun özelliği, bir kod harmanlama sorununu açıklıyor gibi görünüyor, ancak etiketler aksini söylüyor.
undergroundmonorail

Tüh! Bunu düzeltirim.
Giulio Muscarello

Belki de meydan okuma, "herhangi bir kütüphane" yerine yalnızca "mevcut üçüncü taraf kütüphanelerine" izin verecek şekilde gözden geçirilmelidir.
jpmc26

Beyaz olan gürültüye yapışacak mısın? Gerçekten doğrulamak istiyorsanız: otokorelogramında sıfır civarında net bir artış olmalı ve diğer gecikmelerde neredeyse hiçbir şey olmamalıdır. Eğer bir stickler olmayacaksanız, beyaz gürültü olacağını belirtmenin anlamsız olduğunu söylüyorum. Sadece gürültü de.
Tim Seguine

WebAudioAPI ne olacak? Beyaz gürültü çalan js programını
kodladım

Yanıtlar:


4

MATLAB, 25

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

adlı diske yeni bir WAV dosyası yazar a. İşaretli tamsayı formatında 8 kHz örnekleme hızına ve örnek başına 16 bite sahiptir. Kaynak veriler, tamsayı biçimine dönüşümden sonraki [0,1]aralığa eşlenen aralıkta eşit olarak dağıtılır [0,32767].

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

OP'nin ayarların değişkenlerde nasıl saklanabileceği konusunda ne anlama geldiğinden emin değilim, ancak bu duruma uygun bir şekilde yorumladım. Varsayım:

  • İstenen bit hızı (bit / saniye cinsinden), değişken tarafından kullanıcı tarafından sağlanır b. Örnek başına bit sayısı 16'da sabit kodlanmıştır.

  • Dosyanın istenen süresi (örneklerde) değişkende verilmiştir d.

Sonuç:

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

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

İkramiye peşinde başka bir sleaze katmanı ekleyerek, başka bir varsayım yapıyorum: dosya çıktısını almak için kullanılacak işlev değişkende belirtilmelidir f. Sonra kod basitleştirir:

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

İşlev için izin verilen değerler:

f = @wavwrite

veya

f = @auwrite

Her işlev, yukarıdaki snippet'in belirtilen formatta .au8 kHz örnek hızında uygun formatta bir dosya (WAV veya ) yazmasına neden olur . Burada bit hızı spesifikasyonu için bonusu çıkardım, çünkü auwriteörnek başına 16 bit yerine varsayılan olarak 8 bit wavwritevar. Daha fazla karakter kullanmadan ikisini uyumlu hale getirmenin bir yolunu görmüyorum.


10

Baş, 34

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

Sabit sürücü 'rastgele' istemiyorsanız, (çok daha yavaş)

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

SIKMA, 28

word x=0
repeat
 word[?x]=?x

4
Her nasılsa, dosya başlığının tamamen rastgele / sabit disk sürücüsü ilk sektörü ile aynı olabileceğini düşünmüyorum
John Dvorak

1
Test kayışı VLC ise Herr Doctor haklı olabilir. VLC oldukça affedicidir.
Jonathan Van Matre

1
Gürültü yarattınız, ama beyaz gürültü mü?
Stephen Melvin

1
/ dev / random Mac'lerde de var, yay! Ne yazık ki iTunes ortaya çıkan wav dosyasını çalamıyor. Şikayet edebileceğimden değil - affedilmesi ve çok sayıda yerel kodek nedeniyle VLc'yi seçtim.
Giulio Muscarello

1
Çalışma dizini varken komutu yürüterek beş karakter kaydedebilirsiniz /dev.
David Richerby

4

Mathematica 52-5 = 47

gssaniye ve 8000 bps beyaz gürültü .wav dosyasını verir .

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

Örnek: 6 saniyelik beyaz gürültü dosyası dışa aktarılır.

g[6]

p.wav


4

Süper toplayıcı,% 89 - 10 = 80.1 bayt

Ne yazık ki, kasıtlı olarak ses / ses üretimi için yapılmış olmasına rağmen, bu dil burada kazanmayacak. Ancak bu, Code Golf'teki Supercollider'ın ilk görünümü, bu yüzden bu harika!

Bu gönderi öncelikle kaydın ayarlanması ve gerçekleşmesi bu dilin istemci / sunucu tasarımı nedeniyle ayrıntılı bir süreç olduğu için kaybedilir. Yine de, sadece beyaz gürültüden daha karmaşık şeyler yapmasını istediğinizde çok az kodda çok fazla güce sahip serin bir dil .

Dosya süresi wait () değeri değiştirilerek ayarlanır. Bir değişkene koyabilirim, ama Supercollider'ın konuşacak bir stdio'su olmadığından bunun gerçekten bir anlamı yok. Etkileşim, sunucu halen oynatılırken canlı kodu manipüle etmektir. Esasen, IDE olan (eğer oluşturulması için bir UI oluşturmak sürece) I / O.

İşte golfçü versiyon:

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

İşte aiff veya wav olarak kaydetme ve örnek bir format belirleme seçeneğine sahip bir golfçü versiyon (int16, int8 ve float tüm seçeneklerdir). Ne yazık ki, tüm bonuslarda bile, yukarıdaki sürüm daha iyi. Bu% 139-30 = = 97.3 bayt olacaktır.

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

Ve işte ikincisinin golf edilmemiş bir versiyonu, böylece neler olduğunu görebilirsiniz.

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

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

Routine.run{
    s.record;
    wait(99);
    s.stopRecording
}

Supercollider kullanımı için bir oy. BÜYÜK olurdu diğer bulmacalar bir sürü vardır. Müzik ve ses
Charles

4

Bash + ALSA, skor: 44 (52 karakter - (% 10 +% 5) bonus)

Diğer bashyanıttan daha uzun , ancak süre ve bit hızını kabul ediyor. Ayrıca, dosyaya makul ölçüde doğru bir başlık ekler, bu nedenle makul derecede taşınabilir olmalıdır:

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

Komut dosyası olarak kaydedin chmod +xve çalıştırın:

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

Not .wav çıktısının stdout olması gerektiğinden, bir dosyaya yeniden yönlendirilmesi gerekir.


/ Dev / urandom yerine / dev / random okuyarak yaklaşık 1,20 karakter kaydedebilirsiniz, çünkü hız bir gereklilik değildir.
Giulio Muscarello

1
çıkış etmektir stdin'i ?
user253751

0

C 127115 bayt

#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();}

Kodun büyük bir kısmı * .au dosyası için başlık yazar. Bu, standart çıkış için sahte bir ses dosyası yazdırır.

Numune oranı değiştirilerek ayarlanabilir 8000.

Süreyi ctrl-cdurdurmak istediğinizde vurarak süre ayarlanabilir :-)


0

JavaScript, 167 bayt

DİKKAT: Çalıştırmadan önce sesi azaltın. Beyaz gürültü kötü

Dosya oluşturmayın, beklendiği gibi olmayabilir.

-4 bayt hack çalma gürültüsü yalnızca sol kanalda

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()}}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.