sfondo
I file MIDI sono abbastanza diversi dai file audio WAV o MP3. I file MP3 e WAV contengono byte che rappresentano una "registrazione" dell'audio, mentre i file MIDI hanno una serie di messaggi MIDI memorizzati in eventi MIDI che informano un sintetizzatore MIDI quale strumento virtuale riprodurre o un sequencer MIDI il tempo di riproduzione che dovrebbe essere usato. Questi messaggi sono memorizzati in tracce e una raccolta di tracce costituisce una sequenza MIDI, i cui eventi possono essere analizzati da un sequencer e trasmessi i suoi messaggi dal sequencer al ricevitore di un sintetizzatore.
Il più delle volte i messaggi MIDI memorizzati negli eventi MIDI sono messaggi Note On che indicano al sintetizzatore di suonare una nota particolare o messaggi Note Off che dicono al sintetizzatore di interrompere l'esecuzione della nota. Questi messaggi contengono due byte di dati, il primo dei quali informa il sintetizzatore della velocità della nota (una velocità più elevata produce una nota più forte) e il secondo indica al sintetizzatore la nota da suonare (ovvero il C centrale). Gli eventi stessi contengono anche segni di spunta che servono allo scopo di dire al sequencer quando inviare i messaggi.
La sfida
La sfida è scrivere un programma completo o una funzione che analizzi una serie di messaggi MIDI Note On e Note Off in una sequenza MIDI a traccia singola e trasmetta a STDOUT un grafico che mostri quando sono attive determinate note, quando sono spente, e il velocità di queste note. L'asse verticale del grafico rappresenta il valore della nota e deve essere etichettato come descritto di seguito, mentre l'asse orizzontale rappresenta il tempo in tick MIDI (anche se dovrebbe rimanere senza etichetta per ridurre la complessità e i problemi di spaziatura).
I dati immessi possono essere quattro matrici o elenchi separati, ciascuno contenente una serie di valori interi; una matrice o lista bidimensionale contenente quattro sotto-matrici / sotto-liste con una serie di valori interi; o qualsiasi altro mezzo conveniente; questo rappresenta gli eventi MIDI della raccolta con i messaggi Note On e Note Off nella traccia. I valori nel primo di questi array specificano la nota, la seconda la velocità, la terza la nota sul tick dell'evento e la quarta il tick dell'evento sulla nota. Ad esempio, dati quattro array come questi:
{60, 62, 64, 65, 67}
{20, 40, 60, 80, 100}
{ 0, 4, 8, 12, 16}
{ 2, 6, 10, 14, 18}
Analizzando il primo elemento di ciascun array si ottengono due eventi: un evento con tick 0 con un messaggio che ha un comando Note On, nota 60 (Middle C) e una velocità nota di 20; e un evento al segno di spunta 2 con un messaggio che ha un comando Note Off con la stessa nota e velocità.
Regole
Il grafico dovrebbe presentare i numeri da 0 a 127 visualizzati in ordine decrescente sul lato sinistro (che rappresenta il valore della nota), quando inizia la nota, la durata di ciascuna nota (nota disattivata meno Nota su attiva) e la velocità della nota. I simboli che rappresentano le note dipendono dalla loro velocità:
- 0-15:
O
- 16-31:
=
- 32-47:
#
- 48-63:
-
- 64-79:
@
- 80-95:
+
- 96-111:
0
- 112-127:
*
Puoi assumere quanto segue:
- I valori per nota e velocità saranno compresi nell'intervallo [0, 127].
- Le lunghezze di ciascuna delle quattro matrici saranno sempre uguali tra loro.
Ecco alcuni esempi:
{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 |
Ecco un esempio che mostra le prime note di 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 |
Puoi ridurre il tuo punteggio del 25% se l'invio prende una sequenza MIDI effettiva come input, analizza i messaggi Note On e Note Off di qualsiasi traccia di tua scelta purché contenga almeno quattro eventi con messaggi Note On e Note Off e output un grafico come descritto sopra.
Questo è il codice golf, quindi vince il codice più breve. In bocca al lupo!