Morse Tahun Baru


33

Ini Tantangan Mingguan # 1. Tema: Pemrosesan Audio

Tugas Anda adalah menulis sebuah program, yang menulis file audio ke disk (dalam format pilihan Anda), yang berisi kode Morse untuk 2015, yaitu

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

Anda bebas memilih jenis suara apa pun untuk segmen, seperti gelombang sinus frekuensi tunggal, chord, noise, beberapa instrumen (misalnya menggunakan file MIDI), selama itu terdengar. Namun, ada beberapa kendala pada waktu:

  • Segmen pendek harus berdurasi minimal 0,2 detik.
  • Segmen panjang harus setidaknya 3 kali lebih panjang dari segmen pendek.
  • Perpecahan antara segmen dalam digit harus sama panjang dengan segmen pendek.
  • Break antara digit harus sama panjang dengan segmen panjang.
  • Setiap segmen dan istirahat dapat menyimpang hingga 10% dari panjang rata-rata jenis segmen / istirahat tersebut.
  • Seluruh file audio mungkin tidak lebih dari 30 detik.

Istirahat tidak perlu sepenuhnya diam, tetapi segmen Morse harus terdengar lebih keras daripada istirahat.

Perhatikan bahwa Anda harus menulis file audio. Anda tidak dapat hanya memutar suara, misalnya menggunakan bunyi bip sistem. Anda diizinkan menggunakan perpustakaan apa pun untuk menangani format file dan pembuatan audio, tetapi Anda tidak boleh menggunakan fitur bawaan untuk penyandian Morse.

Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.

Silakan pertimbangkan menautkan ke unggahan file audio yang dihasilkan (pada SoundCloud atau yang serupa), sehingga orang dapat memeriksa hasilnya tanpa harus menjalankan kode Anda. Jika Anda mengunggah ke SoundCloud, pastikan untuk mengaktifkan unduhan di tab Izin trek.

Jika output Anda menggunakan format file yang agak tidak umum, harap tambahkan beberapa informasi tentang cara memutarnya dan / atau mengonversinya ke format yang lebih umum dan mengunggahnya.

Contoh lagu

Ini adalah trek contoh yang dibuat secara manual yang sesuai dengan spesifikasi dan menggunakan derau untuk segmen Morse (kebisingan latar belakang mikrofon, tepatnya). Berikut ini tautan ke SoundCloud jika pemutar tertanam tidak berfungsi untuk Anda.

Detail Hadiah

Saya akan memberikan hadiah untuk pengiriman terpendek dalam bahasa pemrograman audio , yaitu bahasa yang dirancang untuk mensintesis suara. Daftar itu tidak lengkap, jadi silakan gunakan bahasa pemrograman audio yang lain, jika Anda mengetahuinya. Jika Anda tidak yakin apakah beberapa bahasa yang ingin Anda gunakan mengklasifikasikan sebagai bahasa pemrograman audio, beri tahu saya di komentar atau dalam obrolan , dan kami dapat mendiskusikannya.

Perhatikan bahwa kiriman Anda masih harus mematuhi semua aturan - khususnya, ia harus menulis file, yang mungkin tidak dapat dilakukan dalam semua bahasa pemrograman audio. Misalnya, sejauh yang saya tahu, gibber hanya dapat memutar suara dan tidak menyimpannya ke file.


1
Tantangan Tambahan: Buat itu terdengar sangat bagus.
Kaz Wolfe

6
@Mew Seberapa bagus Morse mungkin terdengar?
Martin Ender

1
Melakukan ini di Brainf ** k akan membuat ini luar biasa pada banyak level bonus.
Tiang

@ Mr Mungkin, tapi sayangnya, BF tidak bisa menulis ke file. ;) (Saya akan pastikan untuk lebih toleran dengan waktu berikutnya.)
Martin Ender

Apakah format notasi musik, yang hanya berisi skor dan tidak ada audio (.mid, .abc yang terlihat di bawah) dianggap dapat diterima sebagai "file audio"? Bagaimana dengan format "pelacak", yang berisi sampel dan skor, tetapi tidak ada trek audio yang dirender (.mod, .xm)?
Tobia

