Фон
MIDI-файли сильно відрізняються від аудіофайлів WAV або MP3. Файли MP3 та WAV містять байти, що представляють собою "запис" аудіо, тоді як файли MIDI мають ряд повідомлень MIDI, що зберігаються в подіях MIDI, інформуючи синтезатор MIDI, який віртуальний інструмент для відтворення або MIDI-секвенсор, темп відтворення, який слід використовувати. Ці повідомлення зберігаються у доріжках, а колекція треків складає послідовність MIDI, події яких можуть бути проаналізовані секвенсером та передавати повідомлення від секвенсера до приймача синтезатора.
Більшу частину часу повідомлення MIDI, що зберігаються в подіях MIDI, - це повідомлення Note On, які сповіщають синтезатор відтворювати певну ноту, або повідомлення Note Off, які сповіщають синтезатор припинити відтворення ноти. Ці повідомлення містять два байти даних, перший з яких інформує синтезатор про швидкість ноти (більша швидкість призводить до більш гучної ноти), а другий з них повідомляє синтезатору грати ноту (тобто середню C). Самі події також містять галочки, які служать для того, щоб сказати секвенсору, коли надсилати повідомлення.
Змагання
Завдання полягає в тому, щоб написати повну програму або функцію, яка аналізує серію повідомлень Note On і Note Off MIDI в одноколійній послідовності MIDI і виводить STDOUT на графік, який показує, коли конкретні нотатки включені, коли вони вимкнено, і швидкість цих нот. Вертикальна вісь діаграми представляє значення примітки і має бути позначена як описано нижче, а горизонтальна вісь відображає час у кліщах MIDI (хоча вона повинна залишатися не маркованою, щоб зменшити проблеми складності та інтервалу).
Ваш вхід може бути чотирма окремими масивами або списками, кожен з яких містить ряд цілих значень; двовимірний масив або список, що містить чотири підмасиви / підсписи з низкою цілих значень; або будь-який інший зручний спосіб; це відображає події MIDI колекції з повідомленнями On On та Note Off у треку. Значення в першому з цих масивів вказують на замітку, у другому - швидкість, на третьому - примітку про позначку події та на четвертому відмітку про подію примітки. Наприклад, дано чотири масиви, такі як цей:
{60, 62, 64, 65, 67}
{20, 40, 60, 80, 100}
{ 0, 4, 8, 12, 16}
{ 2, 6, 10, 14, 18}
Аналіз першого елемента кожного масиву дає дві події: подія під галочкою 0 з повідомленням, яке містить команду Note On, примітка 60 (середня C) та швидкість примітки 20; і подія біля галочки 2 із повідомленням, яке має команду Note Off із такою самою приміткою та швидкістю.
Правила
На діаграмі повинні бути цифри від 0 до 127, що відображаються у порядку зменшення ліворуч (представляючи значення нотатки), коли починається нотатка, тривалість кожної ноти (примітка Вимкнено галочку мінус Примітка на галочку) та швидкість нотатки. Символи, що представляють ноти, залежать від їх швидкості:
- 0-15:
O
- 16-31:
=
- 32-47:
#
- 48-63:
-
- 64-79:
@
- 80-95:
+
- 96-111:
0
- 112-127:
*
Ви можете припустити наступне:
- Значення для ноти і швидкості будуть в межах [0, 127].
- Довжина кожного з чотирьох масивів завжди буде однаковою.
Ось кілька прикладів:
{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 |
Ось приклад, який відображає перші кілька нот «Ода радістю»:
{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 |
Ви можете знизити свій показник на 25%, якщо ваша заявка приймає фактичну послідовність MIDI як вхід, аналізує повідомлення Note On і Note Off будь-якої доріжки за вашим вибором, за умови, що вона містить щонайменше чотири події з повідомленнями Note On і Note Off, а також виходи діаграму, як описано вище.
Це кодовий гольф, тому найкоротший код виграє. Удачі!