배경
MIDI 파일은 WAV 또는 MP3 오디오 파일과 상당히 다릅니다. MP3 및 WAV 파일에는 오디오의 "레코딩"을 나타내는 바이트가 포함되어있는 반면, MIDI 파일에는 MIDI 신시사이저에게 어떤 가상 악기를 연주해야하는지 또는 MIDI 시퀀서에게 사용해야하는 재생 템포를 알려주는 MIDI 이벤트에 저장된 일련의 MIDI 메시지가 있습니다. 이 메시지는 트랙에 저장되며 트랙 모음은 MIDI 시퀀스를 구성하며,이 시퀀스의 이벤트는 시퀀서로 분석 할 수 있으며 시퀀서에서 신시사이저의 수신기로 메시지를 전송합니다.
MIDI 이벤트에 저장된 MIDI 메시지는 대부분 신디사이저에게 특정 음을 연주하라고 알려주는 Note On 메시지 또는 신디사이저가 음표 연주를 중지하도록 지시하는 Note Off 메시지입니다. 이 메시지는 두 개의 데이터 바이트를 포함하는데, 첫 번째 바이트는 신디사이저에 음의 속도를 알려주고 (높은 속도로 인해 더 큰 음이 나옵니다), 두 번째는 신시사이저에 음을 연주하도록 알려줍니다 (즉, 중간 C). 이벤트 자체에는 시퀀서에게 메시지를 보낼시기를 알려주는 틱도 포함됩니다.
도전
문제는 전체 트랙 또는 일련의 음표 켜짐 및 음표 꺼짐 MIDI 메시지를 단일 트랙 MIDI 시퀀스로 분석하고 특정 음표가 켜져있을 때, 꺼져있을 때를 나타내는 차트를 STDOUT에 출력하는 기능 또는 전체 프로그램을 작성하는 것입니다. 이 음의 속도. 차트의 세로 축은 음표 값을 나타내며 아래에 설명 된대로 레이블을 지정해야하며 가로 축은 시간을 MIDI 틱 단위로 나타냅니다 (복잡성과 간격 문제를 줄이기 위해 레이블이없는 상태로 유지해야 함).
입력은 각각 일련의 정수 값을 포함하는 4 개의 개별 배열 또는 목록 일 수 있습니다. 일련의 정수 값을 갖는 4 개의 서브 어레이 / 서브리스트를 포함하는 2 차원 어레이 또는리스트; 또는 다른 편리한 수단; 트랙의 음표 켜짐 및 음표 꺼짐 메시지가있는 컬렉션 MIDI 이벤트를 나타냅니다. 이 배열의 첫 번째 값은 음표, 두 번째 속도, 세 번째 음표 켜짐 이벤트 틱 및 네 번째 음표 꺼짐 이벤트 틱을 지정합니다. 예를 들어 다음과 같은 4 개의 배열이 있습니다.
{60, 62, 64, 65, 67}
{20, 40, 60, 80, 100}
{ 0, 4, 8, 12, 16}
{ 2, 6, 10, 14, 18}
각 배열의 첫 번째 요소를 분석하면 다음과 같은 두 가지 이벤트가 발생합니다. Note On 명령, Note 60 (중간 C) 및 20의 음표 속도를 가진 메시지가있는 tick 0의 이벤트; 그리고 동일한 음과 속도로 음표 꺼짐 명령이있는 메시지가있는 틱 2의 이벤트.
규칙
차트에는 왼쪽에 순서대로 내림차순으로 표시되는 0에서 127까지의 숫자 (음표 값을 나타냄), 음표가 시작될 때 각 음표의 지속 시간 (음표 꺼짐 눈금에서 음표 켜짐 눈금) 및 음표 속도가 표시되어야합니다. 음표를 나타내는 기호는 속도에 따라 다릅니다.
- 0-15 :
O
- 16-31 :
=
- 32-47 :
#
- 48-63 :
-
- 64-79 :
@
- 80-95 :
+
- 96-111 :
0
- 112-127 :
*
다음을 가정 할 수 있습니다.
- 음표 및 속도 값은 [0, 127] 범위 내에 있습니다.
- 4 개의 배열 각각의 길이는 항상 서로 동일합니다.
몇 가지 예는 다음과 같습니다.
{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 |
다음은 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 |
제출물이 실제 MIDI 시퀀스를 입력으로 취하고 선택한 트랙의 음표 켜짐 및 음표 꺼짐 메시지를 분석하면 음표 켜짐 및 음표 꺼짐 메시지가있는 이벤트가 4 개 이상 있고 출력이있는 경우 점수를 25 % 줄일 수 있습니다 위에서 설명한 차트.
이것은 코드 골프이므로 가장 짧은 코드가 승리합니다. 행운을 빕니다!