Yeni Yılı Mors


33

Bu Haftalık Mücadelesi # 1. Tema: ses işleme

Göreviniz içeren (seçtiğiniz bir formatta) diske bir ses dosyası yazar bir program, yazmaktır Mors kodu için 2015, yani

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

Tek frekanslı sinüs dalgası, akor, gürültü, bazı enstrümanlar (örn. MIDI dosyalarını kullanarak), duyulabilir olduğu sürece, segmentler için herhangi bir ses türünü seçmekte özgürsünüz. Ancak, zamanlamanın bazı kısıtlamaları vardır:

  • Kısa segmentlerin uzunluğu en az 0,2 saniye olmalıdır.
  • Uzun bölümler, kısa bölümler boyunca en az 3 kat daha fazla olmalıdır.
  • Rakamdaki segmentler arasındaki kopmalar kısa segmentler ile aynı uzunlukta olmalıdır.
  • Rakamlar arasındaki sonlar, uzun bölümlerle aynı uzunlukta olmalıdır.
  • Her bölüm ve ara, bu tür bölüm / ara türünün ortalama uzunluğundan% 10'a kadar değişebilir.
  • Ses dosyasının tamamı 30 saniyeden uzun olamaz.

Molaların tamamen sessiz olması gerekmez, ancak Mors segmentleri molalardan daha yüksek sesli olmalıdır.

Bir ses dosyası yazmanız gerektiğini unutmayın . Sesi yalnızca çalamazsınız, örneğin sistem bip seslerini kullanma. Dosya biçimini ve ses üretimini işlemek için herhangi bir kütüphane kullanmanıza izin verilir, ancak Mors kodlaması için yerleşik özellikler kullanmamanız gerekir.

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.

Lütfen sonuçta elde edilen ses dosyasının (SoundCloud'da veya benzeri) bir yüklemesine bağlanmayı düşünün, böylece insanlar kodunuzu çalıştırmadan sonucu kontrol edebilirler. SoundCloud'a yüklerseniz, parçanın İzinler sekmesinde indirmeyi etkinleştirdiğinizden emin olun.

Çıktınız alışılmadık bir dosya formatı kullanıyorsa, lütfen oynatma ve / veya daha yaygın bir formata dönüştürme ve yükleme hakkında bazı bilgiler ekleyin.

Örnek parça

Bu, teknik özelliklere uyan ve Mors segmentleri için gürültü kullanan (mikrofon arka plan gürültüsü, kesin), elle oluşturulan bir örnek parçadır. Katıştırılmış oynatıcı sizin için çalışmıyorsa İşte SoundCloud'a bir link .

Ödül Detayları

Ödülünü bir ses programlama dilinde en kısa gönderime , yani sesi sentezlemek için tasarlanmış bir dile vereceğim. Bu liste tamamlanmadı, eğer biliyorsanız bir başka ses programlama dili kullanmaktan çekinmeyin. Kullanmak istediğiniz bazı dillerin bir ses programlama dili olarak sınıflandırıldığından emin değilseniz, lütfen bana yorumlarda veya sohbette bildirin ve bunu tartışabiliriz.

Gönderinizin yine de tüm kurallara uyması gerektiğine dikkat edin - özellikle, tüm ses programlama dillerinde yapılamayacak bir dosya yazması gerekir. Örneğin, söyleyebildiğim kadarıyla, gibber yalnızca sesi çalabilir ve bir dosyaya kaydedemez.


1
Ek Zorluk: Sesi gerçekten güzel kılar.
Kaz Wolfe

6
@Mew Morse ne kadar güzel ses çıkarabilir ki?
Martin Ender

1
Bunu Brainf ** k'da yapmak bunu pek çok bonus seviyesinde harika kılar.
Mast

@Mast Muhtemelen, ama ne yazık ki, BF bir dosyaya yazamaz. ;) (Bir dahaki sefere daha yumuşak olacağımdan emin olacağım.)
Martin Ender

Yalnızca nota içeren ve hiç ses içermeyen (.mid, .abc) müzik notasyonu biçimleri "ses dosyası" olarak kabul edilebilir mi? Hem örnekleri hem de puanı içeren, ancak işlenen ses parçası (.mod, .xm) içeren "izleyici" biçimlerinden ne haber?
Tobia,

