สร้างเสียงสีขาว


15

ความท้าทายคือ: สร้างไฟล์เสียงที่ทำด้วยเสียงสีขาว
ข้อกำหนดและคำแนะนำ:

  • โปรแกรมของคุณต้องสร้างไฟล์เสียงที่มีเพียงเสียงสีขาวเท่านั้นซึ่งหมายถึงความเข้มของเสียงนั้นเหมือนกันสำหรับความถี่ (สมเหตุสมผล) ทั้งหมดและไม่ใช่ศูนย์ [ดูตัวอย่างพล็อต ];
  • คุณต้องสามารถเล่นไฟล์เสียงใน VLC เวอร์ชันล่าสุด [ในขณะที่เขียนคำตอบของคุณ];
  • โปรแกรมที่ไม่จำเป็นต้องมีการสุ่มเข้ารหัสที่แข็งแกร่ง, randฟังก์ชั่นหรือการอ่านจาก/dev/randไม่เป็นไร;
  • โปรแกรมต้องสามารถสร้างเสียงอย่างน้อย 1 ชั่วโมงอย่างน้อยในทางทฤษฎี (หมายถึงข้อ จำกัด ของระบบเช่นขนาดไฟล์สูงสุดไม่ได้ใช้)
  • คะแนนของคุณคือจำนวนไบต์ในซอร์สโค้ดของคุณรวมถึงโบนัสทั้งหมดที่ใช้
  • การใช้ห้องสมุดภายนอกของบุคคลที่สามก็ไม่เป็นไร
  • โปรแกรมจะต้องทำงานโดยไม่ต้องเข้าถึงอินเทอร์เน็ต

โบนัสคือ:

  • -15%: อนุญาตให้ระบุรูปแบบของไฟล์เสียง (อย่างน้อยสองตัวเลือกจำนวนตัวเลือกที่เป็นไปได้ไม่เปลี่ยนคะแนน)
  • -10%: อนุญาตให้ระบุระยะเวลาของไฟล์เสียง
  • -5%: อนุญาตให้ระบุบิตเรตของไฟล์เสียง

การตั้งค่าสามารถเก็บไว้ในตัวแปรไฟล์หรือกำหนดเป็นพารามิเตอร์บรรทัดคำสั่งที่คุณเลือก เปอร์เซ็นต์จะคำนวณจากจำนวนไบต์ดั้งเดิมก่อนที่จะใช้โบนัสใด ๆ


ข้อมูลจำเพาะของปัญหาดูเหมือนว่าจะอธิบายถึงความท้าทายของการกำหนดรหัส แต่แท็กพูดอย่างอื่น
undergroundmonorail

อ๊ะ! ฉันจะแก้ไขมัน
Giulio Muscarello

บางทีความท้าทายควรได้รับการแก้ไขเพื่ออนุญาตเฉพาะ "ห้องสมุดบุคคลที่สามที่มีอยู่" แทนที่จะเป็น "ห้องสมุดใด ๆ "
jpmc26

คุณกำลังจะติดกับเสียงที่เป็นสีขาวหรือไม่? หากคุณต้องการยืนยันจริง ๆ : autocorrelogram ควรมีจุดที่ชัดเจนรอบศูนย์และแทบไม่มีอะไรล่าช้าเลย ถ้าคุณไม่ได้เป็นคนขี้เหนียวฉันก็บอกว่ามันไม่มีประโยชน์ที่จะระบุว่ามันเป็นเสียงสีขาว เพียงแค่พูดเสียงดัง
Tim Seguine

แล้ว WebAudioAPI ล่ะ ฉันเขียนโปรแกรม js ที่เล่นเสียงสีขาว
ЕвгенийНовиков

คำตอบ:


4

MATLAB, 25

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

