새해 모스


33

입니다 주간 도전 # 1. 주제 : 오디오 프로세싱

당신의 작업은 포함 (선택의 형식으로) 디스크에 오디오 파일을 기록하는 프로그램을 작성하는 것입니다 모스 부호를 위한 2015, 즉

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

들을 수있는 한, 단일 주파수 사인파, 코드, 노이즈, 일부 악기 (예 : MIDI 파일 사용)와 같은 세그먼트에 대한 모든 종류의 사운드를 자유롭게 선택할 수 있습니다. 그러나 타이밍에는 몇 가지 제약이 있습니다.

  • 짧은 세그먼트의 길이는 0.2 초 이상이어야합니다.
  • 긴 세그먼트는 짧은 세그먼트보다 3 배 이상 길어야합니다.
  • 숫자 내 세그먼트 사이의 나누기는 짧은 세그먼트와 길이가 같아야합니다.
  • 숫자 사이의 나누기는 긴 세그먼트와 길이가 같아야합니다.
  • 각 세그먼트 및 나누기는 해당 유형의 세그먼트 / 브레이크의 평균 길이에서 최대 10 %까지 벗어날 수 있습니다.
  • 전체 오디오 파일은 30 초를 초과 할 수 없습니다.

브레이크는 완전히 침묵 할 필요는 없지만 모스 세그먼트는 브레이크보다 소리가 더 커야합니다.

당신이주의 해야 오디오 파일을 작성 할 수 있습니다. 시스템 비프 음과 같은 소리 만 재생할 수는 없습니다. 파일 형식 및 오디오 생성을 처리하기 위해 모든 종류의 라이브러리를 사용할 수 있지만 Morse 인코딩에는 내장 기능을 사용해서는 안됩니다.

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.

사람들이 코드를 실행하지 않고도 결과를 확인할 수 있도록 결과 오디오 파일 (SoundCloud 또는 이와 유사한)의 업로드 링크를 고려하십시오. SoundCloud에 업로드하는 경우 트랙의 권한 탭에서 다운로드를 활성화하십시오.

출력에서 다소 일반적인 파일 형식을 사용하는 경우 재생 및 / 또는보다 일반적인 형식으로 변환하고 업로드하는 방법에 대한 정보를 추가하십시오.

트랙 예

이 스펙은 스펙을 준수하고 Morse 세그먼트에 대한 노이즈 (마이크로폰 배경 노이즈)를 사용하는 수동으로 생성 된 예제 트랙입니다. 내장 플레이어가 작동하지 않는 경우 SoundCloud에 대한 링크 입니다.

바운티 정보

오디오 프로그래밍 언어 , 즉 사운드를 합성하도록 설계된 언어 로 가장 짧은 제출물에 현상금을 수여합니다 . 이 목록은 완전하지 않으므로 다른 오디오 프로그래밍 언어를 알고 있다면 자유롭게 사용하십시오. 사용하려는 언어가 오디오 프로그래밍 언어로 분류되는지 확실하지 않은 경우 의견이나 채팅으로 알려주십시오 . 이에 대해 논의 할 수 있습니다.

제출 한 내용은 여전히 ​​모든 규칙을 준수해야합니다. 특히 모든 오디오 프로그래밍 언어에서는 가능하지 않은 파일을 작성해야합니다. 예를 들어, 내가 알 수있는 한 gibber 는 사운드 만 재생할 수 있으며 파일에 저장할 수는 없습니다.


1
추가 과제 : 정말 좋은 소리를냅니다.
— Kaz Wolfe

6
@Morse는 얼마나 좋은 소리를 낼 수 있습니까?
— 마틴 엔더

1
Brainf ** k에서이 작업을 수행하면 많은 보너스 레벨에서이 기능을 사용할 수 있습니다.
— Mast

@Mast 아마도 안타깝게도 BF는 파일에 쓸 수 없습니다. ;) (다음에 더 관 대해 지도록하겠습니다.)
— Martin Ender

악보 만 포함하고 오디오 (.mid, .abc가 아님)가없는 음악 표기법 형식이 "오디오 파일"로 허용됩니까? 샘플과 악보를 모두 포함하지만 렌더링 된 오디오 트랙 (.mod, .xm)이없는 "트래커"형식은 어떻습니까?
— Tobia

답변:


4

AWK BASH : 66 86 67 74 바이트

Martin Büttner의 요청에 따라 ABC Notation 표준 을 확인한 후 템포를 추가했는데 기본값이 정의되어 있지 않은 것 같습니다 (이 점을 지적 해 주셔서 감사합니다).
또한 질문은 명시 적으로 "디스크상의 파일"을 원했기 때문에 STDOUT 대신 디스크 파일 (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

템포를 99로 설정하면 오디오 파일이 22 초 동안 지속됩니다. 이전 버전보다 느리지 만 적어도 지금은 모든 ABC 플레이어에서 길이가 동일해야하며 30 초 미만입니다.

보시다시피 이전 버전과 매우 비슷합니다. 2015 년 점수의 마지막 (나는 희망한다 : o)

여기 에 새로운 미디 파일이 있습니다.

첫 BASH 버전 (템포가 없음)

왜 내가 이것을 먼저 생각하지 않았습니까 ... : o)

