tło
Pliki MIDI różnią się od plików audio WAV lub MP3. Pliki MP3 i WAV zawierają bajty reprezentujące „nagranie” dźwięku, podczas gdy pliki MIDI zawierają szereg komunikatów MIDI przechowywanych w zdarzeniach MIDI informujących syntezator MIDI, który instrument wirtualny grać lub sekwencer MIDI o tempie, które należy zastosować. Wiadomości te są przechowywane w ścieżkach, a zbiór ścieżek tworzy sekwencję MIDI, której zdarzenia mogą być analizowane przez sekwencer, a ich wiadomości są przesyłane z sekwensera do odbiornika syntezatora.
W większości przypadków komunikaty MIDI przechowywane w zdarzeniach MIDI to komunikaty Note On, które każą syntezatorowi odtworzyć konkretną nutę, lub komunikaty Note Off, które informują syntezator, aby przestał odtwarzać nutę. Komunikaty te zawierają dwa bajty danych, z których pierwszy informuje syntezator o prędkości nuty (wyższa prędkość powoduje, że nuta jest głośniejsza), a drugi informuje syntezator o nucie do odtworzenia (tj. Środkowe C). Same zdarzenia zawierają również tiki, które służą do informowania sekwencera, kiedy wysłać wiadomości.
Wyzwanie
Wyzwanie polega na napisaniu pełnego programu lub funkcji, która analizuje serię komunikatów Note On i Note Off MIDI w jednościeżkowej sekwencji MIDI i wysyła do STDOUT tabelę pokazującą, kiedy poszczególne nuty są włączone, kiedy są wyłączone, oraz prędkość tych nut. Oś pionowa wykresu reprezentuje wartość nuty i powinna być oznaczona tak, jak opisano poniżej, a oś pozioma reprezentuje czas w znacznikach MIDI (chociaż powinna pozostać nieznakowana, aby zmniejszyć problemy ze złożonością i odstępami).
Dane wejściowe mogą być czterema oddzielnymi tablicami lub listami, z których każda zawiera szereg wartości całkowitych; dwuwymiarowa tablica lub lista zawierająca cztery podgrupy / podlisty z serią liczb całkowitych; lub w jakikolwiek inny dogodny sposób; reprezentuje to zdarzenia MIDI kolekcji z komunikatami Note On i Note Off na ścieżce. Wartości w pierwszej z tych tablic określają nutę, drugą prędkość, trzecią nutę przy tiku zdarzenia, a czwartą notę przy tiku zdarzenia. Na przykład, biorąc pod uwagę cztery tablice takie jak te:
{60, 62, 64, 65, 67}
{20, 40, 60, 80, 100}
{ 0, 4, 8, 12, 16}
{ 2, 6, 10, 14, 18}
Analiza pierwszego elementu każdej tablicy daje dwa zdarzenia: zdarzenie przy tyknięciu 0 z komunikatem zawierającym polecenie Note On, nota 60 (środek C) i prędkość nuty 20; oraz zdarzenie przy tyknięciu 2 z komunikatem zawierającym polecenie Note Off z tą samą nutą i prędkością.
Zasady
Na wykresie powinny znajdować się cyfry od 0 do 127 wyświetlane w malejącej kolejności po lewej stronie (reprezentujące wartość nuty), kiedy rozpoczyna się nuta, czas trwania każdej nuty (Uwaga Wyłącz tyknięcie minus Uwaga Włącz tyk) i prędkość nuty. Symbole reprezentujące nuty zależą od ich prędkości:
- 0–15:
O
- 16–31:
=
- 32–47:
#
- 48–63:
-
- 64–79:
@
- 80–95:
+
- 96-111:
0
- 112-127:
*
Możesz założyć, co następuje:
- Wartości nuty i prędkości będą w zakresie [0, 127].
- Długości każdej z czterech tablic zawsze będą sobie równe.
Oto kilka przykładów:
{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 |
Oto przykład, który wyświetla pierwsze nuty 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 |
Możesz obniżyć swój wynik o 25%, jeśli twoje zgłoszenie przyjmuje rzeczywistą sekwencję MIDI jako dane wejściowe, analizuje komunikaty Note On i Note Off dowolnej wybranej ścieżki, pod warunkiem, że zawiera co najmniej cztery zdarzenia z komunikatami Note On i Note Off, oraz wyniki wykres jak opisano powyżej.
To jest kod golfowy, więc wygrywa najkrótszy kod. Powodzenia!