Yanıtlar:


4

AWK BASH: 66 86 67 74 bayt

Martin Büttner tarafından talep edildiği gibi, ABC Notasyon standardını kontrol ettikten sonra , bunun için tanımlanmış bir varsayılan değer bulunmadığı için bir tempo ekledim (bunu işaret etmek için teşekkürler).
Ayrıca soru açıkça "diskteki bir dosya" istediğinden STDOUT yerine bir disk dosyasına (a) yazıyorum.

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

Ses dosyasının 22 saniye sürmesine neden olan 99'luk bir tempo koydum; Önceki sürümümden daha yavaş, ancak en azından şimdi her ABC çalarda aynı uzunlukta olması gerekiyor ve 30 saniyenin altına sığması gerekiyor.

Görünüyor ki ... gördüğünüz gibi önceki sürüme çok benziyor: 2015'in puanının son (umarım: o) versiyonu

İşte yeni midi dosyası .

İlk BASH sürümü (tempo eksik)

Neden bunu önce düşünmedim ...: o)

Aynı sonuç için AWK’dan 22 bayt daha az

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

AWK'daki önceki sürüm gibi, stdout'a geçerli bir "ABC" notasyon dosyası yazar ("L" ifadesinin isteğe bağlı olduğunu öğrendiğiniz için Tobia'ya teşekkürler)

Bu gibi görünüyor: "2015" bölümünün son sürümü

Ve önceki sürümün aynen sesine benziyor .

AWK'da önceki sürüm (86 Bayt)

İşte yeni bir sürüm; biraz daha uzun, ama daha doğru zamanlama ile. Karşılaştırma / referans için ilk versiyonun aşağıda olmasına izin verdim:

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

Bu hala böyle görünen geçerli bir "abc" dosyasıdır: 2015 yılı puanı

İşte yeni midi dosyası (30 saniye limitinin altında kalmak için tempoyu hızlandırdım).

AWK’daki ilk sürüm (66 Bayt):

Bu önceki cevabımdan çok daha az ilginç , ama çok daha kısa, o yüzden:

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

Bu, (diğerleri arasında) EasyABC içine okunabilen geçerli bir "abc" dosyası çıkarır. Bunun gibi görünecek: Mors'ta "2015" Puanı

ve bu gibi ses çıkarır (midi dosyası) . +


AWK ambalajı olmadan ABC olarak göndermelisiniz ve ödül almalısınız!
Tobia,

Tobia, ABC bir dosya dili değil, bir programlama dilidir. Ve şimdiye kadar 86 byte ile bu en kısa cevaptır ... Şimdi soru şu ki: "Sonuç olarak ortaya çıkan ses cevabın geçerli olması için gerekenlerden yeterince yakın mı?"
LeFauve

Ben de buna bir dosya formatı diyecektim, fakat OP bağlantılı wiki sayfası bir Ses programlama dili olarak listeliyor. Daha uygun bir Csound programının yanı sıra kendi ABC dosyamı bir giriş olarak topladım. Bakalım bunun hakkında ne düşündüklerini görelim.
Tobia,

Wikilerde sorun budur ... bazen onları düzenleyen insanlar hata yapar: o). Birçok şeye "programlama dili" denebilir ancak ABC'nin onlardan biri olmadığını düşünüyorum. Neyse, "L" yi seçtiğin için teşekkür ederim isteğe bağlıydı. Bana bir kaç bayt kurtardı; o)
LeFauve

"Uzun bölümler, kısa bölümler süresinin en az 3 katı olmalıdır." Gösterilen son müzik çizgisi gereksinimleri karşılamıyor.
mbomb007

13

x86 makine kodu (.COM dosyası): 121 120 113 109 bayt

HexDump:

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

DosBox altında kolayca çalıştırılabilir; çıktı, adlandırılmış bir .SND dosyasıdırSND . İşte çıktısının bir FLAC sürümü (ve burada .COM dosyası).

Yorum yapılan montaj:

    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.datYukarıda yer mors dizgisinin kolay kullanımlı bir temsilidir (düşük bit: sesi / kapalı ses, üst 7 bit: örneklerde ses uzunluğu >> 4) Python komut tarafından üretilen:

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

