Sound synthesizer menggunakan generator amplop untuk mengontrol bagaimana parameter tertentu dari suara (seperti kenyaringan keseluruhan) berubah seiring waktu. Dalam banyak synthesizer, sebuah amplop didefinisikan oleh empat parameter, seperti diwakili dalam gambar berikut dari Wikipedia :
- Attack time (A) : waktu yang dibutuhkan amplop untuk mencapai level maksimumnya, mulai dari nol, ketika tombol pertama kali ditekan.
- Decay time (D) : waktu yang dibutuhkan amplop untuk mencapai level penopang yang ditentukan.
- Sustain level (S) : level yang dipertahankan, setelah serangan awal dan pembusukan, selama kunci ditekan.
- Waktu rilis (R) : waktu yang dibutuhkan amplop untuk mencapai nol ketika kunci dilepaskan.
Tantangan
Masukkan empat parameter A, D, S, R dan plot amplop .
Parameter akan berupa nilai integer dari 0 hingga 127 .
The tingkat maksimum (mencapai pada akhir fase serangan) akan diasumsikan 127 .
The segmen horisontal di mempertahankan tingkat akan diasumsikan memiliki durasi 64 (dalam suara yang sebenarnya durasi ini tidak tetap, tetapi ditentukan oleh jumlah waktu bahwa kunci dipegang).
Format dan detail lebih lanjut
Outputnya harus berupa gambar dalam format raster atau vektor. Jika raster, garis poligonal harus menempati setidaknya 50 piksel secara vertikal.
Gambar dapat ditampilkan atau diproduksi sebagai file dalam format gambar standar. File dapat ditulis ke disk, atau kontennya dapat berupa output, baik ke STDERR atau sebagai argumen pengembalian fungsi.
Grafik hanya perlu berisi garis poligonal yang mendefinisikan amplop. Skala setiap sumbu dapat dipilih secara bebas. Elemen lain seperti garis sumbu, label numerik atau warna garis adalah opsional.
Sarana input dan format fleksibel seperti biasa. Misalnya, Anda dapat mengambil empat angka dalam urutan apa pun, atau array yang mengandungnya. Program atau fungsi dapat disediakan. Celah standar dilarang.
Kode terpendek dalam byte menang.
Uji kasus
Input dalam format [A D S R]
. Perhatikan bahwa skala berbeda di setiap gambar (sesuai dengan aturan bahwa skala dapat dipilih secara bebas)
[15 30 70 40]
[64 64 64 64]
[0 10 50 80]
[0 0 90 80]
[5 50 0 0]
[5 50 0 80]
[24 32 127 48]
sumber
Jawaban:
MATL,
3122 byteMenerima empat input terpisah memerintahkan sebagai
A
,D
,R
,S
Cobalah di MATL Online
Penjelasan
sumber
TikZ,
195193181177172167163160159 byteTerima kasih kepada David Carlisle untuk jawabannya yang bermanfaat di sini
Ya, Anda dengar benar TikZ .
Penjelasan
Ini menggunakan beberapa teknik untuk mencapai tujuannya. Yang pertama adalah input. Kebanyakan orang mungkin tidak tahu bahwa L A T E X dapat mengambil input. Yah, bisa. Ini dicapai dengan perintah
\typein
. Ini akan menghentikan kompiler dan meminta input dari pengguna saat menetapkannya ke variabel.Teknik utama lainnya adalah penggunaan
\def
.\def
di Tikz sangat kuat. Ini pada dasarnya mendefinisikan sepotong kode dan menempelkannya di mana pun Anda memanggil variabel. Dalam kode ini kita mendefinisikan dua hal\typein[#1]{}
sehingga kita dapat menetapkan variabel kita dengan golfily dan)--(\a+\d
karena kode ini muncul beberapa kali dalam versi yang tidak dikenali.Berikut adalah dua versi kode (tanpa bungkus):
Golf:
Tidak Disatukan:
Gambar:
Karena saya tidak dapat mengunggah gambar pdf secara langsung, dan mengonversinya ke format lain apa pun tampaknya menyebabkan garis tersebut menghilang sama sekali, inilah yang tampak seperti gambar ketika dibuka di Pratinjau (masukan untuk gambar ini
[64 64 64 64]
):Seperti yang Anda lihat itu sangat tipis. Namun karena ini adalah gambar PDF dan bukan gambar raster tidak harus memenuhi persyaratan ketebalan.
sumber
input tikz\begin{document}
bekerjapdflatex adsr.tex
sepertinya tidak berhasil. - Oh, tunggu, itu berhasil, saya hanya tidak berharap itu akan meminta input interaktif!Python 2,
838079 byteCobalah online (versi 83-byte, karena berjalan online)
Perhatikan bahwa output tertentu mungkin tidak sepenuhnya terlihat menggunakan Trinket, karena cara kanvas bekerja. Anda harus mengunduh dan menginstal Python jika Anda ingin itu berfungsi lebih baik.
Tidak Disatukan:
Versi ini tidak berfungsi di Trinket, karena Trinket tidak mendukung nilai pembongkaran input.
sumber
map
dalam Python 2:lambda A,D,S,R:map(goto,[A,A+D,A+D+64,A+D+R+64],[127,S,S,0])
SuspensionError: Cannot call a function that blocks or suspends here on line undefined in main.py
Trinket. Sudahkah Anda mengonfirmasi bahwa itu berhasil? Saya tidak yakin apakah kesalahannya unik untuk Perhiasan Kecil atau tidak.Mathematica,
6158 byte
adalah operator untukTranspose
dan diterjemahkan sebagai superskripT
oleh Mathematica.Mengambil argumen dalam urutan
S, R, A, D
dan mengembalikan objek grafik vektor.Hasil untuk semua tujuh kasus uji:
Klik untuk versi yang lebih besar.
sumber
ListLinePlot
:) Dan adaListStepPlot
juga — sangat berguna!R,
6663 byteMenampilkan gambar, dengan lab sumbu sedang
cumsum(c(0,A,D,64,R))
danc(0,127,S,S,0)
, juga garis sumbu dan label numerik.Terima kasih kepada @Zahiro Mor karena telah mengurangi 3 byte !
Jawaban sebelumnya:
sumber
cumsum(c(0,A,D,64,R))
untuk mengganti istilah pertama dalam plot. dengan cumsum Anda tidak akan memerlukan trik b dan masih mencukur 3 byte :)function(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Matlab, 50 byte
Ini menghasilkan fungsi anonim "ans" yang harus disebut sebagai ans (A, D, S, R).
sumber
JavaScript (ES6) + HTML, 126 + 23 = 149
Mengambil input satu per satu secara berurutan
A, S, D, R
.sumber
JavaScript (ES6),
114111 byteMengembalikan gambar SVG yang cocok untuk
innerHTML
. Tambahkan 18 byte untuk XML yang valid.sumber
<input>
s?64,64,64,64
. Biasanya saya akan membuat hardcode output yang benar untuk input default, tapi saya melihat bagaimana itu akan sulit di sini ...Haskell,
112110 byteContoh penggunaan:
(0#10) 50 80
.Ini menggunakan
Gloss
perpustakaan. Thedisplay
Fungsi mengharapkan jendela untuk plot di (di sini: jendela tanpa judul (""
), ukuran 600x300, posisi(0,0)
pada desktop), warna background (red
) dan gambar penyihir garis sepanjang jalan yang dibuat oleh zipping jumlah kumulatif[0,a,d,64,r]
=[0,a,a+d,a+d+64,a+d+64+r]
sebagai x koordinat dan[0,127,s,s,0]
sebagai koordinat y.Sunting: Terima kasih @xnor untuk 2 byte!
sumber
scanl(+)0[a,d,64,r]
Memproses,
134108 + 14 (panggil kesize
) =148122 bytePertama-tama kita perlu panggilan ke
size
suatu tempat dalam program sehingga output akan muat di jendela (default pada 100x100).Dan inilah fungsi sebenarnya:
Sebut saja seperti
f(15,20,70,40);
Tangkapan layar
Jawaban saya yang lebih baru lebih mudah daripada jawaban yang lebih tua, tetapi saya lebih suka yang lebih tua (meskipun lebih besar).
Jawaban lama (148 byte)
dan dua fungsi
Sebut seperti
f(int_array_containing_values);
dan hasilnya akan terlihat seperti:f(new int[]{15,20,70,40});
sumber
SmileBASIC, 90 byte
sumber
PHP,
149130 bytemengambil input dari argumen baris perintah, menulis gambar (PNG dengan grafik biru hitam) ke stdout. Membutuhkan PHP 7.1 atau lebih baru.
penggunaan misalnya
+4 byte untuk PHP yang lebih lama: Ganti
[,$a,$d,$s,$r]
denganlist(,$a,$d,$s,$r)
.Ada retasan kecil di sana: alih-alih menggunakan
imageopenpolygon
untuk menyembunyikan garis dasar, garis akhir poligon diambil di luar kanvas. (y = 127 hanya akan ditampilkan pada gambar dengan tinggi> = 128.)Saya bisa menyimpan lebih banyak dengan warna 99 atau 9 bukannya 999; tapi itu cukup sulit untuk dilihat pada warna hitam. :)
sumber
Bash + grace , 70 byte
Script menulis untuk mengarsipkan
f
koordinat setiap titik, dan xmgrace (versi GUI) membaca file dan menampilkan plot menggunakan garis secara default.Jalankan :
Output: (layar cetak)
Saya pikir ini bisa dilakukan secara langsung oleh skrip anugerah, jika dapat menerima input, tapi saya tidak terbiasa dengan sintaksnya. Saya akan memeriksanya.
Penjelasan:
sumber
Pergi,
947915506 byteIni masih jauh dari optimal, mencoba mempelajari bahasa sambil berpartisipasi dalam pertanyaan-pertanyaan ini. Jangan ragu untuk menunjukkan apa yang bisa saya lakukan.
Kental:
Tanpa syarat:
sumber
dc, 120 byte
Awalnya saya pikir saya tidak bisa menjawab dalam dc, tetapi saya melihat bahwa mencetak sintaks dari gambar vektor diperbolehkan.
Kode menghitung koordinat yang diterjemahkan dari setiap titik dan menghasilkan sintaks SVG untuk plot. Karena editor gambar memiliki asal di sudut kiri atas, saya harus mengurangi
y
nilai dariheight
, 127 dalam kasus ini, sehingga gambar ditampilkan seolah-olah asal di sudut kiri bawah.Jalankan contoh: atau Cobalah Online!
Keluaran:
Untuk menampilkan plot gambar, simpan output yang tepat ke file dan buka dengan Gimp, misalnya, atau masukkan teks dalam halaman html seperti yang saya lakukan di atas.
Penjelasan:
dc
adalah reverse-polish d esk c alculator bahasa tumpukanScript ini merupakan rangkaian panjang dari sintaksis SVG. Kata kunci
M
berarti pindah untuk berkoordinasi danL
singkatan dari garis tarik dari posisi saat ini ke koordinat yang diberikan .sumber