Morse năm mới


33

Đây là Thử thách hàng tuần # 1. Chủ đề: Xử lý âm thanh

Nhiệm vụ của bạn là viết một chương trình, ghi một tệp âm thanh vào đĩa (theo định dạng bạn chọn), chứa mã Morse cho 2015, tức là

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

Bạn có thể tự do chọn bất kỳ loại âm thanh nào cho các phân đoạn, như sóng hình sin tần số đơn, hợp âm, tiếng ồn, một số nhạc cụ (ví dụ: sử dụng tệp MIDI), miễn là có thể nghe được. Tuy nhiên, có một số hạn chế về thời gian:

  • Các đoạn ngắn cần dài ít nhất 0,2 giây.
  • Các phân đoạn dài cần dài ít nhất 3 lần so với các phân đoạn ngắn.
  • Khoảng nghỉ giữa các phân đoạn trong một chữ số phải có cùng độ dài với các phân đoạn ngắn.
  • Khoảng nghỉ giữa các chữ số phải có cùng độ dài với các đoạn dài.
  • Mỗi phân đoạn và ngắt có thể sai lệch tới 10% so với độ dài trung bình của loại phân đoạn / ngắt đó.
  • Toàn bộ tệp âm thanh có thể không dài hơn 30 giây.

Giờ nghỉ không cần phải im lặng hoàn toàn, nhưng các đoạn Morse nên to hơn rõ rệt so với giờ nghỉ.

Lưu ý rằng bạn phải viết một tập tin âm thanh. Bạn không thể chỉ phát âm thanh, ví dụ như sử dụng tiếng bíp hệ thống. Bạn được phép sử dụng bất kỳ loại thư viện nào để xử lý định dạng tệp và tạo âm thanh, nhưng bạn không được sử dụng các tính năng tích hợp để mã hóa Morse.

Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Vui lòng xem xét liên kết đến tải lên tệp âm thanh kết quả (trên SoundCloud hoặc tương tự), để mọi người có thể kiểm tra kết quả mà không phải chạy mã của bạn. Nếu bạn tải lên SoundCloud, vui lòng đảm bảo bật các tải xuống trong tab Quyền của bản nhạc.

Nếu đầu ra của bạn sử dụng định dạng tệp khá phổ biến, vui lòng thêm một số thông tin về cách phát lại và / hoặc chuyển đổi nó sang định dạng phổ biến hơn và tải lên.

Ví dụ theo dõi

Đây là một bản nhạc ví dụ được tạo thủ công phù hợp với thông số kỹ thuật và sử dụng tiếng ồn cho các phân đoạn Morse (chính xác là tiếng ồn nền của micrô). Đây là liên kết đến SoundCloud nếu trình phát được nhúng không hoạt động cho bạn.

Chi tiết tiền thưởng

Tôi sẽ trao phần thưởng cho bài nộp ngắn nhất bằng ngôn ngữ lập trình âm thanh , tức là một ngôn ngữ được thiết kế để tổng hợp âm thanh. Danh sách đó chưa đầy đủ, vì vậy hãy sử dụng ngôn ngữ lập trình âm thanh khác, nếu bạn biết. Nếu bạn không chắc chắn liệu một số ngôn ngữ bạn muốn sử dụng phân loại là ngôn ngữ lập trình âm thanh, vui lòng cho tôi biết trong các nhận xét hoặc trong trò chuyện và chúng tôi có thể thảo luận về điều đó.

Lưu ý rằng việc gửi của bạn vẫn phải tuân thủ tất cả các quy tắc - đặc biệt, nó phải viết một tệp, điều này có thể không thực hiện được trong tất cả các ngôn ngữ lập trình âm thanh. Ví dụ, theo như tôi có thể nói, gibber chỉ có thể phát âm thanh và không lưu nó vào một tập tin.


1
Thử thách bổ sung: Làm cho âm thanh thực sự tốt đẹp.
Kaz Wolfe

6
@Mew Làm thế nào tốt Morse có thể âm thanh?
Martin Ender

1
Làm điều này trong Brainf ** k sẽ làm cho điều này tuyệt vời trên nhiều mức thưởng.
Cột

@Mast Có lẽ, nhưng thật không may, BF không thể ghi vào một tệp. ;) (Tôi sẽ đảm bảo sẽ khoan dung hơn với lần tới.)
Martin Ender

