Latar Belakang
File MIDI sangat berbeda dari file audio WAV atau MP3. File MP3 dan WAV berisi byte yang mewakili "rekaman" audio, sementara file MIDI memiliki serangkaian pesan MIDI yang disimpan dalam acara MIDI yang menginformasikan synthesizer MIDI instrumen virtual mana yang akan diputar atau MIDI sequencer tempo pemutaran yang harus digunakan. Pesan-pesan ini disimpan dalam trek, dan koleksi trek membentuk urutan MIDI, yang acara-acaranya dapat dianalisis oleh sequencer dan pesannya dikirim dari sequencer ke penerima synthesizer.
Sebagian besar waktu pesan MIDI yang disimpan dalam acara MIDI adalah pesan Note On yang memberi tahu synthesizer untuk memainkan note tertentu, atau pesan Note Off yang memerintahkan synthesizer untuk berhenti memainkan note. Pesan-pesan ini mengandung dua byte data, yang pertama menginformasikan synthesizer dari kecepatan not (kecepatan yang lebih tinggi menghasilkan not yang lebih keras), dan yang kedua memberitahu synthesizer not untuk dimainkan (yaitu Middle C). Peristiwa itu sendiri juga mengandung kutu yang melayani tujuan memberi tahu sequencer kapan harus mengirim pesan.
Tantangan
Tantangannya adalah untuk menulis program lengkap atau fungsi yang menganalisis serangkaian pesan Note On dan Note Off dalam urutan MIDI single-track dan output ke STDOUT bagan yang menunjukkan kapan catatan tertentu hidup, ketika mereka mati, dan kecepatan catatan ini. Sumbu vertikal bagan mewakili nilai nada dan harus diberi label seperti yang dijelaskan di bawah ini, dan sumbu horizontal mewakili waktu dalam kutu MIDI (meskipun itu harus tetap tidak berlabel untuk mengurangi kompleksitas dan masalah spasi).
Input Anda mungkin empat array atau daftar terpisah, masing-masing berisi serangkaian nilai integer; array atau daftar dua dimensi yang berisi empat sub-array / sub-daftar dengan serangkaian nilai integer; atau cara lain yang nyaman; ini mewakili koleksi acara MIDI dengan pesan Note On dan Note Off di trek. Nilai dalam array pertama menentukan catatan, yang kedua kecepatan, yang ketiga catatan pada centang acara, dan yang keempat catatan dari centang centang acara. Misalnya, diberikan empat array seperti ini:
{60, 62, 64, 65, 67}
{20, 40, 60, 80, 100}
{ 0, 4, 8, 12, 16}
{ 2, 6, 10, 14, 18}
Menganalisis elemen pertama dari setiap array memberikan dua peristiwa: peristiwa pada tick 0 dengan pesan yang memiliki perintah Note On, note 60 (Middle C), dan kecepatan note 20; dan acara pada tick 2 dengan pesan yang memiliki perintah Note Off dengan nada dan kecepatan yang sama.
Aturan
Bagan tersebut harus menampilkan angka 0 hingga 127 yang ditampilkan dalam urutan menurun di sisi kiri (mewakili nilai not), ketika not dimulai, durasi setiap not (tick Nonaktif dikurangi tick Non aktif), dan kecepatan nada. Simbol yang mewakili catatan tergantung pada kecepatannya:
- 0-15:
O
- 16-31:
=
- 32-47:
#
- 48-63:
-
- 64-79:
@
- 80-95:
+
- 96-111:
0
- 112-127:
*
Anda dapat mengasumsikan sebagai berikut:
- Nilai untuk catatan dan kecepatan akan berada dalam kisaran [0, 127].
- Panjang masing-masing dari empat array akan selalu sama satu sama lain.
Berikut ini beberapa contoh:
{60, 62, 64, 65, 67}
{20, 40, 60, 80, 100}
{ 0, 4, 8, 12, 16}
{ 2, 6, 10, 14, 18}
127|
126|
125|
...
67 | 00
66 |
65 | ++
64 | --
63 |
62 | ##
61 |
60 |==
59 |
...
2 |
1 |
0 |
{60, 48, 62, 47, 64, 45, 65, 43, 67, 41, 65, 43, 64, 45, 62, 47, 60, 48}
{63, 31, 75, 90, 12, 23, 122, 104, 33, 19, 57, 42, 5, 82, 109, 86, 95, 71}
{0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16}
{2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 18, 18}
127|
126|
...
68 |
67 | ##
66 |
65 | ** --
64 | OO OO
63 |
62 | @@ 00
61 |
60 |-- ++
59 |
...
49 |
48 |== @@
47 | ++ ++
46 |
45 | == ++
44 |
43 | 00 ##
42 |
41 | ==
40 |
...
1 |
0 |
Berikut adalah contoh yang menampilkan beberapa catatan pertama Ode to Joy:
{48, 55, 64, 64, 65, 67, 55, 67, 65, 64, 62, 52, 55, 60, 60, 62, 64, 55, 64, 62, 62}
{45, 45, 63, 63, 63, 63, 89, 66, 66, 66, 66, 30, 30, 103, 103, 103, 103, 127, 55, 55, 55}
{ 0, 0, 0, 4, 8, 12, 16, 16, 20, 24, 28, 32, 32, 32, 36, 40, 44, 48, 48, 54, 56}
{16, 16, 2, 6, 10, 14, 32, 18, 22, 26, 30, 48, 48, 34, 38, 42, 46, 64, 50, 55, 64}
127|
...
67 | -- @@
66 |
65 | -- @@
64 |-- -- @@ 00 --
63 |
62 | @@ 00 - --------
61 |
60 | 00 00
59 |
58 |
57 |
56 |
55 |################++++++++++++++++================****************
54 |
53 |
52 | ================
51 |
50 |
49 |
48 |################
...
0 |
Anda dapat mengurangi skor Anda hingga 25% jika kiriman Anda menggunakan urutan MIDI yang sebenarnya sebagai input, menganalisis pesan Note On dan Note Off dari trek apa pun yang Anda pilih asalkan berisi setidaknya empat peristiwa dengan pesan Note On dan Note Off, dan output grafik seperti yang dijelaskan di atas.
Ini kode golf, jadi kode terpendek menang. Semoga berhasil!
Ruby, 106 byte
Ini sangat menyenangkan. Saya tidak yakin mengapa tidak ada yang mencobanya.
Fungsi ini mengambil input sebagai empat argumen array dan mengembalikan array string, satu untuk setiap baris grafik.
Catatan: Ini secara sewenang-wenang mengasumsikan bahwa tidak akan ada lebih dari 10.000 kutu. Jika Anda menjalankannya di terminal, saya sarankan untuk memipainya
less
agar Anda dapat menggulir secara horizontal. Anda dapat mengubah1e4
jika Anda menginginkan lebih banyak kutu9e9
, namun, itu akan membutuhkan satu atau dua terabyte RAM.Lihat di repl.it: https://repl.it/Cx4I/1
sumber
Python 2,
163160156145 byteIni bukan cara golf untuk melakukannya, tetapi itu adalah salah satu yang paling sederhana. Jika saya bisa mencari cara untuk mengganti bagian-bagian string tanpa mengubahnya menjadi daftar, mengganti, dan mengubahnya kembali menjadi string, itu akan sangat membantu di sini. Saran bermain golf diterima.
Sunting: 18 bytes berkat Leaky Nun. Cobalah di Ideone !
sumber
str.sub(/(?<=.{20}).{3}/,"foo")
denganstr[20,3] = "foo"
. Tentu saja, itu berarti membangun regexp dengan interpolasi string / penggabungan dengan variabel indeks / panjang — yang murah dalam byte Ruby, tetapi mungkin tidak dalam Python.Japt , 65 byte
Cobalah online!
Mengambil input sebagai daftar catatan dalam format
[pitch, start_tick, end_tick, velocity]
. Jika mengambil input sebagai daftar terpisah adalah wajib (yaitu satu daftar yang berisi semua pitch, satu berisi semua kecepatan dll), yang dapat dicapai dengan biaya 1 byte .Penjelasan:
sumber