Jawaban:


4

AWK BASH: 66 86 67 74 byte

Seperti yang diminta oleh Martin Büttner, saya menambahkan tempo karena setelah memeriksa standar Notasi ABC , sepertinya tidak ada nilai default yang ditentukan untuk ini (terima kasih nutki untuk menunjukkan ini).
Saya juga menulis ke dalam file disk (a) alih-alih STDOUT karena pertanyaannya ingin secara eksplisit "file pada disk".

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

Saya memasang tempo 99 yang menyebabkan file audio bertahan 22 detik; Ini lebih lambat dari versi saya sebelumnya, tetapi setidaknya sekarang ini seharusnya memiliki panjang yang sama pada setiap pemain ABC, dan itu cocok di bawah 30 detik.

Sepertinya ... sangat mirip dengan versi sebelumnya seperti yang Anda lihat: Versi terakhir (saya harap: o)) dari skor 2015

Ini adalah file midi baru .

Versi BASH pertama (tempo tidak ada)

Kenapa aku tidak memikirkan ini dulu ...: o)

Itu 22 byte lebih sedikit dibandingkan dengan AWK, untuk hasil yang sama

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

Seperti versi sebelumnya di AWK, ia menulis di stdout file notasi "ABC" yang valid (terima kasih Tobia karena mengetahui bahwa pernyataan "L" adalah opsional)

Ini terlihat seperti ini: versi terakhir dari partisi "2015"

Dan itu terdengar persis seperti versi sebelumnya .

Versi sebelumnya di AWK (86 Bytes)

Ini adalah versi baru; sedikit lebih lama, tetapi dengan waktu yang lebih akurat. Saya membiarkan versi pertama di bawah ini untuk perbandingan / referensi:

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

Ini masih merupakan file "abc" yang valid, yang terlihat seperti ini: skor 2015

Ini adalah file midi baru (saya mempercepat tempo agar tetap di bawah batas 30 detik).

Versi pertama dalam AWK (66 Bytes):

Ini jauh lebih menarik daripada jawaban saya sebelumnya , tetapi jauh lebih pendek, jadi:

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

Ini menghasilkan file "abc" yang valid, yang dapat dibaca (antara lain) EasyABC. Ini akan terlihat seperti ini: Skor "2015" dalam morse

dan akan terdengar seperti ini (file midi) . +


Anda harus mempostingnya sebagai ABC tanpa pembungkus AWK dan mengklaim hadiahnya!
Tobia

Tobia, ABC adalah format file, bukan bahasa pemrograman. Dan sejauh ini dengan 86 byte, ini adalah jawaban terpendek ... Pertanyaannya sekarang "apakah suara yang dihasilkan cukup dekat dari persyaratan agar jawaban itu valid?"
LeFauve

Saya akan menyebutnya format file juga, tetapi halaman wiki OP terhubung mencantumkannya sebagai bahasa pemrograman Sound. Saya memasukkan file ABC saya sebagai entri, di samping program Csound yang lebih tepat. Mari kita lihat apa yang mereka pikirkan.
Tobia

Itulah masalah dengan wiki ... kadang-kadang orang mengeditnya membuat kesalahan: o). Banyak hal yang berbeda dapat disebut "bahasa pemrograman" tetapi saya pikir ABC bukan salah satunya. Bagaimanapun, terima kasih telah mengetahui "L" adalah opsional. Ini menyelamatkan saya beberapa byte; o)
LeFauve

"Segmen panjang harus setidaknya 3 kali lebih panjang dari segmen pendek." Baris musik terakhir yang ditampilkan tidak memenuhi persyaratan.
mbomb007

13

