พื้นหลัง
ไฟล์ MIDI นั้นค่อนข้างแตกต่างจากไฟล์เสียง WAV หรือ MP3 ไฟล์ MP3 และ WAV ประกอบด้วยไบต์ที่แสดงถึง "การบันทึก" ของเสียงในขณะที่ไฟล์ MIDI มีชุดข้อความ MIDI ที่เก็บไว้ในเหตุการณ์ MIDI แจ้งให้เครื่องสังเคราะห์ MIDI ทราบว่าเครื่องมือเสมือนใดที่จะเล่นหรือเครื่องมือเล่น MIDI จังหวะการเล่นที่ควรใช้ ข้อความเหล่านี้ถูกเก็บไว้ในแทร็กและชุดของแทร็กประกอบขึ้นเป็นลำดับ MIDI ซึ่งสามารถวิเคราะห์เหตุการณ์โดยซีเควนเซอร์และส่งข้อความจากซีเควนเซอร์ไปยังเครื่องรับซินธิไซเซอร์
เวลาส่วนใหญ่ข้อความ MIDI ที่เก็บไว้ในเหตุการณ์ MIDI คือหมายเหตุบนข้อความที่บอกให้ซินธิไซเซอร์เล่นโน้ตเฉพาะหรือข้อความปิดข้อความซึ่งบอกให้ซินธิไซเซอร์หยุดเล่นโน้ต ข้อความเหล่านี้มี data data สอง bytes สิ่งแรกที่แจ้งให้ synthesizer ของ speed ของ note (ความเร็วที่สูงขึ้นส่งผลให้ note ดังขึ้น) และวินาทีที่ synthesizer note บอกให้เล่น (เช่น Middle C) เหตุการณ์เองยังมีเห็บที่ทำหน้าที่ในการบอกซีเควนเมื่อจะส่งข้อความ
ความท้าทาย
ความท้าทายคือการเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่วิเคราะห์ชุดของ Note On และ Note Off ข้อความ MIDI ในลำดับ MIDI แทร็กเดี่ยวและส่งออกไปยัง STDOUT แผนภูมิที่แสดงเมื่อเปิดบันทึกย่อเมื่อปิดและ ความเร็วของบันทึกเหล่านี้ แกนแนวตั้งของแผนภูมิแสดงถึงค่าบันทึกและควรติดป้ายตามที่อธิบายไว้ด้านล่างและแกนแนวนอนแสดงเวลาในเห็บ MIDI (แม้ว่ามันจะยังคงไม่มีป้ายกำกับเพื่อลดความซับซ้อนและปัญหาระยะห่าง)
ข้อมูลของคุณอาจเป็นสี่อาร์เรย์หรือรายการที่แยกจากกันแต่ละรายการมีชุดของค่าจำนวนเต็ม อาร์เรย์สองมิติหรือรายการที่มีอาร์เรย์ย่อย / รายการย่อยสี่ชุดพร้อมชุดค่าจำนวนเต็ม หรือวิธีการอื่นใดที่สะดวกสบาย สิ่งนี้แสดงถึงเหตุการณ์ MIDI ของคอลเลกชันที่มีข้อความ Note 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, note 60 (Middle C), และ speed velocity ที่ 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 |
นี่คือตัวอย่างที่แสดงหมายเหตุแรก ๆ ของ 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 |
คุณสามารถลดคะแนนของคุณลง 25%หากการส่งของคุณใช้ลำดับ MIDI จริงเป็นอินพุตวิเคราะห์ข้อความบันทึกย่อและปิดข้อความของแทร็คที่คุณเลือกหากมีอย่างน้อยสี่เหตุการณ์ด้วยข้อความเปิดและปิดหมายเหตุและเอาต์พุต แผนภูมิตามที่อธิบายไว้ข้างต้น
นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดจึงชนะ โชคดี!