มอร์สปีใหม่


33

นี่คือการท้าทายประจำสัปดาห์ # 1 ธีม: การประมวลผลเสียง

งานของคุณคือการเขียนโปรแกรมซึ่งเขียนไฟล์เสียงลงดิสก์ (ในรูปแบบที่คุณเลือก) ซึ่งมีรหัสมอร์สสำหรับ2015เช่น

..--- ----- .---- .....

คุณมีอิสระในการเลือกเสียงทุกประเภทสำหรับเซ็กเมนต์เช่นคลื่นซายน์ความถี่เดียวคอร์ดเสียงเครื่องดนตรีบางอย่าง (เช่นการใช้ไฟล์ MIDI) ตราบใดที่มีเสียง อย่างไรก็ตามมีข้อ จำกัด บางประการเกี่ยวกับเวลา:

  • เซ็กเมนต์สั้นต้องมีความยาวอย่างน้อย 0.2 วินาที
  • เซ็กเมนต์แบบยาวต้องมีอย่างน้อย 3 เท่าของเซ็กเมนต์แบบสั้น
  • ตัวแบ่งระหว่างเซกเมนต์ภายในตัวเลขควรมีความยาวเท่ากับเซกเมนต์แบบสั้น
  • ตัวแบ่งระหว่างตัวเลขควรมีความยาวเท่ากับเซกเมนต์ที่ยาว
  • แต่ละเซกเมนต์และตัวแบ่งอาจเบี่ยงเบนสูงถึง 10% จากความยาวเฉลี่ยของเซกเมนต์ / ตัวแบ่งนั้น
  • ไฟล์เสียงทั้งหมดอาจต้องไม่เกิน 30 วินาที

การแบ่งไม่จำเป็นต้องเงียบอย่างสมบูรณ์ แต่กลุ่มมอร์สควรได้ยินเสียงดังกว่าการหยุดพัก

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

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

โปรดพิจารณาการเชื่อมโยงไปยังการอัปโหลดไฟล์เสียงที่ได้ (บน SoundCloud หรือที่คล้ายกัน) เพื่อให้ผู้คนสามารถตรวจสอบผลลัพธ์โดยไม่ต้องเรียกใช้รหัสของคุณ หากคุณอัปโหลดไปยัง SoundCloud โปรดเปิดใช้งานการดาวน์โหลดในแท็บการอนุญาตของแทร็ก

หากผลลัพธ์ของคุณใช้รูปแบบไฟล์ที่ค่อนข้างแปลกโปรดเพิ่มข้อมูลบางอย่างเกี่ยวกับวิธีการเล่นและ / หรือแปลงเป็นรูปแบบทั่วไปและอัปโหลด

ตัวอย่างแทร็ก

นี่เป็นแทร็กตัวอย่างที่สร้างขึ้นด้วยตนเองซึ่งสอดคล้องกับข้อมูลจำเพาะและใช้เสียงรบกวนสำหรับกลุ่มมอร์ส (เสียงพื้นหลังไมโครโฟนเพื่อความแม่นยำ) นี่คือลิงค์ไปยัง SoundCloudหากโปรแกรมเล่นแบบฝังไม่ทำงานสำหรับคุณ

รายละเอียดรางวัล

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

โปรดทราบว่าการส่งของคุณยังต้องปฏิบัติตามกฎทั้งหมด - โดยเฉพาะอย่างยิ่งจะต้องเขียนไฟล์ซึ่งอาจไม่สามารถทำได้ในทุกภาษาโปรแกรมเสียง เช่นเท่าที่ฉันสามารถบอกได้gibberสามารถเล่นได้เฉพาะเสียงและไม่บันทึกลงในไฟล์


1
ความท้าทายเพิ่มเติม: ทำให้เสียงดีจริงๆ
Kaz Wolfe

6
@Morse มอร์สอาจจะฟังดูดีแค่ไหน?
Martin Ender

1
การทำสิ่งนี้ใน Brainf ** k จะทำให้สิ่งนี้ยอดเยี่ยมในระดับโบนัสมากมาย
เสา

@Mast อาจเป็นไปได้ แต่น่าเสียดายที่ BF ไม่สามารถเขียนไฟล์ได้ ;) (ฉันจะทำให้แน่ใจว่าจะผ่อนปรนมากขึ้นในครั้งต่อไป.)
Martin Ender

รูปแบบสัญกรณ์ดนตรีที่มีเฉพาะคะแนนและไม่มีเสียง (.mid, .abc ด้านล่าง) ถือว่ายอมรับได้ว่าเป็น "ไฟล์เสียง" หรือไม่ รูปแบบ "ตัวติดตาม" ที่มีทั้งตัวอย่างและคะแนน แต่ไม่มีแทร็กเสียงที่แสดงผล (.mod, .xm)
Tobia

คำตอบ:


4

AWK BASH: 66 86 67 74 ไบต์

ตามที่ร้องขอโดย Martin Büttnerฉันเพิ่มจังหวะตั้งแต่หลังจากตรวจสอบมาตรฐาน ABC Notationดูเหมือนว่าไม่มีค่าเริ่มต้นที่กำหนดไว้สำหรับสิ่งนี้ (ขอบคุณ nutki สำหรับการชี้สิ่งนี้)
ฉันยังเขียนลงในไฟล์ดิสก์ (a) แทน STDOUT เนื่องจากคำถามต้องการ "ไฟล์บนดิสก์" อย่างชัดเจน

