새해 모스


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 바이트를 절약 할 수 있습니다. aa.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 미디어 플레이어에서 제대로 작동합니다. 생성 된 파일 aOSC 파일 입니다.

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.