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!
Rubinowy, 106 bajtów
To było fajne. Nie jestem pewien, dlaczego nikt tego nie próbował.
Ta funkcja przyjmuje dane wejściowe jako cztery argumenty tablicowe i zwraca tablicę ciągów, po jednym dla każdej linii wykresu.
Uwaga: To arbitralnie zakłada, że nie będzie więcej niż 10 000 tyknięć. Jeśli uruchomisz go w swoim terminalu, sugeruję podłączenie go w celu
less
przewijania w poziomie. Możesz zmienić,1e4
jeśli chcesz więcej tyknięć, aż do9e9
, ale zajmie to terabajt lub dwa RAM.Zobacz na repl.it: https://repl.it/Cx4I/1
źródło
Python 2,
163160156145 bajtówTo nie jest najlepszy sposób na golfa, ale był to jeden z najprostszych. Gdybym mógł wymyślić, jak zamieniać części ciągów bez przekształcania ich w listy, zastępowania i przekształcania ich z powrotem w ciągi, byłoby to bardzo pomocne w tym przypadku. Sugestie dotyczące gry w golfa mile widziane.
Edycja: 18 bajtów dzięki Dziurawej Zakonnicy. Wypróbuj na Ideone !
źródło
str.sub(/(?<=.{20}).{3}/,"foo")
jest równoważnestr[20,3] = "foo"
. Oczywiście oznacza to konstruowanie wyrażenia regularnego przez interpolację / łączenie łańcucha ze zmiennymi index / length - co jest tanie w bajtach Rubiego, ale może nie w Pythonie.Japt , 65 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako listę notatek w formacie
[pitch, start_tick, end_tick, velocity]
. Jeśli przyjmowanie danych wejściowych jako osobnych list jest obowiązkowe (tj. Jedna lista zawierająca wszystkie wysokości, jedna zawierająca wszystkie prędkości itp.), Można to zrobić kosztem 1 bajtu .Wyjaśnienie:
źródło