a=C3z;echo "X:1
K:A
Q:99
CzCz$a$a$a3$a$a$a$a${a}3Cz$a$a$a${a}3CzCzCzCzC">a

ฉันใส่ความเร็ว 99 ซึ่งทำให้ไฟล์เสียงเป็น 22 วินาทีสุดท้าย; มันช้ากว่าเวอร์ชั่นก่อนหน้าของฉัน แต่อย่างน้อยตอนนี้มันควรจะมีความยาวเท่ากันกับเครื่องเล่น ABC ทุกตัวและมันพอดีน้อยกว่า 30 วินาที

ดูเหมือน ... จะเหมือนกับเวอร์ชั่นก่อนหน้าอย่างที่คุณเห็น: Last (I hope :o) ) version of 2015's score

นี่คือไฟล์ midi ใหม่

เวอร์ชัน BASH แรก (จังหวะหายไป)

ทำไมฉันไม่คิดอย่างนี้ก่อน ... : o)

นั่นคือน้อยกว่า 22 ไบต์กับ AWK สำหรับผลลัพธ์เดียวกัน

a=C3z;echo "X:1
K:A
CzCz$a$a$a3$a$a$a$a${a}3Cz$a$a$a${a}3CzCzCzCzC"

เช่นเดียวกับรุ่นก่อนหน้าใน AWK มันเขียนไฟล์สัญลักษณ์ "ABC" ที่ถูกต้อง (ขอบคุณโทเบียสำหรับการค้นหาว่าคำสั่ง "L" เป็นทางเลือก)

ดูเหมือนว่านี้: last version of "2015" partition

และมันฟังเหมือนรุ่นก่อนหน้านี้

รุ่นก่อนหน้าใน AWK (86 ไบต์)

นี่คือเวอร์ชั่นใหม่ อีกต่อไปเล็กน้อย แต่ด้วยเวลาที่แม่นยำยิ่งขึ้น ฉันปล่อยรุ่นแรกร้องสำหรับการเปรียบเทียบ / การอ้างอิง:

BEGIN{a="C3z";print"X:1\nK:A\nL:1/8\nCzCz"a a a"3"a a a a a"3Cz"a a a a"3CzCzCzCzCz";}

นี่เป็นไฟล์ "abc" ที่ถูกต้องซึ่งมีลักษณะดังนี้: score of 2015

นี่คือไฟล์ midi ใหม่ (ฉันเร่งความเร็วให้อยู่ภายใต้ขีด จำกัด 30 วินาที)

รุ่นแรกใน AWK (66 ไบต์):

นี่เป็นสิ่งที่น่าสนใจน้อยกว่าคำตอบก่อนหน้าของฉันแต่สั้นกว่ามากดังนั้น:

BEGIN{print"X:1\nK:A\nL:1/4\nCCC2C2C2zC2C2C2C2C2zCC2C2C2C2zCCCCC"}

เอาต์พุตนี้เป็นไฟล์ "abc" ที่ถูกต้องซึ่งสามารถอ่านได้ (ในกลุ่มอื่น ๆ ) EasyABC มันจะมีลักษณะเช่นนี้: Score of "2015" in morse

และมันจะเสียงเช่นนี้ (ไฟล์ midi) +


คุณควรโพสต์เป็น ABC โดยไม่ต้องห่อ AWK และรับรางวัล!
Tobia

Tobia, ABC เป็นรูปแบบไฟล์ไม่ใช่ภาษาโปรแกรม และจนถึงตอนนี้ด้วย 86 ไบต์นี่เป็นคำตอบที่สั้นที่สุด ... ตอนนี้คำถามคือ "เสียงที่ออกมานั้นใกล้พอจากข้อกำหนดสำหรับคำตอบที่ถูกต้องหรือไม่"
LeFauve

ฉันจะเรียกมันว่าเป็นรูปแบบไฟล์ด้วยเช่นกัน แต่หน้า wiki ที่ OP เชื่อมโยงนั้นแสดงว่าเป็นภาษาโปรแกรมเสียง ฉันพบไฟล์ ABC ของฉันเป็นรายการพร้อมกับโปรแกรม Csound ที่เหมาะสมกว่า เรามาดูกันว่าพวกเขาคิดอย่างไร
เบีย

นั่นเป็นปัญหาของ wikis ... บางครั้งผู้คนแก้ไขพวกเขาก็ทำผิดพลาด: o) สิ่งต่าง ๆ มากมายสามารถเรียกได้ว่า "ภาษาโปรแกรม" แต่ฉันคิดว่า ABC ไม่ใช่หนึ่งในนั้น อย่างไรก็ตามขอขอบคุณที่ทราบว่า "L" เป็นตัวเลือก มันช่วยฉันสักสองสามไบต์; o)
LeFauve

"เซ็กเมนต์แบบยาวต้องมีอย่างน้อย 3 เท่าของเซ็กเมนต์สั้น" บรรทัดเพลงสุดท้ายที่แสดงไม่เป็นไปตามข้อกำหนด
mbomb007

13