같은 결과를 위해 AWK보다 22 바이트가 적습니다.

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

AWK의 이전 버전과 마찬가지로 stdout에 유효한 "ABC"표기법 파일을 씁니다 ( "L"문이 선택적이라는 것을 알게 된 Tobia에게 감사합니다)

다음과 같이 보입니다 : "2015"파티션의 마지막 버전

그리고 이전 버전과 똑같이 들립니다 .

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"파일이며 다음과 같습니다. 2015 년 점수

다음은 새로운 미디 파일입니다 (30 초 한도 미만으로 유지되도록 템포를 가속했습니다).

AWK의 첫 번째 버전 (66 바이트) :

이것은 이전 답변 보다 훨씬 덜 흥미 롭지 만 훨씬 짧습니다.

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

그러면 유효한 "abc"파일이 출력되고 EasyABC로 읽을 수 있습니다. 다음과 같이 보일 것입니다 : 모스에서 "2015"의 점수

그리고 이것처럼 들릴 것입니다 (midi 파일) . +


AWK 포장없이 ABC로 게시하고 현상금을 청구해야합니다!
— Tobia

Tobia, ABC는 프로그래밍 언어가 아닌 파일 형식입니다. 그리고 지금까지 86 바이트로 이것이 가장 짧은 답입니다 ... 이제 질문은 "답변이 유효하기 위해 요구되는 사운드와 충분히 비슷합니까?"
— LeFauve

나는 그것을 파일 형식이라고 불렀지 만 OP 링크 된 위키 페이지는 그것을 사운드 프로그래밍 언어로 나열합니다. 더 적절한 Csound 프로그램과 함께 내 ABC 파일을 항목으로 정리했습니다. 그들이 어떻게 생각하는지 봅시다.
— Tobia

그것은 위키의 문제입니다 ... 언제든지 편집하는 사람들은 실수를합니다 : o). 많은 다른 것들을 "프로그래밍 언어"라고 할 수 있지만 ABC는 그중 하나가 아니라고 생각합니다. 어쨌든 "L"을 찾아 주셔서 감사합니다. 그것은 나에게 몇 바이트를 절약했다; o)
— LeFauve

"긴 세그먼트는 짧은 세그먼트보다 3 배 이상 길어야합니다." 표시된 마지막 음악 라인이 요구 사항을 충족하지 않습니다.
— mbomb007

13

x86 머신 코드 (.COM 파일) : 121 120 113 109 바이트

16 진 덤프 :

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위 의 포함은 Python 스크립트에 의해 생성 된 모스 문자열 (하위 비트 : 사운드 온 / 사운드 꺼짐, 상위 7 비트 : 사운드 길이 >> 4)을 사용하기 쉬운 표현입니다.

#!/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))

4 바이트를 절약 할 수 있다면 반드시 파일 확장자가 필요하지는 않습니다.
— Martin Ender

4
@ MartinBüttner : 실제로 3 바이트를 절약 할 수 있습니다. a의 a.snd단지로 시작하는 SND 헤더, 전에 넣어 .snd0 바이트 다음에, 나는 얻을 수 있도록 .snd무료로 부분을 내가 그 제로 터미네이터를 재활용합니다. 또한 파일 이름 다음에 헤더가 1 바이트 시작한다는 사실 때문에 a inc dx를 사용 하여 mov dx, header(3 바이트) 대신 헤더 (1 바이트)로 이동할 수 있습니다. OTOH, .snd혼자서 호출 할 수 있다면 2 바이트를 절약 할 수는 있지만 실제 DOS에서 허용할지는 확실하지 않습니다 (DOS에서 확장 프로그램을 처리하는 것이 매우 독특했습니다).
— Matteo Italia

나는 파일을 호출하는 몇 가지 테스트를 한 .SND: 내가 가진 .SND, 도스 박스에 SND~1FreeDOS에에, 나는 "진짜"DOS에 다른 뭔가를 기대; 따라서 그것은 분명히 "정의되지 않은 행동"영역입니다. 결국, 나는 파일을 호출하는 SND것으로 결정했다 (삭제로 인해 1 바이트가 적어 a지고 비용은 inc dx-가 됨 dec dx).
— Matteo Italia

8

매스 매 티카-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 2016 년

(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

마틴, 그러나 각 휴식에는 이미 0.2가있었습니다. .4 + .2
— DavidC

@DavidCarraher 아, 맞아.
— Martin Ender

7

펄 5 : 94 122 140

SND 파일은 헤더가 더 단순하므로 이진으로 인쇄 할 필요가 없습니다. 이 버전은 'a'라는 8khz 모노 SND 파일을 생성합니다.

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

결과 파일 .

오래된 해결책. 'a'라는 1khz 8 비트 모노 WAV 파일을 생성합니다.

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

실제 122 바이트 솔루션의 Base64 인코딩 :

b3BlbgpBLCc+YSc7cHJpbnQKQSJSSUZGkEIAAFdBVkVmbXQgEAAAAAEAAQDoAwAA6AMAAAEACABk
YXRhbEIAACIscGFjayJzKiIsbWFweygkXyl4KDg5NDI2MTA3Mj4+JHYrKyYxPzQwMDoxMDApfSgy
NTUsMCl4MjA=

U는 .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}