เขียนไฟล์ WAV aใหม่ไปยังดิสก์ที่เรียกว่า มีอัตราตัวอย่าง 8 kHz และ 16 บิตต่อตัวอย่างในรูปแบบเลขจำนวนเต็มที่ลงนาม ข้อมูลแหล่งที่มามีการกระจายอย่างสม่ำเสมอในช่วงเวลา[0,1]ซึ่งถูกแมปกับช่วงเวลา[0,32767]หลังจากการแปลงเป็นรูปแบบจำนวนเต็ม

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

ฉันไม่แน่ใจว่า OP หมายถึงอะไรเกี่ยวกับการจัดเก็บการตั้งค่าในตัวแปร แต่ฉันตีความในลักษณะที่เป็นประโยชน์กับกรณีนี้ สมมติว่า:

  • อัตราบิตที่ต้องการ (ในบิต / วินาที) bที่ให้บริการโดยผู้ใช้ในตัวแปร บิตต่อตัวอย่างฮาร์ดโค้ดที่ 16

  • ระยะเวลาที่ต้องการของไฟล์ (ในตัวอย่าง) dจะได้รับในตัวแปร

ผลลัพธ์คือ:

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

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

เพิ่มชั้นของโสมมในการแสวงหาของโบนัสอื่นผมทำให้สมมติฐานอื่น: fฟังก์ชั่นการใช้งานที่ต้องการเพื่อการส่งออกไฟล์ควรจะระบุไว้ในตัวแปร จากนั้นรหัสจะลดความซับซ้อนลงเป็น:

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

ค่าที่อนุญาตสำหรับฟังก์ชันคือ:

f = @wavwrite

หรือ

f = @auwrite

แต่ละฟังก์ชันจะทำให้ข้อมูลโค้ดด้านบนเขียนไฟล์รูปแบบที่เหมาะสม (WAV หรือ.au) ที่อัตราตัวอย่าง 8 kHz ตามระยะเวลาที่กำหนด ผมถอดโบนัสสำหรับสเปคของบิตที่นี่เพราะauwriteเริ่มต้นที่ 8 บิตต่อตัวอย่างแทน 16 เหมือนwavwriteไม่ ฉันไม่เห็นวิธีที่จะทำให้ทั้งสองกลมกลืนกันโดยไม่ต้องใช้อักขระมากขึ้น


10

Bash, 34

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

หากคุณไม่ต้องการ 'สุ่ม' ฮาร์ดไดรฟ์ (ช้ากว่ามาก)

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

สปิน, 28

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

4
อย่างใดฉันไม่คิดว่าส่วนหัวของไฟล์สามารถสุ่มทั้งหมด / เหมือนกับภาคแรกของฮาร์ดดิสก์
John Dvorak

1
Herr Doctor อาจถูกต้องหากชุดทดสอบคือ VLC VLC ค่อนข้างให้อภัย
Jonathan Van Matre

1
คุณสร้างเสียงขึ้นมา แต่มันเป็นเสียงสีขาวหรือไม่
Stephen Melvin

1
/ dev / random มีอยู่ใน Macs ด้วย! น่าเสียดายที่ iTunes ไม่สามารถเล่นไฟล์ wav ที่ได้ ไม่ว่าฉันจะบ่นได้ - ฉันเลือกใช้ VLc เพราะการให้อภัยและตัวแปลงสัญญาณพื้นเมืองมากมาย
Giulio Muscarello

1
/devคุณสามารถบันทึกห้าตัวอักษรโดยการดำเนินการคำสั่งในขณะที่ไดเรกทอรีการทำงานคือ
David Richerby

4

Mathematica 52 - 5 = 47

gส่งออกไฟล์. wav เสียงสีขาวเป็นsวินาทีและ 8000 bps

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

ตัวอย่าง: ไฟล์เสียงสีขาว 6 วินาทีถูกส่งออก

g[6]

p.wav


4

Supercollider, 89 - 10% = 80.1 ไบต์

น่าเศร้าแม้จะถูกสร้างขึ้นมาโดยเจตนาสำหรับการสร้างเสียง / เสียงภาษานี้จะไม่ชนะที่นี่ แต่มันเป็นการปรากฏตัวครั้งแรกของ Supercollider บน Code Golf ดังนั้นมันเจ๋งมาก!