รหัสเครื่อง x86 (ไฟล์. COM): 121 120 113 109 ไบต์

hexdump:

00000000  b4 3e bb 01 00 cd 21 b4  3c 31 c9 ba 3e 01 cd 21  |.>....!.<1..>..!|
00000010  4a b4 09 cd 21 be 56 01  8a 0c 46 e8 0c 00 b1 32  |J...!.V...F....2|
00000020  e8 07 00 81 fe 6d 01 75  ef c3 88 cb c0 e3 07 c1  |.....m.u........|
00000030  e1 04 30 d2 b4 02 00 da  cd 21 e2 fa c3 2e 73 6e  |..0......!....sn|
00000040  64 00 00 00 18 ff ff ff  ff 00 00 00 02 00 00 10  |d...............|
00000050  00 00 00 00 01 24 33 33  99 99 99 66 99 99 99 99  |.....$33...f....|
00000060  99 66 33 99 99 99 99 66  33 33 33 33 33           |.f3....f33333|
0000006d

สามารถทำงานภายใต้ DosBox ได้อย่างง่ายดาย เอาต์พุตเป็นไฟล์SND . SNDชื่อ นี่คือเอาต์พุตFLAC เวอร์ชัน (และนี่คือไฟล์. COM)

ประกอบความเห็น:

    org 100h

start:
    ; close stdout
    mov ah,3eh
    mov bx,1
    int 21h
    ; open snd
    mov ah,3ch
    xor cx,cx
    mov dx,filename
    int 21h
    ; write the header
    ; we used the `snd` part of the header as file name, back off one byte
    dec dx
    mov ah,9h
    int 21h
    mov si,data
.l:
    ; data read cycle
    ; read the current byte in cl (zero-extending to 16-bit)
    ; notice that ch is already zero (at the first iteration it's 0 from the
    ; int 21h/3ch, then we are coming from gen, which leaves cx to zero)
    mov cl,[si]
    ; move to next byte
    inc si
    ; generate the tone
    call gen
    ; generate the pause
    mov cl,50
    call gen
    ; repeat until we reach the end of data
    cmp si,eof
    jne .l
    ; quit
    ret

gen:
    ; generate a sawtooth wave at sampling frequency/2 Hz
    ; receives length (in samples>>4) in cx, with lowest bit indicating if
    ; it has to write a wave or a pause
    mov bl,cl
    ; shift the rightmost bit all the way to the left; this kills the
    ; unrelated data and puts a 128 in bl (if cx & 1 != 0)
    shl bl,7
    ; rescale the samples number
    shl cx,4
    ; zero the starting signal
    xor dl,dl
    ; prepare the stuff for int 21h
    mov ah,2h
.l:
    ; increment the signal
    add dl,bl
    ; write it
    int 21h
    ; decrement iteration count and loop
    loop .l
    ret

    ; .SND file header (4096 samples, mono, PCM)
header:
    db "."
    ; we also use "snd" as the file name
filename:
    db "snd",0,0,0,24,0xff,0xff,0xff,0xff,0,0,0,2,0,0,0x10,0,0,0,0,1
    ; terminator for int 21h/ah=9h
    db '$'
data:
    ; generated by gendata.py
    incbin "data.dat"
eof:

ที่data.datรวมไว้ข้างต้นเป็นตัวแทนที่ง่ายต่อการใช้งานของสตริงมอร์ส (บิตที่ต่ำกว่า: เสียงเปิด / ปิดเสียงบน 7 บิต: ความยาวเสียงในตัวอย่าง >> 4) สร้างโดยสคริปต์ Python:

#!/usr/bin/env python2
import sys

# source string
s = "..--- ----- .---- ....."
# samples
sr = 4096
conv =  {
            '.': 1 | (((sr/5) >> 4) & ~1),    # dot:   1/5 second, dI/dt=1
            '-': 1 | (((sr/5*3) >> 4) & ~1),  # line:  3/5 second, dI/dt=1
            ' ':     ((sr/5*2) >> 4) & ~1     # space: 2/5 second (+1/5 from the always-present pause), dI/dt=0 (silent)
        }
sys.stdout.write(''.join(chr(conv[a]) for a in s))

คุณไม่จำเป็นต้องมีนามสกุลไฟล์ถ้าสามารถประหยัดได้ถึงสี่ไบต์
Martin Ender

4
@ MartinBüttner: จริง ๆ แล้วมันช่วยให้ฉันประหยัดได้ 3 ไบต์ aของa.sndใส่ก่อนส่วนหัว SND ซึ่งเริ่มต้นด้วย.sndตามด้วยไบต์ศูนย์ดังนั้นฉันจะได้รับ.sndส่วนหนึ่งได้ฟรีและฉันรีไซเคิลศูนย์ Terminator ของมัน นอกจากนี้ความจริงที่ว่าส่วนหัวเริ่มหนึ่งไบต์หลังจากชื่อไฟล์ช่วยให้ฉันใช้inc dxเพื่อย้ายไปยังส่วนหัว (1 ไบต์) แทนmov dx, header(3 ไบต์) OTOH ถ้าฉันได้รับอนุญาตให้เรียกมันเพียง.sndอย่างเดียวฉันสามารถบันทึกสองไบต์ แต่ฉันไม่แน่ใจว่า DOS จริงจะอนุญาตให้ทำได้ (การรักษาส่วนขยายภายใต้ DOS ค่อนข้างแปลก)
Matteo Italia