Size dört byte kazandırabilirse, mutlaka bir dosya uzantısına ihtiyacınız yoktur.
Martin Ender

4
@ MartinBüttner: aslında 3 bayt kurtarmamı sağlıyor. aArasında a.sndsadece ile başlar SND başlığının daha önce konur .sndsıfır bayt, sonra, olsun .sndücretsiz parçası ve sıfır-terminatör geri. Ayrıca, üstbilginin dosya adından sonra bir bayt başlatması inc dx, a'yı bir (3 bayt) yerine başlığa (1 bayt) taşımak için kullanmama izin veriyor mov dx, header. OTOH, sadece .sndtek başına çağırmama izin verilirse iki byte tasarruf edebilirim, ancak gerçek DOS'un buna izin vereceğinden emin değilim (DOS altındaki uzantının tedavisi oldukça tuhaftı).
Matteo Italia

Dosyayı çağırırken bazı testler yaptım .SND: .SNDDosBox'a FreeDOS'ta başladım SND~1ve "gerçek" DOS'ta başka bir şey bekliyordum; bu nedenle, kesinlikle "tanımsız davranış" alanıdır. Sonunda, dosyayı çağırarak birlikte yerleşmiş SND(kaldırıldı az nedeniyle 1 bayt amaliyeti arasında tutarak, inc dx- hale geldiği 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
   ]
]

Çevrimiçi oyna


Ah siz de için infix notasyonu kullanabilirsiniz Exportgibi "m.mid"~Export~Sound@....
Martin Ender

(b=None~s~#&)@.6olmalıdır (b=None~s~#&)@.4 kullanmakta 3 karakter kaydedebilir, aynı zamandar = 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, Ama zaten her molada bir .2 vardı. .4 + .2
DavidC

@DavidCarraher Ah, haklısın.
Martin Ender

7

Perl 5: 94 122 140

SND dosyalarının daha basit başlıkları vardır, ikili yazdırmaya gerek yoktur. Bu sürümler 'a' isimli 8khz mono SND dosyası üretir:

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

Sonuç dosyası .

Eski çözüm 'A' adlı bir 1 khz 8-bit mono WAV dosyası üretir:

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

Sonuç dosyası .

122 karaktere ulaşmak için, başlığı buraya kopyalamayı zorlaştıran paketlemek yerine başlığı ikiliye yapıştırmak zorunda kaldım. Kaçan sürüm:

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

Gerçek 122 baytlık çözümün Base64 kodlaması:

b3BlbgpBLCc+YSc7cHJpbnQKQSJSSUZGkEIAAFdBVkVmbXQgEAAAAAEAAQDoAwAA6AMAAAEACABk
YXRhbEIAACIscGFjayJzKiIsbWFweygkXyl4KDg5NDI2MTA3Mj4+JHYrKyYxPzQwMDoxMDApfSgy
NTUsMCl4MjA=

U .aubelki uzatma kullanabilir . Aferin!
F. Hauri,

7

AWK: 172 170 bayt

... ve herhangi bir dalga kütüphanesini kullanmadan! (*)

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}

Bu, vdc tarafından çalınabilen stdout'taki Sun au ses dosyasını verir (diğerleri arasında). Au fileformat'ın örnekleme hızı sınırlaması olmasa da, VLC, 4096 Hz'den düşük örnekleme hızına sahip herhangi bir dosyayı çalmayı reddediyor, bu yüzden bu frekansı kullandım

EDIT: DropBox'ta çıkan ses dosyasına bağlantı


(*) Bunun için bir bonus olmamalı mı? ;O)


d=d "\177Birleştirmede ... boşluğa ihtiyacınız yok . Bu bir bayt kazandırır. Ama ortaya çıkan ses dosyasını çaldığımda, 5'in son bölümünü kaçırmış gibi görünüyor.
Mark Reed

Teşekkürler. Aynı numarayı kullanarak ikinci bir baytı başka bir birleştirme ile sakladım. Sadece ses dosyasını vlc 2.1.1 ile kontrol ettim ve ses tamamlandı. Hangi oyuncuyu kullandın?
LeFauve