การส่งนี้สูญเสียไปเนื่องจากการตั้งค่าการบันทึกและทำให้เกิดขึ้นเป็นกระบวนการ verbose เนื่องจากการออกแบบไคลเอนต์ / เซิร์ฟเวอร์ของภาษานี้ ถึงกระนั้นมันก็เป็นภาษาที่เท่และมีพลังมากในโค้ดเพียงเล็กน้อยเมื่อคุณขอให้มันทำสิ่งที่ซับซ้อนกว่าเสียงสีขาว

ระยะเวลาไฟล์ถูกตั้งค่าโดยการเปลี่ยนค่า wait () ฉันสามารถใส่มันลงในตัวแปรได้ แต่มันไม่มีประโยชน์อะไรที่ Supercollider ไม่มี stdio ที่จะพูดถึง การโต้ตอบอยู่ในการจัดการรหัสสดขณะที่เซิร์ฟเวอร์ยังคงเล่นอยู่ โดยพื้นฐานแล้ว IDE คือ I / O (เว้นแต่คุณจะสร้าง UI สำหรับการสร้างของคุณ)

นี่คือเวอร์ชั่น golfed:

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

นี่คือเวอร์ชัน golfed พร้อมตัวเลือกในการบันทึกทั้งแบบ aiff หรือ wav และระบุรูปแบบตัวอย่าง (int16, int8 และ float เป็นตัวเลือกทั้งหมด) โชคไม่ดีที่ถึงแม้จะมีโบนัสทั้งหมดแล้วเวอร์ชั่นด้านบนก็ยังดีกว่า นี่จะเป็น 139 - 30% = 97.3 ไบต์

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

และนี่คือเวอร์ชันหลังที่ไม่ได้รับการดัดแปลงดังนั้นคุณจะเห็นได้ว่าเกิดอะไรขึ้น

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

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

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

หนึ่งคะแนนสำหรับการใช้ Supercollider มีปริศนาอื่น ๆ อีกมากมายที่มันยอดเยี่ยมมาก ลองฟังเพลงและเสียง
ไม่ใช่ Charles

4

Bash + ALSA คะแนน: 44 (52 ตัวอักษร - (10% + 5%) โบนัส)

ยาวกว่าbashคำตอบอื่นแต่ยอมรับระยะเวลาและบิตเรต เพิ่มส่วนหัวที่ถูกต้องอย่างสมเหตุสมผลลงในไฟล์ด้วยดังนั้นควรพกพาได้อย่างสมเหตุสมผล:

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

บันทึกเป็นสคริปต์chmod +xมันและเรียกใช้:

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

หมายเหตุเอาต์พุต. wav คือ stdout ดังนั้นจึงต้องถูกเปลี่ยนเส้นทางไปยังไฟล์


คุณสามารถบันทึกได้ประมาณ 1,20 ตัวอักษรโดยการอ่าน / dev / สุ่มแทน / dev / urandom เนื่องจากความเร็วไม่ใช่ข้อกำหนด
Giulio Muscarello

1
เอาต์พุตคือstdin ?
user253751

0

C 127 115 ไบต์

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

รหัสส่วนใหญ่เขียนส่วนหัวสำหรับไฟล์ * .au สิ่งนี้จะพิมพ์ไฟล์เสียง pseudorandom ให้เป็นมาตรฐาน

8000อัตราตัวอย่างที่สามารถปรับเปลี่ยนได้โดยการเปลี่ยน

สามารถปรับระยะเวลาได้โดยกดปุ่มctrl-cเมื่อใดก็ตามที่คุณต้องการหยุด :-)


0

JavaScript, 167 ไบต์

ข้อควรระวัง: ลดระดับเสียงก่อนเรียกใช้ เสียงสีขาวน่ารังเกียจ

อย่าสร้างไฟล์อาจไม่ใช่สิ่งที่คาดหวัง

-4 bytes hack play noise ที่ช่องทางซ้ายเท่านั้น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.