kode mesin x86 (file .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

Dapat dengan mudah dijalankan di bawah DosBox; output adalah file .SND bernama SND. Ini adalah versi FLAC dari outputnya (dan di sini file .COM).

Majelis yang dikomentari:

    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:

The data.dattermasuk di atas adalah representasi mudah penggunaan morse tali (bit yang lebih rendah: suara on / off suara, atas 7 bit: panjang suara dalam sampel >> 4) yang dihasilkan oleh script 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))

Anda tidak perlu memerlukan ekstensi file, jika itu dapat menghemat empat byte.
Martin Ender

4
@ MartinBüttner: sebenarnya, ini memungkinkan saya untuk menyimpan 3 byte. The adari a.snddiletakkan sebelum header SND, yang dimulai dengan .snddiikuti oleh byte nol, sehingga saya mendapatkan .sndbagian secara gratis dan saya mendaur ulang nya nol-terminator. Juga, fakta bahwa header mulai satu byte setelah nama file memungkinkan saya untuk menggunakan inc dxuntuk pindah ke header (1 byte) alih-alih mov dx, header(3 byte). OTOH, jika saya diizinkan untuk memanggilnya .sndsaja, saya bisa menghemat dua byte, tapi saya tidak yakin DOS yang sebenarnya akan mengizinkannya (perawatan ekstensi di bawah DOS sangat aneh).
Matteo Italia

Saya melakukan beberapa tes dengan memanggil file .SND: Saya .SNDmenggunakan DosBox, SND~1di FreeDOS, dan saya mengharapkan sesuatu yang lain di DOS "real"; dengan demikian, ini jelas merupakan area "perilaku tidak terdefinisi". Pada akhirnya, saya memutuskan untuk memanggil file SND(1 byte lebih sedikit karena dihapus a, menjaga biaya inc dx- yang menjadi 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
   ]
]

Main online


Oh Anda juga dapat menggunakan notasi infiks untuk Export, seperti "m.mid"~Export~Sound@....
Martin Ender

(b=None~s~#&)@.6seharusnya (b=None~s~#&)@.4 juga, Anda dapat menyimpan 3 karakter menggunakanr = 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, Tapi sudah ada 0,2 di setiap jeda. .4 + .2
DavidC

@ Davidvidar Ah, kamu benar.
Martin Ender

7

Perl 5: 94 122 140

File SND memiliki header yang lebih sederhana, tidak perlu mencetak dalam biner. Versi ini menghasilkan 8khz mono SND file bernama 'a':

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

Hasil berkas .

Solusi lama. Menghasilkan file WAV mono 8-bit 1khz bernama '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

Hasil berkas .

Untuk mendapatkan 122 karakter saya harus menempelkan header dalam biner alih-alih mengemasnya yang membuat kode sulit untuk disalin di sini. Versi yang lolos adalah:

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

Pengkodean Base64 dari solusi 122 byte yang sebenarnya:

b3BlbgpBLCc+YSc7cHJpbnQKQSJSSUZGkEIAAFdBVkVmbXQgEAAAAAEAAQDoAwAA6AMAAAEACABk
YXRhbEIAACIscGFjayJzKiIsbWFweygkXyl4KDg5NDI2MTA3Mj4+JHYrKyYxPzQwMDoxMDApfSgy
NTUsMCl4MjA=

Anda bisa menggunakan .auekstensi, mungkin. Sudah selesai dilakukan dengan baik!
F. Hauri

7

AWK: 172 170 byte

... dan tanpa menggunakan pustaka wave apa pun! (*)

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}

Ini menghasilkan file audio Sun au pada stdout yang dapat dimainkan oleh vlc (antara lain). Meskipun format file au tidak memiliki batasan laju sampel, VLC menolak untuk memutar file apa pun dengan laju pengambilan sampel lebih rendah dari 4096 Hz, jadi saya menggunakan frekuensi ini

EDIT: Tautan ke file audio yang dihasilkan di DropBox


(*) Tidakkah seharusnya ada bonus untuk ini? ;Hai)


Anda tidak perlu tempat di d=d "\177... pertemuan . Itu menghemat satu byte. Tetapi ketika saya memutar file audio yang dihasilkan, sepertinya itu hilang dit terakhir dari 5.
Mark Reed