Các định dạng ký hiệu âm nhạc, chỉ chứa điểm số và không có âm thanh (.mid, .abc nhìn thấy bên dưới) có được coi là "tệp âm thanh" không? Còn các định dạng "theo dõi", có chứa cả mẫu và điểm, nhưng không có bản âm thanh được kết xuất (.mod, .xm) thì sao?
Tobia

Câu trả lời:


4

BASH AWK : 66 86 67 74 byte

Theo yêu cầu của Martin Büttner, tôi đã thêm một nhịp độ kể từ sau khi kiểm tra tiêu chuẩn Ký hiệu ABC , có vẻ như không có giá trị mặc định được xác định cho điều này (cảm ơn nutki vì đã chỉ ra điều này).
Tôi cũng viết vào một tệp đĩa (a) thay vì STDOUT vì câu hỏi muốn rõ ràng là "một tệp trên đĩa".

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

Tôi đặt nhịp độ 99 khiến tệp âm thanh kéo dài 22 giây; Nó chậm hơn phiên bản trước của tôi, nhưng ít nhất bây giờ nó được cho là có cùng độ dài trên mỗi người chơi ABC và nó phù hợp dưới 30 giây.

Nó trông ... rất giống với phiên bản trước như bạn có thể thấy: Phiên bản cuối cùng (tôi hy vọng: o)) của điểm số 2015

Đây là tập tin midi mới .

Phiên bản BASH đầu tiên (thiếu nhịp độ)

Tại sao tôi không nghĩ đến điều này trước tiên ...: o)

Đó là 22 byte ít hơn so với AWK, cho cùng một kết quả

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

Giống như phiên bản trước trong AWK, nó viết trên stdout một tệp ký hiệu "ABC" hợp lệ (cảm ơn Tobia vì đã phát hiện ra rằng câu lệnh "L" là tùy chọn)

Nó trông như thế này: phiên bản cuối cùng của phân vùng "2015"

Và nó có vẻ chính xác như phiên bản trước .

Phiên bản trước trong AWK (86 Byte)

Đây là một phiên bản mới; lâu hơn một chút, nhưng với thời gian chính xác hơn. Tôi để phiên bản đầu tiên dưới đây để so sánh / tham khảo:

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";}

Đây vẫn là một tệp "abc" hợp lệ, trông như thế này: điểm số 2015

Đây là tập tin midi mới (Tôi đã tăng tốc độ để ở dưới giới hạn 30 giây).

Phiên bản đầu tiên trong AWK (66 byte):

Điều này ít thú vị hơn câu trả lời trước của tôi , nhưng nó ngắn hơn rất nhiều, vì vậy:

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

Điều này xuất ra một tệp "abc" hợp lệ, có thể được đọc vào (trong số những người khác) EasyABC. Nó sẽ trông giống thế này: Điểm của "2015" trong morse

và nó sẽ nghe như thế này (tập tin midi) . +


Bạn nên đăng nó dưới dạng ABC mà không cần gói AWK và nhận tiền thưởng!
Tobia

Tobia, ABC là một định dạng tệp, không phải là ngôn ngữ lập trình. Và cho đến nay với 86 byte thì đây là câu trả lời ngắn nhất ... Câu hỏi đặt ra bây giờ là "âm thanh kết quả có đủ gần với yêu cầu để câu trả lời có hợp lệ không?"
LeFauve

Tôi cũng sẽ gọi nó là định dạng tệp, nhưng trang wiki được OP liên kết liệt kê nó là ngôn ngữ lập trình Âm thanh. Tôi đã xem xét tập tin ABC của riêng mình như một mục, cùng với chương trình Csound thích hợp hơn. Hãy xem họ nghĩ gì về nó.
Tobia

Đó là vấn đề với wiki ... đôi khi mọi người chỉnh sửa chúng mắc lỗi: o). Rất nhiều thứ khác nhau có thể được gọi là "ngôn ngữ lập trình" nhưng tôi nghĩ ABC không phải là một trong số chúng. Dù sao, cảm ơn vì đã tìm ra "L" là tùy chọn. Nó đã tiết kiệm cho tôi một vài byte; o)
LeFauve

"Các phân đoạn dài cần dài ít nhất 3 lần so với các phân đoạn ngắn." Dòng nhạc cuối cùng được hiển thị không đáp ứng yêu cầu.
mbomb007

13

mã máy x86 (tệp .COM): 121 120 113 109 byte

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

