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!