Terima kasih. Saya menyimpan byte kedua dengan rangkaian lain menggunakan trik yang sama. Saya baru saja memeriksa file audio dengan vlc 2.1.1 dan kedengarannya lengkap. Pemain apa yang Anda gunakan?
LeFauve

Saya menggunakan QuickTime Player pada OS X. Saya membukanya di VLC dan kedengarannya bagus, jadi tidak apa-apa. Kesalahan Apple, bukan milikmu.
Mark Reed

7

Python, 155

Menggunakan modul gelombang bawaan 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

Menulis ke file yang disebut n.

Terima kasih Sp3000 untuk saran tentang penggunaan daftar pemahaman untuk loop (ini membantu menghapus sedikit lekukan).

Dengarkan itu:

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

Berikut ini tautan ke SoundCloud jika pemutar tertanam tidak berfungsi untuk Anda.

Kode yang dikomentari:

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

Karena wini adalah efek samping, saya pikir Anda bisa daftar comp untuk menyimpan dua 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 ... tidak memikirkan itu = D. Terima kasih!
Vektor

Ini mungkin pertanyaan bodoh, tetapi jika h dibagi dengan 4 untuk setiap iterasi, bagaimana loop sementara berhenti?
Derek 朕 會 功夫

@ Serek 朕 會 功夫 Untuk python, ketika h menjadi 0, ia mengevaluasi ke False, mengakhiri loop. Loop sementara adalah trik golf untuk mengekstraksi nilai dalam urutan "11333033333013333011111" satu per satu.
Vektor

@ bitpwner Saya mengerti bahwa 0 bernilai false, tetapi bukankah itu untuk semua angka positif, jika Anda membaginya dengan angka positif lain, tidak mungkin Anda mendapat 0 dari itu?
Derek 朕 會 功夫

6

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

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

Output ke file bernama a.

Hasil dihosting di Dropbox

Kode tidak dikunci:

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

Python 3 2, 191 188 174 171 (tidak ada perpustakaan)

File WAV sangat sederhana. Ingin mencoba tanpa perpustakaan. Untuk beberapa alasan file-file saya sepertinya crash Windows Media Player. Waktu cepatbekerjabug keluar setengah ke dalam file. Konversi ke tingkat sampel yang lebih besar menggunakan perbaikan Audition ini.

Pembaruan : Diimplementasikan beberapa optimasi dari jawaban Perl. Sekarang keluaran hanya dengan nama ndan pengambilan sampel 1000Hz. Info yang diedit di atas sesuai.

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)

Versi lama

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

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

Dan inilah hasilnya.

Versi yang mudah dibaca,

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

Anda dapat menyimpan beberapa byte dengan membungkus kelas Anda di dalam namespace System.Collections.Generic (yang sebenarnya berfungsi). Ada juga beberapa spasi putih yang tidak perlu yang bisa Anda hapus.
ProgramFOX

4

C # 382 333 byte

Tidak menggunakan pustaka non-standar, menulis wav 8bits per sampel 44100 sampel per detik, dengan apa yang saya harap adalah tajuk yang valid (tampaknya memutar / memuat dengan senang hati di WMP / .NET / Audacity).

Headernya dienkode base64, dan morse dikodekan sebagai sinyal on / off yang disimpan dalam satu panjang (64 bit) karena 5 bit terakhir sama dengan yang pertama.

Hasilnya dapat ditemukan di sini

Kode golf:

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

Dengan komentar:

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

Tantangannya tidak memerlukan nama file untuk diakhiri .wav, sehingga Anda dapat menyimpan 4 byte di sana.
ProgramFOX

Cara yang bagus untuk menyesuaikan kode 69 bit PWM ke dalam konstanta 64bit. Saya mencoba sesuatu seperti itu tetapi mungkin saya tidak dapat mempersingkat kode saya menggunakan metode Anda.
nutki

2

SuperCollider , 625 605 byte