OS X'te QuickTime Player kullanıyordum. VLC'de açtım ve kulağa hoş geliyor, bu yüzden boşver. Apple'ın suçu, senin değil.
Mark Reed,

7

Python, 155

Python yerleşik dalga modülünü kullanır.

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

Adlı bir dosyaya yazar n.

Döngü için liste kavrama kullanımına ilişkin öneri için Sp3000'e teşekkür ederiz (bu, bir miktar girintinin kaldırılmasına yardımcı oldu).

Onu dinle:

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

Katıştırılmış oynatıcı sizin için çalışmıyorsa İşte SoundCloud'a bir link .

Yorumlanan kod:

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

wYan etki olduğundan , iki bayttan tasarruf etmek için comp listesini listeleyebileceğinizi düşünüyorum: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 ... bunu düşünmedi = D. Teşekkürler!
Vectörize

Bu aptalca bir soru olabilir, ancak her yineleme için h 4'e bölünürse, while döngüsü nasıl durur?
Derek,

@Derek 朕 會 py python için h 0 olduğunda, false olarak değerlendirilir ve döngüyü sonlandırır. While döngüsü, "11333033333013333011111" sırasındaki değerleri birer birer çıkarmak için bir golf oyunudur.
Vectörize

@ bitpwner 0'ın false olarak değerlendirildiğini anlıyorum, ancak tüm pozitif sayılar için, eğer bunu başka bir pozitif sayıya bölerseniz, 0'dan çıkarmanın hiçbir yolu yok mu?
Derek,

6

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

Wav.Net kütüphanesini kullanır .

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

Adlı bir dosyaya çıktı verir a.

Dropbox'ta barındırılan sonuç

Ungolfed kod:

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

piton 3 2, 191 188 174 171 (kitaplık yok)

Wav dosyaları inanılmaz derecede basittir. Kütüphaneler olmadan denemek istedim. Nedense dosyalarım Windows Media Player ile çarpışıyor. Hızlı zamanEserleridosyaya yarı yolda hata veriyor. Audition'ı kullanarak daha büyük bir örnekleme oranına dönüştürme bunu düzeltir.

Güncelleme : Perl cevabından bazı optimizasyonlar uygulandı. Şimdi sadece adla nve 1000Hz örneklemesinde çıktı alıyor. Yukarıdaki bilgiyi buna göre düzenledi.

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)

Eski versiyon

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 bayt

Wav.Net kütüphanesini kullanma .

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

Ve işte çıktı.

Okunabilir versiyonu,

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

Sınıfınızı System.Collections.Generic (gerçekte çalışan) ad alanı içine sararak bazı baytları kaydedebilirsiniz. Ayrıca kaldırabileceğiniz bazı gereksiz boşluklar var.
ProgramFOX

4

C # 382 333bayt

Herhangi bir standart olmayan kitaplık kullanmaz, saniyede 8 bit örnek başına 44100 örnek örneği yazar, umarım geçerli bir başlıktır (WMP / .NET / Audacity'de mutlu bir şekilde oynatılıyor / yükleniyor).

Başlık base64 kodludur ve mors, son 5 bit birinciyle aynı olduğundan, uzun bir süre (64 bit) depolanan sinyal açma / kapama olarak kodlanır.

Sonuç burada bulunabilir

Golf kodu:

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

Yorumlarla:

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

Buradaki zorluk bitmek üzere dosyanın ismini gerektirmiyor .wav, bu yüzden orada 4 byte tasarruf edebilirsiniz.
ProgramFOX,

69 bit PWM kodunu 64 bit sabitine yerleştirmenin iyi bir yolu. Öyle bir şey deniyordum ama muhtemelen yöntemimi kullanarak kodumu kısaltamıyordum.
nutki

2

SuperCollider , 625 605 bayt

Ses programlama dili teslimi!

Çıktı, bir dosyaya bAIFF biçiminde yazılır . Windows Media Player açamıyor, ancak VLC media player'da düzgün çalışıyor. Oluşturulan dosya abir OSC dosyasıdır .

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;

Birkaç SuperCollider işlevi oluşturdum: fkısa bir bip sesi, gkısa bir mola, huzun bir bip sesi ve iuzun bir mola üretir . SuperCollider her sinüs dalgası için başlangıç ​​pozisyonlarına ihtiyaç duyuyor, uzunluğa değil, bu yüzden doğru başlangıç ​​pozisyonuna sahip bir dalga üreten fonksiyonlar yaratmalıydım ve her sinüs dalgasına ihtiyaç duyduğumda fonksiyonları çağırmalıyım. (Belirli bir uzunlukta bir dalgayı tekrar kullanmak üzere bir değişkende saklayamadım). \wTanım kod bloğunun sonunda oluşturulur.

Windows bilgisayarımda, ses dosyasını kodumla aynı dizine kaydetmedi, ancak bu dizine kaydetti:

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

Dropbox'ta barındırılan sonuç

Girintili kod:

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 bir ses programlama dilidir. bitpwner bunu 201 bayttan 147 bayta indirmeme yardım etti.

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

Katıştırılmış oynatıcı sizin için işe yaramazsa, işte SoundCloud'a doğrudan bir bağlantı .


1
Cevabımda kullanılan benzer bir hile ile 164 aşağı indirmeyi başardı: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;}
Ocak'ta

