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.
Jawaban:
AWKBASH:66866774 byteSeperti 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".
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:
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
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:
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:
Ini masih merupakan file "abc" yang valid, yang terlihat seperti ini:
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:
Ini menghasilkan file "abc" yang valid, yang dapat dibaca (antara lain) EasyABC. Ini akan terlihat seperti ini:
dan akan terdengar seperti ini (file midi) . +
sumber
kode mesin x86 (file .COM):
121120113109 byteHexdump:
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:
The
data.dat
termasuk 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:sumber
a
daria.snd
diletakkan sebelum header SND, yang dimulai dengan.snd
diikuti oleh byte nol, sehingga saya mendapatkan.snd
bagian secara gratis dan saya mendaur ulang nya nol-terminator. Juga, fakta bahwa header mulai satu byte setelah nama file memungkinkan saya untuk menggunakaninc dx
untuk pindah ke header (1 byte) alih-alihmov dx, header
(3 byte). OTOH, jika saya diizinkan untuk memanggilnya.snd
saja, saya bisa menghemat dua byte, tapi saya tidak yakin DOS yang sebenarnya akan mengizinkannya (perawatan ekstensi di bawah DOS sangat aneh)..SND
: Saya.SND
menggunakan DosBox,SND~1
di 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 fileSND
(1 byte lebih sedikit karena dihapusa
, menjaga biayainc dx
- yang menjadidec dx
).Mathematica - 130
Main online
sumber
Export
, seperti"m.mid"~Export~Sound@...
.(b=None~s~#&)@.6
seharusnya(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]]
Perl 5: 94
122 140File SND memiliki header yang lebih sederhana, tidak perlu mencetak dalam biner. Versi ini menghasilkan 8khz mono SND file bernama 'a':
Hasil berkas .
Solusi lama. Menghasilkan file WAV mono 8-bit 1khz bernama 'a':
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:
Pengkodean Base64 dari solusi 122 byte yang sebenarnya:
sumber
.au
ekstensi, mungkin. Sudah selesai dilakukan dengan baik!AWK:
172170 byte... dan tanpa menggunakan pustaka wave apa pun! (*)
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)
sumber
d=d "\177
... pertemuan . Itu menghemat satu byte. Tetapi ketika saya memutar file audio yang dihasilkan, sepertinya itu hilang dit terakhir dari 5.Python, 155
Menggunakan modul gelombang bawaan python.
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:
sumber
w
ini 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
C #,
556552536535516506503491483 byteMenggunakan perpustakaan Wav.Net .
Output ke file bernama
a
.Hasil dihosting di Dropbox
Kode tidak dikunci:
sumber
Python
32,191188174171 (tidak ada perpustakaan)File WAV sangat sederhana. Ingin mencoba tanpa perpustakaan. Untuk beberapa alasan file-file saya sepertinya crash Windows Media Player. Waktu cepat
bekerjabug 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
n
dan pengambilan sampel 1000Hz. Info yang diedit di atas sesuai.Versi lama
sumber
C # ~ 485 byte
Menggunakan perpustakaan Wav.Net .
Dan inilah hasilnya.
Versi yang mudah dibaca,
sumber
C #
382333 byteTidak 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:
Dengan komentar:
sumber
.wav
, sehingga Anda dapat menyimpan 4 byte di sana.SuperCollider ,
625605 bytePengiriman bahasa pemrograman audio!
Output ditulis ke file
b
dalam format AIFF. Windows Media Player gagal membukanya, tetapi berfungsi baik di VLC media player. File yang dihasilkana
adalah file OSC .Saya membuat beberapa fungsi SuperCollider:
f
menghasilkan bunyi bipg
pendek, istirahat pendek,h
bip panjang dani
istirahat 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\w
Definisi 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:
Hasil dihosting di Dropbox
Kode dengan lekukan:
sumber
ChucK -
1195217201147145144ChucK adalah bahasa pemrograman audio. bitpwner membantu saya menurunkan ini dari 201 byte menjadi 147 byte.
Berikut ini tautan langsung ke SoundCloud jika pemutar tertanam tidak berfungsi untuk Anda.
sumber
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;}
j
untuk menghindari array?1016835
dalam biner adalah11111000010000000011
.j
ada hanya untuk melacak jeda antara setiap digit2015
(setiap digit memiliki 5 suara).Csound, 140 + 40 = 180
Bahasa pemrograman audio.
Ini adalah file Orchestra:
dan ini adalah file Score:
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:
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!
sumber
brainfuck , 649 byte
Ini menghasilkan urutan 8 bit sampel yang tidak ditandatangani yang dapat diputar pada 8000 sampel per detik dengan alat seperti
aplay
di Linux. Kredit ke tabel konstanta BF .Cobalah online!
Agak kurang golf
sumber