Có thể dễ dàng chạy dưới DosBox; đầu ra là một tệp .SND có tên SND. Đây là phiên bản FLAC của đầu ra của nó (và ở đây là tệp .COM).

Nhận xét lắp ráp:

    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:

Các data.datbao gồm trên là một đại diện dễ sử dụng của chuỗi morse (bit thấp: âm thanh on / âm thanh tắt, trên 7 bit: chiều dài âm thanh trong các mẫu >> 4) được tạo ra bởi một kịch bản 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))

Bạn không nhất thiết cần một phần mở rộng tập tin, nếu điều đó có thể giúp bạn tiết kiệm bốn byte.
Martin Ender

4
@ MartinBüttner: thực sự, nó cho phép tôi lưu 3 byte. Các asố a.sndđược đặt ngay trước tiêu đề SND, bắt đầu với .sndtheo sau là một byte zero, vì vậy tôi có được .sndmột phần miễn phí và tôi tái chế zero-terminator của nó. Ngoài ra, thực tế là tiêu đề bắt đầu một byte sau tên tệp cho phép tôi sử dụng a inc dxđể di chuyển đến tiêu đề (1 byte) thay vì mov dx, header(3 byte). OTOH, nếu tôi được phép gọi nó .sndmột mình tôi có thể tiết kiệm hai byte, nhưng tôi không chắc rằng DOS thực sự sẽ cho phép điều đó (việc xử lý phần mở rộng trong DOS khá đặc biệt).
Matteo Italia

Tôi đã thực hiện một số thử nghiệm với việc gọi tệp .SND: Tôi đã nhận được .SNDtrên DosBox, SND~1trên FreeDOS và tôi mong đợi một cái gì đó khác trên DOS "thực"; do đó, đây chắc chắn là khu vực "hành vi không xác định". Cuối cùng, tôi đã giải quyết bằng cách gọi tệp SND(ít hơn 1 byte do bị loại bỏ a, giữ nguyên chi phí của inc dx- sẽ trở thành dec dx).
Matteo Italia

8

Toán học - 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
   ]
]

Chơi trực tuyến


Oh bạn cũng có thể sử dụng ký hiệu infix cho Export, thích "m.mid"~Export~Sound@....
Martin Ender

(b=None~s~#&)@.6nên (b=None~s~#&)@.4 Ngoài ra, bạn có thể tiết kiệm 3 ký tự sử dụngr = 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

Martin, nhưng đã có một .2 trong mỗi giờ nghỉ. .4 + .2
DavidC

@DavidCarraher Ah, bạn nói đúng.
Martin Ender

7

Perl 5: 94 122 140

Các tệp SND có các tiêu đề đơn giản hơn, không cần in nhị phân. Phiên bản này tạo ra tệp SND 8khz mono có tên 'a':

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

Các tập tin kết quả .

Giải pháp cũ. Tạo tệp WAV đơn âm 8 bit 1khz có tên '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

Các tập tin kết quả .

Để có được 122 ký tự, tôi phải dán tiêu đề ở dạng nhị phân thay vì đóng gói khiến mã khó sao chép ở đây. Phiên bản thoát là:

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

Mã hóa Base64 của giải pháp 122 byte thực tế:

b3BlbgpBLCc+YSc7cHJpbnQKQSJSSUZGkEIAAFdBVkVmbXQgEAAAAAEAAQDoAwAA6AMAAAEACABk
YXRhbEIAACIscGFjayJzKiIsbWFweygkXyl4KDg5NDI2MTA3Mj4+JHYrKyYxPzQwMDoxMDApfSgy
NTUsMCl4MjA=

Bạn có thể sử dụng .auphần mở rộng, có thể. Làm tốt!
F. Hauri

7

AWK: 172 170 byte

... và không sử dụng bất kỳ thư viện sóng! (*)

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}

Điều này xuất ra tệp âm thanh Sun au trên thiết bị xuất chuẩn có thể được phát bởi vlc (trong số những người khác). Mặc dù định dạng tệp au không có bất kỳ giới hạn tốc độ mẫu nào, VLC từ chối phát bất kỳ tệp nào có tốc độ lấy mẫu thấp hơn 4096 Hz, vì vậy tôi đã sử dụng tần số này

EDIT: Liên kết đến tệp âm thanh kết quả trên DropBox


(*) Không nên có phần thưởng cho việc này? ; o)


Bạn không cần không gian trong d=d "\177... ghép. Điều đó tiết kiệm một byte. Nhưng khi tôi phát tệp âm thanh kết quả, có vẻ như nó thiếu dit cuối cùng của 5.
Mark Reed