@bitpwner Diziyi jönlemek için mi kullanıyorsunuz ?
KSFT

Sihirli sayı 1016835ikilik biçimde 11111000010000000011. jsadece her bir basamağın arasındaki duraklamaları takip etmek için var 2015(her basamağın 5 sesi var).
Vectörize

@ bitpwner Ah, bunu farketmedim bile. Bu gerçekten harika bir fikir!
KSFT

Daha yüksek bir lütuf şansına sahip olmak için cevabınızı düzenleyebilirsiniz. imo, iyileştirme, Chuck'ı bulmak için yapılan çalışmanın büyük kısmını yaptığınız yeni bir cevabı haklı çıkaracak pek bir şey değildir;)
Vectorized

2

Csound, 140 + 40 = 180

Ses programlama dili

Bu Orkestra dosyası:

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

ve bu da Puan dosyasıdır:

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

Boyutlar, fazladan boşluk olmadığı, tek satır sonlandırıcı (UNIX) ve son satırdan sonra sonlandırıcı olmadığı varsayılarak hesaplanır.

Onları csound komutunu kullanarak çağırırsınız:

csound morse.org morse.sco

Geçerli dizinde varsayılan olarak "test.aif" adlı bir çıktı dosyası üretecek

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

Çirkin bir dalga şekli seçerek iki ya da üç bayt tıraş edebilirdim, ancak geleneksel Mors sinüs dalgasının sesini seviyorum.

Not: Ben Csound'da tamamen acemiyim, özellikle skor dosyasıyla ilgili golf önerileri dikkate değer!


Ah, CSound'u dört gözle bekliyordum. Eğer kimse cevap vermeseydi, muhtemelen kendim yazmayı denerdim. :)
Martin Ender

1

brainfuck , 649 bayt

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

Bu aplay, Linux gibi bir araçla saniyede 8000 örnekte çalınabilecek 8 bit işaretsiz numune dizisi oluşturur . BF sabitleri tablosuna kredi .

Çevrimiçi deneyin!

Biraz daha az golf oynadı

DIT DIT DAH DAH DAH
++[>
 -[+>++[++<]>]>[>..........-..........+<-]
 -[+>++[++<]>]>[....................-]
<<<<<-]
+++[>
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
 -[+>++[++<]>]>[....................-]
<<<-]
-[+>++[++<]>]>[....................-]
DAH DAH DAH DAH DAH
+++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
+++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DAH DAH DAH DAH
-[+>++[++<]>]>[>..........-..........+<-]
++++[>
 -[+>++[++<]>]>[....................-]
 +++[>
  -[+>++[++<]>]>[>..........-..........+<-]
 <<<-]
<<<-]
++[>
 -[+>++[++<]>]>[....................-]
<<<-]
DIT DIT DIT DIT DIT
+++++[>
 -[+>++[++<]>]>[....................-]
 -[+>++[++<]>]>[>..........-..........+<-]
<<<<<-]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.