Lý lịch
Các tệp MIDI khá khác với các tệp âm thanh WAV hoặc MP3. Các tệp MP3 và WAV chứa các byte đại diện cho "bản ghi" âm thanh, trong khi các tệp MIDI có một loạt các thông điệp MIDI được lưu trữ trong các sự kiện MIDI thông báo cho trình tổng hợp MIDI nên sử dụng nhạc cụ ảo nào hoặc trình phát tuần tự MIDI nên sử dụng nhịp phát lại. Các thông báo này được lưu trữ trong các bản nhạc và một tập hợp các bản nhạc tạo thành một chuỗi MIDI, có các sự kiện có thể được phân tích bởi trình sắp xếp chuỗi và các thông điệp của nó được truyền từ trình phân tích đến bộ thu của bộ tổng hợp.
Hầu hết thời gian các tin nhắn MIDI được lưu trữ trong các sự kiện MIDI là các tin nhắn Note On cho phép trình tổng hợp phát một ghi chú cụ thể hoặc các tin nhắn Note Off báo cho bộ tổng hợp ngừng phát ghi chú. Các thông báo này chứa hai byte dữ liệu, trong đó thông báo đầu tiên thông báo cho bộ tổng hợp vận tốc của ghi chú (tốc độ cao hơn dẫn đến ghi chú to hơn) và thông báo thứ hai cho bộ tổng hợp ghi chú phát (ví dụ: Trung C). Bản thân các sự kiện cũng chứa các dấu tick phục vụ mục đích báo cho người sắp xếp biết khi nào nên gửi tin nhắn.
Các thách thức
Thách thức là viết một chương trình đầy đủ hoặc một chức năng phân tích một loạt các thông báo MIDI Bật và Lưu ý Tắt theo trình tự MIDI một bản nhạc và xuất ra STDOUT một biểu đồ hiển thị khi bật các ghi chú cụ thể, khi chúng tắt và vận tốc của các ghi chú. Trục dọc của biểu đồ biểu thị giá trị ghi chú và phải được dán nhãn như được mô tả bên dưới và trục ngang biểu thị thời gian trong dấu tick MIDI (mặc dù vậy nó vẫn không được gắn nhãn để giảm các vấn đề về độ phức tạp và khoảng cách).
Đầu vào của bạn có thể là bốn mảng hoặc danh sách riêng biệt, mỗi mảng chứa một chuỗi các giá trị nguyên; một mảng hoặc danh sách hai chiều chứa bốn mảng phụ / danh sách phụ với một loạt các giá trị nguyên; hoặc bất kỳ phương tiện thuận tiện khác; điều này thể hiện bộ sưu tập các sự kiện MIDI với các thông báo Note On và Note Off trong track. Các giá trị trong mảng đầu tiên chỉ định ghi chú, tốc độ thứ hai, ghi chú thứ ba về đánh dấu sự kiện và thứ tư là ghi chú tắt sự kiện. Chẳng hạn, đưa ra bốn mảng như sau:
{60, 62, 64, 65, 67}
{20, 40, 60, 80, 100}
{ 0, 4, 8, 12, 16}
{ 2, 6, 10, 14, 18}
Việc phân tích phần tử đầu tiên của mỗi mảng sẽ đưa ra hai sự kiện: một sự kiện tại tick 0 với thông báo có lệnh Note On, ghi chú 60 (Trung C) và tốc độ ghi chú là 20; và một sự kiện ở tick 2 với một thông báo có lệnh Note Off với cùng một ghi chú và vận tốc.
Quy tắc
Biểu đồ sẽ hiển thị các số từ 0 đến 127 được hiển thị theo thứ tự giảm dần ở phía bên trái (đại diện cho giá trị ghi chú), khi ghi chú bắt đầu, thời lượng của mỗi ghi chú (Ghi chú Tắt đánh dấu vào Ghi chú) và tốc độ của ghi chú. Các biểu tượng đại diện cho các ghi chú phụ thuộc vào vận tốc của chúng:
- 0-15:
O
- 16-31:
=
- 32-47:
#
- 48-63:
-
- 64-79:
@
- 80-95:
+
- 96-111:
0
- 112-127:
*
Bạn có thể giả sử như sau:
- Các giá trị cho ghi chú và vận tốc sẽ nằm trong phạm vi [0, 127].
- Độ dài của mỗi trong bốn mảng sẽ luôn bằng nhau.
Đây là vài ví dụ:
{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 |
Dưới đây là một ví dụ hiển thị một số ghi chú đầu tiên của 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 |
Bạn có thể giảm 25% số điểm của mình nếu bài gửi của bạn lấy chuỗi MIDI thực tế làm đầu vào, phân tích các thông báo Note On và Note Off của bất kỳ bản nhạc nào bạn chọn với điều kiện nó chứa ít nhất bốn sự kiện với tin nhắn Note On và Note Off, và đầu ra một biểu đồ như mô tả ở trên.
Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng. Chúc may mắn!