ฉันทำการทดสอบด้วยการเรียกไฟล์.SND: ฉันได้รับ.SNDบน DosBox SND~1บน FreeDOS และฉันคาดหวังว่าจะมีอย่างอื่นที่ "จริง" DOS; ดังนั้นจึงเป็นพื้นที่ "พฤติกรรมที่ไม่ได้กำหนด" อย่างแน่นอน ในท้ายที่สุดฉันตัดสินด้วยการเรียกไฟล์SND(น้อยกว่า 1 ไบต์เนื่องจากลบออกaทำให้ค่าใช้จ่ายของinc dx- ซึ่งกลายเป็นdec dx)
Matteo Italia

8

Mathematica - 130

r = Riffle;
s = SoundNote;
Export["m.mid", 
 Sound@
   r[Flatten@
     r[
       s[0,.4(Boole@#+.5)]&/@Array[#>4&,5,5-#]&/@{2,0,1,5},
       (b=None~s~#&)@.6
     ],b@.2
   ]
]

เล่นออนไลน์


โอ้คุณยังสามารถใช้สัญกรณ์มัดสำหรับเช่นExport "m.mid"~Export~Sound@...
Martin Ender

(b=None~s~#&)@.6ควรเป็น(b=None~s~#&)@.4 คุณสามารถบันทึก 3 ตัวอักษรโดยใช้r = Riffle; s = SoundNote; Export["m.mid", Sound@r[r[Table[s[0, If[{1, 2, 11}~MemberQ~k || k > 15, .2, .6]], {k, 20}], None~s~.2], None~s~.4, 11]]
DavidC

มาร์ติน แต่มี .2 อยู่ในแต่ละครั้งแล้ว .4 + .2
DavidC

@DavidCarraher อาคุณพูดถูก
Martin Ender

7

Perl 5: 94 122 140

ไฟล์ SND มีส่วนหัวที่ง่ายขึ้นไม่จำเป็นต้องพิมพ์ในรูปแบบไบนารี รุ่นนี้ผลิตไฟล์ SND โมโนขนาด 8khz ชื่อ 'a':

open A,'>a';print
A".snd",pack"N*",24,-1,2,8e3,1,map{(--$|x3)x(894261072>>$_&1?1600:400)}0..39

ผลไฟล์

วิธีการแก้ปัญหาเก่า สร้างไฟล์ WAV แบบโมโนขนาด 1khz 8 บิตชื่อ 'a':

open
A,'>a';print
A pack"A4lA8lssllssA4ls*",RIFF,17040,WAVEfmt,16,1,1,(1e3)x2,1,8,data,17004,map{($_)x(894261072>>$v++&1?400:100)}(255,0)x20

ผลไฟล์

เพื่อให้ได้ถึง 122 ตัวอักษรฉันต้องวางส่วนหัวในไบนารีแทนการบรรจุซึ่งทำให้รหัสยากที่จะคัดลอกที่นี่ เวอร์ชันที่หลีกเลี่ยงคือ:

open
A,'>a';print
A"RIFF\x90B\0\0WAVEfmt \0\0\0\0\0\xe8\0\0\xe8\0\0\0\0datalB\0\0",pack"s*",map{($_)x(894261072>>$v++&1?400:100)}(255,0)x20

การเข้ารหัส Base64 ของโซลูชัน 122 ไบต์จริง:

b3BlbgpBLCc+YSc7cHJpbnQKQSJSSUZGkEIAAFdBVkVmbXQgEAAAAAEAAQDoAwAA6AMAAAEACABk
YXRhbEIAACIscGFjayJzKiIsbWFweygkXyl4KDg5NDI2MTA3Mj4+JHYrKyYxPzQwMDoxMDApfSgy
NTUsMCl4MjA=

คุณสามารถใช้.auส่วนขยายได้หรืออาจ ทำได้ดี!
F. Hauri

7

AWK: 172 170 ไบต์

... และไม่ต้องใช้ห้องสมุดคลื่นใด ๆ ! (*)

BEGIN{for(;++i<204;){d=d"\177\177\n";D=D"\n\n"}t=d d d D;d=d D;T=D D D;u=t t t;print".snd\0\0\0\30\0\0\221\306\0\0\0\2\0\0\20\0\0\0\0\1"d d u T u t t T d u t T d d d d d}

เอาต์พุตนี้เป็นไฟล์เสียง Sun au บน stdout ซึ่งสามารถเล่นได้โดย vlc (กลุ่มอื่น ๆ ) ในขณะที่รูปแบบไฟล์ au ไม่มีข้อ จำกัด อัตราตัวอย่างใด ๆ VLC ปฏิเสธที่จะเล่นไฟล์ใด ๆ ที่มีอัตราการสุ่มต่ำกว่า 4096 Hz ดังนั้นฉันจึงใช้ความถี่นี้

แก้ไข: ลิงก์ไปยัง ไฟล์เสียงที่ได้จาก DropBox


(*) ไม่ควรมีโบนัสสำหรับสิ่งนี้หรือ ; o)


คุณไม่ต้องการพื้นที่ในการd=d "\177ต่อ ... ที่ช่วยประหยัดไบต์ แต่เมื่อฉันเล่นไฟล์เสียงที่ได้มาดูเหมือนว่ามันจะไม่มีดิตสุดท้ายของ 5
Mark Reed

ขอบคุณ ฉันบันทึกไบต์ที่สองด้วยการต่อข้อมูลอีกครั้งโดยใช้กลอุบายเดียวกัน ฉันเพิ่งตรวจสอบไฟล์เสียงด้วย vlc 2.1.1 และฟังดูสมบูรณ์ คุณใช้เครื่องเล่นอะไร
LeFauve

ฉันใช้ QuickTime Player บน OS X ฉันเปิดมันใน VLC และฟังดูดีไม่เป็นไร ความผิดของ Apple ไม่ใช่ของคุณ
Mark Reed

7

Python, 155

ใช้โมดูลคลื่นในตัวของหลาม

import wave
n=wave.open(*"nw")
k=17837
n.setparams((2,2,k,0,"NONE",0))
h=k*1314709609
while h:[n.writeframes(`i%9`)for i in[0]*(2-h%2)*k+range(h%4*k)];h/=4

เขียนลงไฟล์ที่เรียกว่า nเขียนไปยังไฟล์ที่เรียกว่า

ขอบคุณSp3000สำหรับคำแนะนำในการใช้ list comprehension for loop (ซึ่งช่วยกำจัดการเยื้องเล็กน้อย)

ฟังมัน:

https://soundcloud.com/bitpwner/morse-the-new-year-2015

นี่คือลิงค์ไปยัง SoundCloudหากโปรแกรมเล่นแบบฝังไม่ทำงานสำหรับคุณ

รหัสความคิดเห็น:

import wave
n=wave.open("n.wav","w")         # Open a wav file for writing
k=44100                            
n.setparams((2,2,k,0,"NONE","")) # Sets the minimal params for the wav file
w=n.writeframes
h=23450475295733                 # Contains base-4 morse: '.'=1, '-'=3, ' '=0
while h:
    for i in range(h%2*k):w(h%4*chr(i%99)) # Writes saw-tooth signal using i%99
    w((2-h%2)*k*" ")                       # Writes the pauses
    h/=4

เนื่องจากwเป็นผลข้างเคียงฉันคิดว่าคุณสามารถแสดงรายการคอมพ์เพื่อประหยัดสองไบต์:while h:[w(h%4*chr(i%99))for i in range(h%2*k)];w((2-h%2)*k*" ");h/=4
Sp3000

@ Sp3000 oo ... ไม่คิดอย่างนั้น = D ขอบคุณ!
Vectorized

นี่อาจเป็นคำถามที่โง่ แต่ถ้า h ถูกหารด้วย 4 สำหรับการวนซ้ำแต่ละรอบวงในขณะที่จะหยุดอย่างไร
Derek 朕會功夫

@Derek 朕會功夫สำหรับ python เมื่อ h กลายเป็น 0 มันจะประเมินเป็น False โดยยกเลิกการวนซ้ำ ขณะที่ลูปเป็นเคล็ดลับการตีกอล์ฟเพื่อแยกค่าในลำดับ "11333033333013333011111" ทีละรายการ
Vectorized

@ bitpwner ฉันได้มันมาว่า 0 หาค่าเป็นเท็จ แต่ไม่ใช่สำหรับตัวเลขบวกทั้งหมด, ถ้าคุณหารมันด้วยจำนวนบวกอื่น, มันไม่มีทางที่คุณจะได้ 0 ออกมา?
Derek 朕會功夫

6

C #, 556 552 536 535 516 506 503 491 483 ไบต์

ใช้ห้องสมุดWav.Net

using System;using System.Linq;namespace WavDotNet.Core{using S=Samples<float>;class P{static void Main(){var w=new WavFileWrite<float>("a",9999);var b=new Tools.Generators.Sawtooth(9999);Func<long,float,S>g=(t,a)=>b.Generate32Bit(new TimeSpan(t),99,a);var l=2500000;S x=g(l,1),y=g(l*3,1),z=g(l*3,0),_=g(l,0),v=new S(new[]{x,_,x,_,y,_,y,_,y,z,y,_,y,_,y,_,y,_,y,z,x,_,y,_,y,_,y,_,y,z,x,_,x,_,x,_,x,_,x}.SelectMany(c=>c).ToList());w.AudioData.Add(new Channel<float>(v,0));w.Flush();}}}

aขาออกไปยังไฟล์ที่ชื่อว่า

ผลลัพธ์โฮสต์บน Dropbox

รหัสไม่ได้รับการตอบกลับ:

using System;
using System.Linq;
namespace WavDotNet.Core
{
    using FloatSamples = Samples<float>;
    class P
    {
        static void Main()
        {
            var file = new WavFileWrite<float>("output.wav", 9999);
            var sawtoothGen = new Tools.Generators.Sawtooth(9999);
            Func<long, float, FloatSamples> generate = (t, amplitude) => sawtoothGen.Generate32Bit(new TimeSpan(t), 99, amplitude);
            var length = 2500000;
            FloatSamples shortBeep = generate(length, 1),
            longBeep = generate(length * 3, 1),
            shortPause = generate(length * 3, 0),
            longPause = generate(length, 0),
            allSamples = new FloatSamples(new[] { shortBeep, longPause, shortBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, shortPause,
                longBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, shortPause, 
                shortBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, longPause, longBeep, shortPause, 
                shortBeep, longPause, shortBeep, longPause, shortBeep, longPause, shortBeep, longPause, shortBeep }
                .SelectMany(c => c).ToList());
            file.AudioData.Add(new Channel<float>(allSamples, 0)); // 0 == ChannelPositions.Mono
            file.Flush();
        }
    }
}

5

หลาม 3 2 191 188 174 171 (ไม่มีห้องสมุด)

ไฟล์ Wav นั้นง่ายอย่างไม่น่าเชื่อ อยากลองโดยไม่ต้องใช้ห้องสมุด ด้วยเหตุผลบางอย่างที่ไฟล์ของฉันดูเหมือนจะพัง Windows Media Player Quicktimeโรงงานข้อบกพร่องออกครึ่งหนึ่งลงในไฟล์ การแปลงเป็นอัตราตัวอย่างขนาดใหญ่โดยใช้ Audition แก้ไขสิ่งนี้

ปรับปรุง : ใช้การเพิ่มประสิทธิภาพบางอย่างจากคำตอบ Perl ตอนนี้แสดงผลด้วยชื่อnและการสุ่มตัวอย่าง 1000Hz เท่านั้น แก้ไขข้อมูลข้างต้นแล้ว

w,s=200*" ",50*"~~  "
a,b,c=s+w,3*s+w,2*w
open(*"nw").write("RIFF\xD46\0\0WAVEfmt \20\0\0\0\1\0\1\0\xE8\3\0\0\xE8\3\0\0\1\0\10\0data\xB06\0\0"+a*2+b*3+c+b*5+c+a+b*4+c+a*5)

เวอร์ชั่นเก่า

w,s=1600*" ",200*"~~~~    "
a,b,c=s+w,3*s+w,2*w
open("n.wav","wb").write("RIFF\244\265\1\0WAVEfmt \20\0\0\0\1\0\1\0@\x1f\0\0@\x1f\0\0\1\0\10\0data\200\265\1\0"+a*2+b*3+c+b*5+c+a+b*4+c+a*5)

4

C # ~ 485 ไบต์

การใช้ไลบรารีWav.Net

using WavDotNet.Core;namespace System.Collections.Generic{using f=Single;class T{static void Main(){var i=new WavFileWrite<f>("x",8000);Func<long,Samples<f>>g=d=>new WavDotNet.Tools.Generators.Sawtooth(8000).Generate32Bit(new TimeSpan(d),600,1);var s=new List<f>();var k="..--- ----- .---- .....";foreach(var c in k){s.AddRange(c=='.'?g(2000000):g(6000000));s.AddRange(new f[1600]);if(c==' '){s.AddRange(new f[3200]);}}i.AudioData.Add(new Channel<f>(new Samples<f>(s),0));i.Flush();}}}

และนี่คือผลลัพธ์

รุ่นที่อ่านได้

using WavDotNet.Core;

namespace System.Collections.Generic
{
    using f = Single;

    class T
    {
        static void Main()
        {
            var i = new WavFileWrite<f>("x", 8000);
            Func<long, Samples<f>> g = d => new WavDotNet.Tools.Generators.Sawtooth(8000).Generate32Bit(new TimeSpan(d), 600, 1);
            var s = new List<f>();
            var k = "..--- ----- .---- .....";

            foreach (var c in k)
            {
                s.AddRange(c == '.' ? g(2000000) : g(6000000));
                s.AddRange(new f[1600]);

                if (c == ' ')
                {
                    s.AddRange(new f[3200]);
                }
            }

            i.AudioData.Add(new Channel<f>(new Samples<f>(s), 0));
            i.Flush();
        }
    }
}

คุณสามารถบันทึกบางไบต์ได้โดยการหุ้มคลาสของคุณไว้ในเนมสเปซ System.Collections.Generic (ที่ใช้งานได้จริง) นอกจากนี้ยังมีช่องว่างที่ไม่จำเป็นที่คุณสามารถลบได้
ProgramFOX

4

C # 382 333 ไบต์

ไม่ใช้ไลบรารีที่ไม่ได้มาตรฐานเขียน 8bits ต่อตัวอย่าง 44100 ตัวอย่างต่อวินาที wav ด้วยสิ่งที่ฉันหวังว่าเป็นส่วนหัวที่ถูกต้อง (ดูเหมือนว่าจะเล่น / โหลดอย่างมีความสุขใน WMP / .NET / Audacity)

ส่วนหัวคือการเข้ารหัส base64 และมอร์สถูกเข้ารหัสเป็นสัญญาณเปิด / ปิดซึ่งถูกเก็บไว้ในความยาวเดียว (64 บิต) เพราะ 5 บิตสุดท้ายจะเหมือนกันเป็นครั้งแรก

ผลลัพธ์สามารถพบได้ที่นี่

รหัส Golfed:

using System.IO;class P{static void Main(){using(var w=new FileStream("w.wav",FileMode.Create)){int i=0,d=9980;w.Write(System.Convert.FromBase64String("UklGRhCCCgBXQVZFZm10IBAAAAABAAEARKwAAESsAAABAAgAZGF0YeyBCgA="),0,44);for(var k=5899114207271221109L;i++<d*69;w.WriteByte((byte)(System.Math.Sin((k>>(i/d)%64&1)*i*0.1)*127+127)));}}}

ด้วยความคิดเห็น:

using System.IO;

class P
{
    static void Main()
    {
        using(var w=new FileStream("w.wav",FileMode.Create))
        {
            int i=0,d=9980; // d is samples per tone

            // write wav header
            w.Write(System.Convert.FromBase64String("UklGRhCCCgBXQVZFZm10IBAAAAABAAEARKwAAESsAAABAAgAZGF0YeyBCgA="),0,44);

            for(var k=5899114207271221109L; // 0101000111011101110111010001110111011101110111000111011101110101 as long
                i++<d*69; // 69 is number of bits
                w.WriteByte((byte)(
                    System.Math.Sin(
                        (k>>(i/d)%64&1) // read bit (0 or 1)
                        *i*0.1) // mul by ticker (sin(0) = 0)
                    *127+127)) // make sensible
            );
        }
    }
}

ความท้าทายไม่จำเป็นต้องใช้ชื่อไฟล์เพื่อจบด้วย.wavดังนั้นคุณสามารถบันทึกได้ 4 ไบต์
ProgramFOX

วิธีที่ดีในการปรับรหัส 69 บิตของ PWM ให้เป็นค่าคงที่ 64 บิต ฉันพยายามอะไรแบบนั้น แต่อาจจะไม่ย่อรหัสของฉันด้วยวิธีการของคุณ
nutki

2

SuperColliderขนาด625 605 ไบต์

การส่งภาษาโปรแกรมเสียง!

เอาต์พุตถูกเขียนไปยังไฟล์bในรูปแบบ AIFF Windows Media Player ไม่สามารถเปิดได้ แต่ใช้งานได้ดีใน VLC media player ไฟล์ที่สร้างขึ้นaเป็นไฟล์ OSCไฟล์

c=0;d=0;f={c=c+d;d=0.2;[c,[\s_new,\w,1001,0,0,\freq,800]]};g={c=c+d;d=0.2;[c,[\n_free,1001]]};h={c=c+d;d=0.6;[c,[\s_new,\w,1001,0,0,\freq,800]]};i={c=c+d;d=0.6;[c,[\n_free,1001]]};x=[f.value,g.value,f.value,g.value,h.value,g.value,h.value,g.value,h.value,i.value,h.value,g.value,h.value,g.value,h.value,g.value,h.value,g.value,h.value,i.value,f.value,g.value,h.value,g.value,h.value,g.value,h.value,g.value,h.value,i.value,f.value,g.value,f.value,g.value,f.value,g.value,f.value,g.value,f.value,i.value];Score.recordNRT(x,"morse.osc","Morse2015.aiff");SynthDef("w",{arg freq=440;Out.ar(0,SinOsc.ar(freq,0,0.2))}).writeDefFile;

ฉันสร้างฟังก์ชั่น SuperCollider สองสามตัว: fสร้างเสียงบี๊ปgสั้น ๆ , พักสั้น, hบี๊ปยาวและiพักยาว SuperCollider ต้องการตำแหน่งเริ่มต้นสำหรับแต่ละคลื่นไซน์และไม่ยาวดังนั้นฉันจึงต้องสร้างฟังก์ชั่นที่สร้างคลื่นที่มีตำแหน่งเริ่มต้นที่ถูกต้องและฉันต้องเรียกใช้ฟังก์ชั่นทุกครั้งที่ต้องการคลื่นไซน์ (ฉันไม่สามารถเก็บคลื่นที่มีความยาวเฉพาะในตัวแปรเพื่อนำมาใช้ซ้ำได้) \wความหมายที่ถูกสร้างขึ้นในตอนท้ายของการป้องกันรหัสที่

บนคอมพิวเตอร์ Windows ของฉันมันไม่ได้บันทึกไฟล์เสียงในไดเรกทอรีเดียวกับรหัสของฉัน แต่ในไดเรกทอรีนี้:

C:\Users\MyName\AppData\Local\VirtualStore\Program Files (x86)\SuperCollider-3.6.6

ผลลัพธ์โฮสต์บน Dropbox

รหัสด้วยการเยื้อง:

c = 0;
d = 0;
f = { c=c+d;d=0.2;[ c, [ \s_new, \w, 1001, 0, 0,  \freq, 800 ] ] };
g = { c=c+d;d=0.2; [ c, [\n_free, 1001]] };
h = { c=c+d;d=0.6; [ c, [ \s_new, \w, 1001, 0, 0, \freq, 800]]};
i = { c=c+d;d=0.6;[ c, [\n_free, 1001]] };

x = [ f.value, g.value, f.value, g.value, h.value, g.value, h.value, g.value, h.value, i.value,
      h.value, g.value, h.value, g.value, h.value, g.value, h.value, g.value, h.value, i.value,
      f.value, g.value, h.value, g.value, h.value, g.value, h.value, g.value, h.value, i.value,
    f.value, g.value, f.value, g.value, f.value, g.value, f.value, g.value, f.value, i.value
];

Score.recordNRT(x, "morse.osc", "Morse2015.aiff");

SynthDef("w",{ arg freq = 440;
    Out.ar(0,
         SinOsc.ar(freq, 0, 0.2)
    )
}).writeDefFile;

2

ChucK - 1195 217 201 147 145 144

ChucK เป็นภาษาโปรแกรมเสียง bitpwner ช่วยฉันลดขนาดลงจาก 201 ไบต์เป็น 147 ไบต์

SinOsc s;WvOut w=>blackhole;"y"=>w.wavFilename;int j;for(1016835=>int i;i>0;2/=>i){s=>w;j++;(i%2?200:600)::ms=>now;s=<w;(j%5?200:600)::ms=>now;}

นี่คือลิงก์โดยตรงไปยัง SoundCloudหากโปรแกรมเล่นแบบฝังไม่ทำงานสำหรับคุณ


1
จัดการเพื่อลดลงถึง 164 กับเคล็ดลับที่คล้ายกันที่ใช้ในคำตอบของฉัน:WvOut w=>blackhole;"x"=>w.wavFilename;SinOsc s=>w;0=>int j;for(1016835=>int i;i>0;2/=>i){j++;300=>s.freq;(600-i%2*400)::ms=>now;s=<w;(j%5>0?200:600)::ms=>now;s=>w;}
Vectorized

@bitpwner คุณใช้jเพื่อหลีกเลี่ยงอาร์เรย์?
KSFT

จำนวนมายากลในไบนารี1016835 มีเพียงเพื่อติดตามการหยุดชั่วคราวระหว่างแต่ละหลักของ(แต่ละหลักมี 5 เสียง) 11111000010000000011j2015
Vectorized

@bitpwner อ่าฉันไม่ได้สังเกตเลย นั่นเป็นความคิดที่ยอดเยี่ยมจริงๆ!
KSFT

คุณสามารถแก้ไขมันเป็นคำตอบเพื่อให้มีโอกาสได้รับรางวัลที่สูงขึ้น imo, การปรับปรุงไม่มากพอที่จะพิสูจน์คำตอบใหม่ sinc ที่คุณได้ทำส่วนใหญ่ในการหาคำตอบ Chuck;)
Vectorized

2

Csound, 140 + 40 = 180

ภาษาโปรแกรมเสียง

นี่คือไฟล์ Orchestra:

instr 1
a1 oscil 2^15,990,1
out a1
endin

และนี่คือไฟล์คะแนน:

f1 0 512 10 1
t0 300
i1 0 1
i1 2
i1 40
i1 60
i1 62
i1 64
i1 66
i1 68
i1 4 3
i1 8
i1 12
i1 18
i1 22
i1 26
i1 30
i1 34
i1 42
i1 46
i1 50
i1 54

ขนาดจะถูกคำนวณโดยไม่มีช่องว่างพิเศษตัวยุติบรรทัดเดียว (UNIX) และไม่มีตัวสิ้นสุดหลังจากบรรทัดสุดท้าย

คุณเรียกใช้โดยใช้คำสั่ง csound:

csound morse.org morse.sco

ซึ่งจะสร้างไฟล์เอาต์พุตในไดเรกทอรีปัจจุบันโดยค่าเริ่มต้นชื่อ "test.aif"

https://soundcloud.com/whatfireflies/morse-code-golf-in-csound/s-qzsaq

ฉันสามารถโกนสองหรือสามไบต์ด้วยการเลือกรูปคลื่นที่น่าเกลียด แต่ฉันชอบเสียงของคลื่นไซน์มอร์สแบบดั้งเดิม

PS: ฉันเป็นมือใหม่ทั้งหมดที่ Csound เคล็ดลับการเล่นกอล์ฟที่ได้รับการชื่นชมโดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับไฟล์คะแนน!


อาฉันรอคอย CSound อยู่ หากไม่มีใครโพสต์คำตอบในนั้นฉันอาจจะลองเขียนเอง :)
Martin Ender

1

brainfuck , 649 ไบต์

++[>-[+>++[++<]>]>[>..........-..........+<-]-[+>++[++<]>]>[....................-]<<<<<-]+++[>+++[>-[+>++[++<]>]>[>..........-..........+<-]<<<-]-[+>++[++<]>]>[....................-]<<<-]-[+>++[++<]>]>[....................-]+++++[>-[+>++[++<]>]>[....................-]+++[>-[+>++[++<]>]>[>..........-..........+<-]<<<-]<<<-]+++[>-[+>++[++<]>]>[....................-]<<<-]-[+>++[++<]>]>[>..........-..........+<-]++++[>-[+>++[++<]>]>[....................-]+++[>-[+>++[++<]>]>[>..........-..........+<-]<<<-]<<<-]++[>-[+>++[++<]>]>[....................-]<<<-]+++++[>-[+>++[++<]>]>[....................-]-[+>++[++<]>]>[>..........-..........+<-]<<<<<-]

สิ่งนี้สร้างลำดับของตัวอย่างที่ไม่ได้ลงชื่อ 8 บิตซึ่งอาจเล่นได้ที่ 8000 ตัวอย่างต่อวินาทีด้วยเครื่องมือเช่นaplayบน Linux เครดิตให้กับตารางของค่าคง BF

ลองออนไลน์!

ค่อนข้างตีกอล์ฟน้อย

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