新年のモールス


33

これがウィークリーチャレンジ#1です。テーマ:オーディオ処理

あなたの仕事は含まれています(お好みの形式で)ディスクにオーディオファイル、書き込むプログラム、書くことですモールスコードのために2015、すなわち、

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

単一周波数の正弦波、和音、ノイズ、一部の楽器(MIDIファイルを使用するなど)など、可聴である限り、セグメントに任意の種類のサウンドを自由に選択できます。ただし、タイミングにはいくつかの制約があります。

  • 短いセグメントの長さは少なくとも0.2秒である必要があります。
  • 長いセグメントは、短いセグメントの少なくとも3倍の長さである必要があります。
  • 数字内のセグメント間の区切りは、短いセグメントと同じ長さでなければなりません。
  • 数字間の区切りは、長いセグメントと同じ長さでなければなりません。
  • 各セグメントとブレークは、そのタイプのセグメント/ブレークの平均長から最大10%逸脱する可能性があります。
  • オーディオファイル全体が30秒を超えないようにしてください。

休憩は完全に無音である必要はありませんが、モールス信号音は休憩よりも大きな音量である必要があります。

オーディオファイルを作成する必要あることに注意してください。システムビープ音などを使用して、サウンドを再生することはできません。任意の種類のライブラリを使用してファイル形式とオーディオ生成を処理できますが、モールス符号化に組み込み機能を使用しないでください。

これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。

結果のオーディオファイル(SoundCloudなど)のアップロードへのリンクを検討してください。そうすれば、コードを実行しなくても結果を確認できます。SoundCloudにアップロードする場合は、トラックの[権限]タブでダウンロードを有効にしてください。

出力で一般的でないファイル形式を使用している場合は、再生方法やより一般的な形式に変換してアップロードする方法に関する情報を追加してください。

トラックの例

これは、仕様に準拠し、モールスセグメントにノイズ(正確にはマイクのバックグラウンドノイズ)を使用する、手動で生成されたサンプルトラックです。埋め込みプレーヤーが機能しない場合のSoundCloudへのリンクは次のとおりです。

バウンティの詳細

オーディオプログラミング言語、つまり音声を合成するように設計された言語での最短の提出に対する賞金を授与します。そのリストは完全ではありませんので、ご存じの場合は別のオーディオプログラミング言語を自由に使用してください。使用したい言語がオーディオプログラミング言語として分類されるかどうかわからない場合は、コメントまたはチャットでお知らせください。それについて話し合うことができます。

提出物はすべてのルールに準拠する必要があることに注意してください。特に、すべてのオーディオプログラミング言語では不可能なファイルを書き込む必要があります。たとえば、私が知る限り、gibberはサウンドを再生することしかできず、ファイルに保存することはできません。


1
追加の課題:本当にいい音にしましょう。
カズウルフ

6
@Mewモールスはどれくらいいい音が聞こえるか?
マーティンエンダー

1
Brainf ** kでこれを行うと、非常に多くのボーナスレベルでこれが素晴らしいものになります。
マスト

@Mastおそらく、しかし残念ながら、BFはファイルに書き込むことができません。;)(次回はもっと寛大になるようにします。)
マーティン・エンダー

楽譜のみを含み、オーディオ(.mid、.abcは下記参照)を含まない音楽表記形式は、「オーディオファイル」として受け入れられると見なされますか?サンプルとスコアの両方を含むが、レンダリングされたオーディオトラック(.mod、.xm)を含まない「トラッカー」形式についてはどうですか。
トビア

回答:


4

AWK BASH:66 86 67 74バイト

MartinBüttnerからのリクエストに応じて、 ABC Notation標準を、これに定義されたデフォルト値がないように見える(これを示すためにnutkiに感謝します)。
質問が明示的に「ディスク上のファイル」を望んでいたので、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秒未満に収まるはずです。

見た目は以前のバージョンと非常によく似ています: Last (I hope :o) ) version of 2015's score

ここは 新しいMIDIファイルです

最初の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の以前のバージョンと同様に、有効な「ABC」表記ファイルをstdoutに書き込みます(「L」ステートメントがオプションであることを確認してくれたTobiaに感謝します)

次のようになります。 last version of "2015" partition

そして、前のバージョンとまったく同じように聞こえます。

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」ファイルであり、次のようになります。 score of 2015

これが新しいMIDIファイルです(30秒の制限を下回るようにテンポを加速しました)。

AWKの最初のバージョン(66バイト):

これは以前の回答よりもずっと面白くありませんが、はるかに短いので:

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

これにより、有効な「abc」ファイルが出力され、(特に)EasyABCに読み込むことができます。次のようになります。 Score of "2015" in morse

そして、それはこのように聞こえます(midiファイル)。+


AWKラッピングなしでABCとして投稿し、賞金を請求​​する必要があります!
トビア

トビア、ABCはファイル形式であり、プログラミング言語ではありません。そして、これまでのところ86バイトでこれが最短の答えです...問題は、「結果のサ​​ウンドは、答えが有効であるための要件から十分近いですか?」です。
ルフォーブ

私もそれをファイル形式と呼んでいましたが、OPがリンクされているWikiページには、Soundプログラミング言語としてリストされています。より適切なCsoundプログラムと一緒に、自分のABCファイルをエントリとしてまとめました。彼らの考えを見てみましょう。
トビア

これがwikiの問題です...編集する人が間違えることがあります:o)。さまざまなものが「プログラミング言語」と呼ばれることがありますが、ABCはそれらの1つではないと思います。とにかく、「L」を見つけるのはオプションでした。それは私に数バイトを節約しました; o)
ルフォーブ