Pengiriman bahasa pemrograman audio!

Output ditulis ke file bdalam format AIFF. Windows Media Player gagal membukanya, tetapi berfungsi baik di VLC media player. File yang dihasilkan aadalah file 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;

Saya membuat beberapa fungsi SuperCollider: fmenghasilkan bunyi bip gpendek, istirahat pendek, hbip panjang dan iistirahat panjang. SuperCollider membutuhkan posisi awal untuk setiap gelombang sinus dan bukan panjang, jadi saya harus membuat fungsi yang menghasilkan gelombang dengan posisi awal yang benar dan saya harus memanggil fungsi setiap kali saya membutuhkan gelombang sinus. (Saya tidak bisa menyimpan gelombang dengan panjang tertentu dalam variabel untuk digunakan kembali). The \wDefinisi dibuat pada akhir blok kode.

Di komputer Windows saya, itu tidak menyimpan file audio di direktori yang sama dengan kode saya, tetapi di direktori ini:

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

Hasil dihosting di Dropbox

Kode dengan lekukan:

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 adalah bahasa pemrograman audio. bitpwner membantu saya menurunkan ini dari 201 byte menjadi 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;}

Berikut ini tautan langsung ke SoundCloud jika pemutar tertanam tidak berfungsi untuk Anda.


1
Berhasil memotongnya ke 164 dengan trik serupa yang digunakan dalam jawaban saya: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;}
Vektor

@bitpwner Anda menggunakan juntuk menghindari array?
KSFT

Angka ajaib 1016835dalam biner adalah 11111000010000000011. jada hanya untuk melacak jeda antara setiap digit 2015(setiap digit memiliki 5 suara).
Vektorized

@bitpwner Ah, saya bahkan tidak menyadarinya. Itu ide yang sangat keren!
KSFT

Anda dapat mengeditnya di jawaban Anda untuk memiliki peluang hadiah yang lebih tinggi. imo, peningkatannya tidak banyak untuk membenarkan jawaban baru karena Anda sudah melakukan sebagian besar pekerjaan mencari tahu Chuck;)
Vektor

2

Csound, 140 + 40 = 180

Bahasa pemrograman audio.

Ini adalah file Orchestra:

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

dan ini adalah file Score:

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

Ukuran dihitung dengan asumsi tidak ada spasi tambahan, terminator jalur tunggal (UNIX) dan tidak ada terminator setelah baris terakhir.

Anda memohon mereka menggunakan perintah csound:

csound morse.org morse.sco

yang akan menghasilkan file output di direktori saat ini, secara default bernama "test.aif"

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

Saya bisa mencukur dua atau tiga byte dengan memilih bentuk gelombang yang lebih buruk, tapi saya suka suara gelombang sinus Morse tradisional.

PS: Saya seorang pemula total di Csound, setiap kiat bermain golf dihargai, terutama mengenai file skor!


Ah, saya menantikan CSound. Jika tidak ada yang mengirim jawaban di dalamnya, saya mungkin akan mencoba untuk menulis sendiri. :)
Martin Ender

1

brainfuck , 649 byte

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

Ini menghasilkan urutan 8 bit sampel yang tidak ditandatangani yang dapat diputar pada 8000 sampel per detik dengan alat seperti aplaydi Linux. Kredit ke tabel konstanta BF .

Cobalah online!

Agak kurang golf

DIT DIT DAH DAH DAH
++[>
 -[+>++[++<]>]>[>..........-..........+<-]
 -[+>++[++<]>]>[....................-]
<<<<<-]
+++[>
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
 -[+>++[++<]>]>[....................-]
<<<-]
-[+>++[++<]>]>[....................-]
DAH DAH DAH DAH DAH
+++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
+++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DAH DAH DAH DAH
-[+>++[++<]>]>[>..........-..........+<-]
++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DIT DIT DIT DIT
+++++[>
 -[+>++[++<]>]>[....................-]
 -[+>++[++<]>]>[>..........-..........+<-]
<<<<<-]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.