이것은 stdout에서 Sun au 오디오 파일을 출력하며 vlc가 재생할 수 있습니다. au 파일 형식에는 샘플링 속도 제한이 없지만 VLC는 4096Hz보다 낮은 샘플링 속도의 파일 재생을 거부 하므로이 주파수를 사용했습니다.

편집 : DropBox의 결과 오디오 파일 에 연결


(*) 이것에 대한 보너스가 없어야합니까? ;영형)


당신은 d=d "\177... 연결에 공간이 필요하지 않습니다 . 바이트가 절약됩니다. 그러나 결과 오디오 파일을 재생할 때 5의 마지막 부분이 빠진 것 같습니다.
— Mark Reed

감사. 동일한 트릭을 사용하여 다른 연결로 두 번째 바이트를 저장했습니다. 방금 vlc 2.1.1로 오디오 파일을 확인했는데 소리가 완료되었습니다. 어떤 선수를 사용 했습니까?
— LeFauve

OS X에서 QuickTime Player를 사용하고있었습니다. VLC에서 열었고 괜찮은 것처럼 들리므로 걱정하지 마십시오. 애플의 잘못이 아닌 당신의 잘못.
— Mark Reed

7

파이썬, 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 에게 감사드립니다 (이는 약간의 들여 쓰기를 제거하는 데 도움이 됨).

들어 봐:

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부작용 이므로 2 바이트를 절약하기 위해 comp를 나열 할 수 있다고 생각합니다.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를 생각하지 못했습니다. 고마워!
— 벡터화

이것은 어리석은 질문 일 수 있지만 각 반복마다 h를 4로 나눈 경우 while 루프는 어떻게 중지됩니까?
— Derek 朕 會 功夫

@Derek 朕 會 功夫 파이썬의 경우 h가 0이되면 False로 평가되어 루프를 종료합니다. while 루프는 시퀀스 "11333033333013333011111"의 값을 하나씩 추출하는 골퍼입니다.
— 벡터화

@ 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에서 호스팅 된 결과

Ungolfed 코드 :

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

파이썬 삼 2, 191 188 174 171 (라이브러리 없음)

Wav 파일은 매우 간단합니다. 도서관없이 시도하고 싶었습니다. 어떤 이유로 내 파일이 Windows Media Player와 충돌하는 것 같습니다. 퀵타임공장파일의 반쯤 버그입니다. 오디션을 사용하여 더 큰 샘플 속도로 변환하면이 문제가 해결됩니다.

업데이트 : 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 바이트

비표준 라이브러리를 사용하지 않고 유효한 헤더 (WMP / .NET / Audacity에서 행복하게 재생 /로드하는 것으로 간주 됨)로 샘플 당 8 비트 4444 샘플 / 초 wav를 작성합니다.

헤더는 base64로 인코딩되며 모스는 마지막 5 비트가 첫 번째와 동일하기 때문에 단일 long (64 비트)에 저장된 신호 켜기 ​​/ 끄기로 인코딩됩니다.

결과는 여기 에서 찾을 수 있습니다

골프 코드 :

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 바이트

오디오 프로그래밍 언어 제출!

출력은 bAIFF 형식으로 파일 에 기록 됩니다. Windows Media Player가 열리지 않지만 VLC 미디어 플레이어에서 제대로 작동합니다. 생성 된 파일 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

척 - 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이진수 의 마법 번호 는 11111000010000000011입니다. j의 각 자리 사이의 일시 중지를 추적하기 위해 단순히 2015각 자리에 5 개의 소리가납니다.
— 벡터화

@ bitpwner 아, 나는 그것을 알아 차리지 못했습니다. 정말 멋진 아이디어입니다!
— KSFT

현상금 발생 가능성이 더 높은 답변으로 편집 할 수 있습니다. imo, 개선은 이미 당신이 척을 알아내는 작업의 대부분을 한 새로운 답변 sinc를 정당화하기 위해 많은 것이 아닙니다.)
— Vectorized

2

소리, 140 + 40 = 180

오디오 프로그래밍 언어.

이것은 오케스트라 파일입니다.

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

못생긴 파형을 선택하여 2 바이트 또는 3 바이트를 면도 할 수 있었지만 전통적인 모스 사인파의 사운드가 마음에 듭니다.

PS : 저는 Csound의 초보자입니다. 특히 스코어 파일에 관한 골프 팁에 감사드립니다!


아, 나는 CSound를 고대하고 있었다. 아무도 답을 게시하지 않았다면 아마 직접 글을 쓰려고했을 것입니다. :)
— Martin Ender

1

brainfuck , 649 바이트

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

이는 aplayLinux 와 같은 도구를 사용하여 초당 8000 개의 샘플에서 재생할 수있는 8 비트 부호없는 샘플 시퀀스를 생성합니다 . 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.