Cảm ơn. Tôi đã lưu một byte thứ hai với một phép nối khác bằng cách sử dụng cùng một thủ thuật. Tôi vừa kiểm tra tệp âm thanh với vlc 2.1.1 và nó có vẻ hoàn chỉnh. Bạn đã sử dụng cầu thủ nào?
LeFauve

Tôi đã sử dụng QuickTime Player trên OS X. Tôi đã mở nó trong VLC và nghe có vẻ ổn, vì vậy đừng bận tâm. Lỗi của Apple, không phải của bạn.
Mark Reed

7

Con trăn, 155

Sử dụng mô-đun sóng tích hợp python.

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

Viết vào một tập tin gọi là n.

Cảm ơn Sp3000 đã gợi ý về việc sử dụng tính năng hiểu danh sách cho vòng lặp (điều này đã giúp loại bỏ một chút thụt lề).

Nghe nó:

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

Đây là liên kết đến SoundCloud nếu trình phát được nhúng không hoạt động cho bạn.

Mã nhận xét:

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

wlà hiệu ứng phụ nên tôi nghĩ bạn có thể liệt kê comp để lưu hai byte: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 ... không nghĩ về điều đó = D. cám ơn!
Vectorized

Đây có thể là một câu hỏi ngu ngốc, nhưng nếu h được chia cho 4 lần lặp, thì vòng lặp while dừng lại như thế nào?
Derek 朕 會

@Derek 會 Đối với python, khi h trở thành 0, nó ước lượng thành Sai, chấm dứt vòng lặp. Vòng lặp while là một mẹo chơi gôn để trích xuất các giá trị theo trình tự "11333033333013333011111" từng cái một.
Vectorized

@bitpwner Tôi hiểu rằng 0 đánh giá là sai, nhưng không phải vì tất cả các số dương, nếu bạn chia nó cho một số dương khác, không có cách nào bạn có thể lấy 0 trong số đó?
Derek 朕 會

6

C #, 556 552 536 535 516 506 503 491 483 byte

Sử dụng thư viện 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();}}}

Đầu ra cho một tập tin có tên a.

Kết quả được lưu trữ trên Dropbox

Mã bị đánh cắp:

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

Con trăn 3 2, 191 188 174 171 (không có thư viện)

Các tập tin Wav rất đơn giản. Muốn thử mà không có thư viện. Vì một số lý do, các tệp của tôi dường như bị sập Windows Media Player. Thời gian nhanh chóngcông trinhlỗi ra nửa chừng vào tập tin. Chuyển đổi sang tỷ lệ mẫu lớn hơn bằng Audition sẽ khắc phục điều này.

Cập nhật : Đã thực hiện một số tối ưu hóa từ câu trả lời Perl. Bây giờ đầu ra chỉ với tên nvà trong mẫu 1000Hz. Chỉnh sửa thông tin trên cho phù hợp.

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)

Phiên bản cũ

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 byte

Sử dụng thư viện 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();}}}

đây là đầu ra.

Phiên bản dễ đọc,

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

Bạn có thể lưu một số byte bằng cách gói lớp của bạn bên trong không gian tên System.Collections.Generic (thực sự hoạt động). Ngoài ra còn có một số khoảng trắng không cần thiết bạn có thể loại bỏ.
Chương trìnhFOX

4

C # 382 333byte

Không sử dụng bất kỳ thư viện không chuẩn nào, hãy viết ra một wav 44100samples-per-sample 8 bit, với điều tôi hy vọng là một tiêu đề hợp lệ (dường như phát / tải hạnh phúc trong WMP / .NET / Audacity).

Tiêu đề được mã hóa base64 và morse được mã hóa dưới dạng bật / tắt tín hiệu được lưu trữ trong một khoảng dài (64 bit) vì 5 bit cuối cùng giống như đầu tiên.

Kết quả có thể được tìm thấy ở đây

Mã đánh gôn:

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

Với nhận xét:

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

Thử thách không yêu cầu tên tệp kết thúc .wav, vì vậy bạn có thể lưu 4 byte ở đó.
Chương trìnhFOX

Cách tốt để gắn mã PWM 69 bit vào hằng số 64 bit. Tôi đã thử một cái gì đó như thế nhưng có lẽ tôi không thể rút ngắn mã của mình bằng phương pháp của bạn.
nutki

2