「長いセグメントは、短いセグメントの少なくとも3倍の長さである必要があります。」表示されている最後の音楽ラインは要件を満たしていません。
mbomb007

13

x86マシンコード(.COMファイル): 121 120 113 109バイト

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の下で簡単に実行できます。出力は.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バイトを節約できる場合は、必ずしもファイル拡張子は必要ありません。
マーティンエンダー

4
@MartinBüttner:実際、3バイト節約できます。aa.sndだけで始まるSNDヘッダ、前に置かれ.snd、ゼロバイトに続いて、私が得るので、.snd自由のための部品を、私はそのゼロターミネータをリサイクルしています。また、ヘッダーがファイル名の1バイト後に始まるという事実により、a inc dxを使用してmov dx, header(3バイト)ではなくヘッダー(1バイト)に移動できます。OTOH、もし私がそれを.snd一人で呼べば、2バイト節約できますが、本当のDOSがそれを許すかどうかはわかりません(DOSの下での拡張子の扱いは非常に独特でした)。
マッテオイタリア

私は、ファイルを呼び出すことでいくつかのテストをした.SND:私が得た.SND、DOSBoxを上SND~1FreeDOSの上で、私は「本物の」DOS上で何かを期待します。したがって、それは間違いなく「未定義の動作」領域です。最終的に、ファイルの呼び出しで解決しましたSND(削除されたために1バイト少なくなりainc dx- のコストを保持しますdec dx)。
マッテオイタリア

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
   ]
]

オンラインでプレイ


ああ、あなたはまたのために中置記法を使用することができるExportように、"m.mid"~Export~Sound@...
マーティンエンダー

(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

マーティン、しかし、各休憩にはすでに.2がありました。.4 + .2
DavidC

@DavidCarraherああ、あなたは正しい。
マーティンエンダー

7

Perl 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=

.auおそらく拡張機能を使用できます。よくやった!
F.ハウリ

7

AWK:172 170バイト

...そして、waveライブラリを使用せずに!(*)

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}

これにより、vlc(特に)で再生できるSun auオーディオファイルがstdoutに出力されます。auファイル形式にはサンプルレートの制限はありませんが、VLCは4096 Hzより低いサンプリングレートのファイルを再生することを拒否しているため、この周波数を使用しました

編集:DropBox上の結果のオーディオファイルへのリンク


(*)これにボーナスはありませんか?; o)


d=d "\177...連結のスペースは必要ありません。それはバイトを節約します。しかし、私は結果のオーディオファイルを再生するとき、それは5の最後のDITが欠けているように、それが聞こえる
マーク・リード

ありがとう。同じトリックを使用して、2番目のバイトを別の連結で保存しました。vlc 2.1.1でオーディオファイルをチェックしたところ、完全に聞こえます。どのプレーヤーを使用しましたか?
ルフォーブ

OS XでQuickTime Playerを使用していました。VLCでそれを開いたところ、うまく聞こえますので、気にしないでください。Appleのせいで、あなたのせいではありません。
マークリード

7

Python、155

python組み込みのwaveモジュールを使用します。

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副作用なので、compをリストして2バイトを節約できると思います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を考えていませんでした。THX!
ベクトル化された

これはばかげた質問かもしれませんが、hが反復ごとに4で除算されると、whileループはどのように停止しますか?
デレク朕會功夫

@Derek朕會功夫pythonの場合、hが0になると、Falseと評価され、ループが終了します。whileループは、「11333033333013333011111」というシーケンスの値を1つずつ抽出するゴルフのトリックです。
ベクトル化された

@bitpwner 0がfalseと評価されることはわかりますが、すべての正の数について、別の正の数で除算すると、0を得る方法はありませんか?
デレク朕會功夫

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でホストされる結果

未ゴルフコード:

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(ライブラリなし)

Wavファイルは非常にシンプルです。ライブラリなしで試してみたかった。何らかの理由で、私のファイルがWindows Media Playerをクラッシュさせるようです。クイックタイム働くファイルの途中でバグが発生します。Auditionを使用してより大きなサンプルレートに変換すると、これが修正されます。

更新:Perlの回答からいくつかの最適化を実装しました。名前だけで、n1000Hzサンプリングで出力するようになりました。上記の情報を適宜編集しました。

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バイト

非標準のライブラリを使用せず、サンプルあたり8ビット/秒の44100サンプル/秒のwavを書き出します。有効なヘッダーを期待しています(WMP / .NET / Audacityで楽しく再生/ロードできるようです)。

ヘッダーは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

スーパーコライダー 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;}
ベクトル化

@bitpwner j配列を避けるために使用していますか?
KSFT

1016835バイナリのマジックナンバーは11111000010000000011です。(各桁に5つの音がある)のj各桁の間の一時停止を追跡するためだけにあり2015ます。
ベクトル化された

@bitpwnerああ、私もそれに気づかなかった。それは本当にクールなアイデアです!
KSFT

それをあなたの答えに編集して、賞金のチャンスを増やすことができます。imo、チャックを考え出した作業の大部分を既に行った新しい答えを正当化するための改善はそれほど多くありません;)
ベクトル化

2

Csound、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を楽しみにしていました。誰もその中に答えを投稿していなかったら、私はおそらく自分でそれを書き込もうとしたでしょう。:)
マーティンエンダー

1

brainfuck、649バイト

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

これにより、8ビットの符号なしサンプルのシーケンスが生成されaplay、Linux などのツールで1秒あたり8000サンプルで再生できます。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.