SuperCollider , 625 605 byte

Trình ngôn ngữ lập trình âm thanh!

Đầu ra được ghi vào một tệp bở định dạng AIFF. Windows Media Player không mở được, nhưng nó hoạt động tốt trong trình phát phương tiện VLC. Tệp được tạo atệp 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;

Tôi đã tạo một vài chức năng SuperCollider: ftạo ra một tiếng bíp gngắn, nghỉ ngắn, htiếng bíp dài và inghỉ dài. SuperCollider cần các vị trí bắt đầu cho mỗi sóng hình sin chứ không phải độ dài, vì vậy tôi phải tạo các hàm tạo sóng với vị trí bắt đầu chính xác và tôi phải gọi các hàm mỗi khi tôi cần sóng hình sin. (Tôi không thể lưu trữ một sóng có độ dài cụ thể trong một biến để sử dụng lại). Các\w định nghĩa được tạo ra ở phần cuối của khối mã.

Trên máy tính Windows của tôi, nó không lưu tệp âm thanh trong cùng thư mục với mã của tôi, nhưng trong thư mục này:

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

Kết quả được lưu trữ trên Dropbox

Mã có thụt lề:

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 là một ngôn ngữ lập trình âm thanh. bitpwner đã giúp tôi giảm mức này từ 201 byte xuống còn 147 byte.

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;}

Đây là một liên kết trực tiếp đến SoundCloud nếu trình phát được nhúng không hoạt động cho bạn.


1
Quản lý để cắt nó xuống còn 164 với một mẹo tương tự được sử dụng trong câu trả lời của tôi: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 Bạn đang sử dụng jđể tránh mảng?
KSFT

Số ma thuật 1016835trong nhị phân là 11111000010000000011. jlà có để đơn giản để theo dõi tạm dừng giữa mỗi chữ số của 2015(mỗi chữ số có 5 âm thanh).
Vectorized

@bitpwner Ah, tôi thậm chí không nhận ra điều đó. Đó là một ý tưởng tuyệt vời!
KSFT

Bạn có thể chỉnh sửa nó thành câu trả lời của bạn để có cơ hội tiền thưởng cao hơn. imo, sự cải thiện không phải là nhiều để biện minh cho một câu trả lời mới mà bạn đã thực hiện phần lớn công việc tìm ra Chuck;)
Vectorized

2

Csound, 140 + 40 = 180

Ngôn ngữ lập trình âm thanh.

Đây là tập tin dàn nhạc:

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

và đây là tệp Điểm:

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

Các kích thước được tính toán giả sử không có khoảng trắng thừa, đầu cuối dòng đơn (UNIX) và không có đầu cuối sau dòng cuối cùng.

Bạn gọi chúng bằng lệnh csound:

csound morse.org morse.sco

sẽ tạo ra một tệp đầu ra trong thư mục hiện tại, theo mặc định có tên là "test.aif"

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

Tôi có thể đã cạo hai hoặc ba byte bằng cách chọn một dạng sóng xấu hơn, nhưng tôi thích âm thanh của sóng hình sin Morse truyền thống.

Tái bút: Tôi là một người mới hoàn toàn tại Csound, mọi mẹo chơi gôn đều được đánh giá cao, đặc biệt là liên quan đến tệp điểm!


Ah, tôi đã mong chờ CSound. Nếu không có ai đăng câu trả lời trong đó, có lẽ tôi đã cố gắng tự viết một câu. :)
Martin Ender

1

Brainfuck , 649 byte

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

Điều này tạo ra một chuỗi gồm 8 mẫu không dấu có thể được phát ở mức 8000 mẫu mỗi giây bằng một công cụ như aplaytrên Linux. Tín dụng vào bảng của hằng số BF .

Hãy thử trực tuyến!

Hơi ít chơi gôn

DIT DIT DAH DAH DAH
++[>
 -[+>++[++<]>]>[>..........-..........+<-]
 -[+>++[++<]>]>[....................-]
<<<<<-]
+++[>
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
 -[+>++[++<]>]>[....................-]
<<<-]
-[+>++[++<]>]>[....................-]
DAH DAH DAH DAH DAH
+++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
+++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DAH DAH DAH DAH
-[+>++[++<]>]>[>..........-..........+<-]
++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DIT DIT DIT DIT
+++++[>
 -[+>++[++<]>]>[....................-]
 -[+>++[++<]>]>[>..........-..........+<-]
<<<<<-]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.