@ file : Suppress (" unused ") Ċ Ċ package Ġname . ats ush i eno . kt midi Ċ Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . lang . Index OutOfBoundsException Ċ Ċ internal Ġfun ĠByte . to Unsigned () Ġ= Ġif Ġ( this Ġ< Ġ 0 ) Ġ 2 5 6 Ġ+ Ġthis Ġelse Ġthis . toInt () Ċ Ċ internal Ġfun ĠOutputStream . write Byte ( b Ġ: ĠByte ) Ċ { ĊĠĠĠ Ġval Ġarr Ġ= Ġbyte ArrayOf ( b ) ĊĠĠĠ Ġthis . write ( arr , Ġ 0 , Ġ 1 ) Ċ } Ċ Ċ class ĠM idi Music Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġread Ġ( stream Ġ: ĠInputStream ) Ġ: ĠM idi Music Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠSm f Reader Ġ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . read Ġ() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr . music ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Meta Events OfType Ġ( messages Ġ: ĠIterable < Midi Message >, Ġmeta Type Ġ: ĠByte ) Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġmessages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ+= Ġm . deltaTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m . event . eventType Ġ== ĠM idi Event . META Ġ&& Ġm . event . ms b Ġ== Ġmeta Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield ( Midi Message ( v , Ġm . event )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetTotal Play Time Milliseconds Ġ( messages Ġ: ĠMutable List < Midi Message >, Ġdelta Time Spec Ġ: ĠInt ) Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Play Time Milliseconds At Tick Ġ( messages , Ġmessages . sum By Ġ{ Ġm Ġ-> Ġm . deltaTime }, Ġdelta Time Spec ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Play Time Milliseconds At Tick Ġ( messages Ġ: ĠList < Midi Message >, Ġticks Ġ: ĠInt , Ġdelta Time Spec Ġ: ĠInt ) Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deltaTime Spec Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException Ġ(" non - tick Ġbased ĠDelta Time ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtempo Ġ: ĠInt Ġ= ĠM idi Meta Type . DEFAULT _ TEMP O ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġmessages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Time Ġ= Ġt Ġ+ Ġif Ġ( m . deltaTime Ġ< Ġticks ) Ġm . deltaTime Ġelse Ġticks Ġ- Ġt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ+= Ġ( temp o Ġ/ Ġ 1 0 0 0 Ġ* Ġdelta Time Ġ/ Ġdelta Time Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( deltaTime Ġ!= Ġm . deltaTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ+= Ġm . deltaTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m . event . eventType Ġ== ĠM idi Event . META Ġ&& Ġm . event . ms b Ġ== ĠM idi Meta Type . TEMP O ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtempo Ġ= ĠM idi Meta Type . get Temp o Ġ( m . event . extra Data !! , Ġm . event . extra Data Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtracks Ġ: ĠMutable List < Midi Track > Ġ= ĠArrayList Ġ() ĊĊĠĠĠ Ġvar Ġdelta Time Spec Ġ: ĠByte Ġ= Ġ 0 ĊĊĠĠĠ Ġvar Ġformat Ġ: ĠByte Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġadd Track Ġ( track Ġ: ĠM idi Track ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . tracks . add Ġ( track ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Meta Events OfType Ġ( meta Type Ġ: ĠByte ) Ġ: ĠIterable < Midi Message > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( format Ġ!= Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSm f Track Mer ger . merge Ġ( this ). get Meta Events OfType Ġ( meta Type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Meta Events OfType Ġ( tracks Ġ[ 0 ]. messages , Ġmeta Type ). as Iterable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetTotal Ticks Ġ() Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( format Ġ!= Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSm f Track Mer ger . merge Ġ( this ). getTotal Ticks Ġ() ĊĠĠĠĠĠĠĠ Ġreturn Ġtracks Ġ[ 0 ]. messages . sum By Ġ{ Ġm Ġ: ĠM idi Message Ġ-> Ġm . deltaTime } ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetTotal Play Time Milliseconds Ġ() Ġ: ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( format Ġ!= Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSm f Track Mer ger . merge Ġ( this ). getTotal Play Time Milliseconds Ġ() ĊĠĠĠĠĠĠĠ Ġreturn ĠgetTotal Play Time Milliseconds Ġ( tracks Ġ[ 0 ]. messages , Ġdelta Time Spec . to Unsigned ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetTime Position In Milliseconds For Tick Ġ( ticks Ġ: ĠInt ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( format Ġ!= Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSm f Track Mer ger . merge Ġ( this ). getTime Position In Milliseconds For Tick Ġ( ticks ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Play Time Milliseconds At Tick Ġ( tracks Ġ[ 0 ]. messages , Ġticks , Ġdelta Time Spec . to Unsigned ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . format Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM idi Track Ċ { ĊĠĠĠ Ġconstructor Ġ() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġthis Ġ( ArrayList < Midi Message > Ġ()) ĊĊĠĠĠ Ġconstructor ( messages Ġ: ĠMutable List < Midi Message > ?) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( messages Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException Ġ(" null Ġmessages ") ĊĠĠĠĠĠĠĠ Ġthis . messages Ġ= Ġmessages ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmessages Ġ: ĠMutable List < Midi Message > Ġ= ĠArrayList Ġ() ĊĊĠĠĠ Ġfun Ġadd Message Ġ( msg Ġ: ĠM idi Message ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġmessages . add Ġ( msg ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM idi Message ( val Ġdelta Time : ĠInt , Ġevt : ĠM idi Event ) Ġ{ ĊĊĠĠĠ Ġval Ġevent Ġ: ĠM idi Event Ġ= Ġevt Ċ } Ċ Ċ class ĠM idi CC Ċ { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠB ANK _ SELECT Ġ= Ġ 0 x 0 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMOD UL ATION Ġ= Ġ 0 x 0 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRE ATH Ġ= Ġ 0 x 0 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFO OT Ġ= Ġ 0 x 0 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPORT AM ENTO _ TIME Ġ= Ġ 0 x 0 5 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD TE _ MSB Ġ= Ġ 0 x 0 6 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV OL UME Ġ= Ġ 0 x 0 7 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠB AL ANCE Ġ= Ġ 0 x 0 8 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPAN Ġ= Ġ 0 x 0 A . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEXPRESS ION Ġ= Ġ 0 x 0 B . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ CONTROL _ 1 Ġ= Ġ 0 x 0 C . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ CONTROL _ 2 Ġ= Ġ 0 x 0 D . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 1 Ġ= Ġ 0 x 1 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 2 Ġ= Ġ 0 x 1 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 3 Ġ= Ġ 0 x 1 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 4 Ġ= Ġ 0 x 1 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠB ANK _ SELECT _ LSB Ġ= Ġ 0 x 2 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMOD UL ATION _ LSB Ġ= Ġ 0 x 2 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBRE ATH _ LSB Ġ= Ġ 0 x 2 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFO OT _ LSB Ġ= Ġ 0 x 2 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPORT AM ENTO _ TIME _ LSB Ġ= Ġ 0 x 2 5 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD TE _ LSB Ġ= Ġ 0 x 2 6 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV OL UME _ LSB Ġ= Ġ 0 x 2 7 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠB AL ANCE _ LSB Ġ= Ġ 0 x 2 8 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPAN _ LSB Ġ= Ġ 0 x 2 A . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEXPRESS ION _ LSB Ġ= Ġ 0 x 2 B . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ 1 _ LSB Ġ= Ġ 0 x 2 C . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ 2 _ LSB Ġ= Ġ 0 x 2 D . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 1 _ LSB Ġ= Ġ 0 x 3 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 2 _ LSB Ġ= Ġ 0 x 3 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 3 _ LSB Ġ= Ġ 0 x 3 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 4 _ LSB Ġ= Ġ 0 x 3 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠH OLD Ġ= Ġ 0 x 4 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPORT AM ENTO _ SWITCH Ġ= Ġ 0 x 4 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO ST EN UTO Ġ= Ġ 0 x 4 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS OFT _ PED AL Ġ= Ġ 0 x 4 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLE G AT O = Ġ 0 x 4 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠH OLD _ 2 = Ġ 0 x 4 5 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 1 Ġ= Ġ 0 x 4 6 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 2 Ġ= Ġ 0 x 4 7 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 3 Ġ= Ġ 0 x 4 8 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 4 Ġ= Ġ 0 x 4 9 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 5 Ġ= Ġ 0 x 4 A . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 6 Ġ= Ġ 0 x 4 B . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 7 Ġ= Ġ 0 x 4 C . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 8 Ġ= Ġ 0 x 4 D . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 9 Ġ= Ġ 0 x 4 E . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSO UND _ CONTROLLER _ 1 0 Ġ= Ġ 0 x 4 F . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 5 = Ġ 0 x 5 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 6 Ġ= Ġ 0 x 5 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 7 Ġ= Ġ 0 x 5 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGENER AL _ 8 Ġ= Ġ 0 x 5 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPORT AM ENTO _ CONTROL Ġ= Ġ 0 x 5 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠR SD Ġ= Ġ 0 x 5 B . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ 1 Ġ= Ġ 0 x 5 B . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT RE MO LO Ġ= Ġ 0 x 5 C . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ 2 Ġ= Ġ 0 x 5 C . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠC SD Ġ= Ġ 0 x 5 D . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ 3 Ġ= Ġ 0 x 5 D . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCE LE STE Ġ= Ġ 0 x 5 E . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ 4 Ġ= Ġ 0 x 5 E . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP HAS ER Ġ= Ġ 0 x 5 F . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠE FF ECT _ 5 Ġ= Ġ 0 x 5 F . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD TE _ INCREMENT Ġ= Ġ 0 x 6 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD TE _ DECRE MENT Ġ= Ġ 0 x 6 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠN RP N _ LSB Ġ= Ġ 0 x 6 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠN RP N _ MSB Ġ= Ġ 0 x 6 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRP N _ LSB Ġ= Ġ 0 x 6 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRP N _ MSB Ġ= Ġ 0 x 6 5 . to Byte () ĊĠĠĠĠĠĠĠ Ġ// ĠChannel Ġmode Ġmessages ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠALL _ SOUND _ OFF Ġ= Ġ 0 x 7 8 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESET _ ALL _ CONTRO LL ERS Ġ= Ġ 0 x 7 9 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOCAL _ CONTROL Ġ= Ġ 0 x 7 A . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠALL _ NOTES _ OFF Ġ= Ġ 0 x 7 B . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠO M NI _ MODE _ OFF Ġ= Ġ 0 x 7 C . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠO M NI _ MODE _ ON Ġ= Ġ 0 x 7 D . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPOL Y _ MODE _ OFF Ġ= Ġ 0 x 7 E . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPOL Y _ MODE _ ON Ġ= Ġ 0 x 7 F . to Byte () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM idi R pn Type Ċ { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP ITCH _ B END _ S ENS IT IVITY Ġ= Ġ 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠF INE _ T UN ING Ġ= Ġ 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCO AR SE _ T UN ING Ġ= Ġ 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT UN ING _ PROGRAM Ġ= Ġ 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT UN ING _ BANK _ SELECT Ġ= Ġ 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMOD UL ATION _ DEPTH Ġ= Ġ 5 . to Byte () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM idi Meta Type Ċ { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSEQUENCE _ NUMBER Ġ= Ġ 0 x 0 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTEXT Ġ= Ġ 0 x 0 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCOPYRIGHT Ġ= Ġ 0 x 0 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTR ACK _ NAME = Ġ 0 x 0 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIN STR UMENT _ NAME Ġ= Ġ 0 x 0 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠL Y RIC Ġ= Ġ 0 x 0 5 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMARK ER Ġ= Ġ 0 x 0 6 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠC UE Ġ= Ġ 0 x 0 7 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCHAN NEL _ PREFIX = Ġ 0 x 2 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEND _ OF _ TRACK Ġ= Ġ 0 x 2 F . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTEMP O Ġ= Ġ 0 x 5 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS MT PE _ OFFSET Ġ= Ġ 0 x 5 4 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTIME _ SIGNATURE Ġ= Ġ 0 x 5 8 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ SIGNATURE Ġ= Ġ 0 x 5 9 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSEQ U ENC ER _ SPEC IFIC Ġ= Ġ 0 x 7 F . to Byte () ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ TEMP O Ġ= Ġ 5 0 0 0 0 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Temp o Ġ( data Ġ: ĠByteArray , Ġoffset : ĠInt ) Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . size Ġ< Ġoffset Ġ+ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException (" data Ġarray Ġmust Ġbe Ġlonger Ġthan Ġargument Ġoffset Ġ" Ġ+ Ġoffset Ġ+ Ġ" Ġ+ Ġ 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( data [ offset ]. to Unsigned () Ġshl Ġ 1 6 ) Ġ+ Ġ( data Ġ[ offset Ġ+ Ġ 1 ]. to Unsigned () Ġshl Ġ 8 ) Ġ+ Ġdata Ġ[ offset Ġ+ Ġ 2 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget B pm Ġ( data Ġ: ĠByteArray , Ġoffset : ĠInt ) Ġ: ĠDouble ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 6 0 0 0 0 0 0 0 . 0 Ġ/ Ġget Temp o ( data , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠM idi Event Ċ { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOTE _ OFF Ġ: ĠByte Ġ= Ġ 0 x 8 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOTE _ ON Ġ: ĠByte Ġ= Ġ 0 x 9 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP AF Ġ: ĠByte Ġ= Ġ 0 xA 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCC Ġ: ĠByte Ġ= Ġ 0 xB 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPRO GRAM Ġ: ĠByte Ġ= Ġ 0 xC 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠC AF Ġ: ĠByte Ġ= Ġ 0 xD 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠP ITCH Ġ: ĠByte Ġ= Ġ 0 xE 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSY SE X Ġ: ĠByte Ġ= Ġ 0 xF 0 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠM TC _ QU AR TER _ FRAME Ġ: ĠByte Ġ= Ġ 0 xF 1 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS ONG _ POSITION _ POINTER Ġ: ĠByte Ġ= Ġ 0 xF 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS ONG _ SELECT Ġ: ĠByte Ġ= Ġ 0 xF 3 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT UNE _ REQUEST : ĠByte Ġ= Ġ 0 xF 6 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSY SE X _ 2 Ġ: ĠByte Ġ= Ġ 0 xF 7 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIDI _ CLOCK Ġ: ĠByte Ġ= Ġ 0 xF 8 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIDI _ TICK Ġ: ĠByte Ġ= Ġ 0 xF 9 . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIDI _ START Ġ: ĠByte Ġ= Ġ 0 xFA . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIDI _ CONTINUE Ġ: ĠByte Ġ= Ġ 0 xF B . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIDI _ STOP Ġ: ĠByte Ġ= Ġ 0 xFC . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACT IVE _ S ENSE Ġ: ĠByte Ġ= Ġ 0 xFE . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESET Ġ: ĠByte Ġ= Ġ 0 xFF . to Byte () ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMETA Ġ: ĠByte Ġ= Ġ 0 xFF . to Byte () ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEnd Sys Ex Ġ= Ġ 0 xF 7 ĊĊĠĠĠĠĠĠĠ Ġfun Ġconvert Ġ( bytes Ġ: ĠByteArray , Ġindex Ġ: ĠInt , Ġsize Ġ: ĠInt ) Ġ= Ġsequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġindex Ġ+ size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bytes [ i ]. to Unsigned () Ġ== Ġ 0 xF 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield Ġ( Midi Event Ġ( 0 xF 0 , Ġ 0 , Ġ 0 , Ġbytes , Ġi , Ġsize )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( end Ġ< Ġi Ġ+ ĠM idi Event . fixed DataSize ( bytes [ i ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException Ġ( String . format (" Received Ġdata Ġwas Ġincomplete Ġto Ġbuild ĠMIDI Ġstatus Ġmessage Ġfor Ġ'% x ' Ġstatus .", Ġbytes [ i ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz Ġ= ĠM idi Event . fixed DataSize ( bytes [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield Ġ( Midi Event Ġ( bytes [ i ]. to Unsigned (), Ġ( if Ġ( z Ġ> Ġ 0 ) Ġbytes Ġ[ i Ġ+ Ġ 1 ]. to Unsigned () Ġelse Ġ 0 ), Ġ( if Ġ( z Ġ> Ġ 1 ) Ġbytes Ġ[ i Ġ+ Ġ 2 ]. to Unsigned () Ġelse Ġ 0 ), Ġnull , Ġ 0 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġz Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfixed DataSize Ġ( status Byte Ġ: ĠByte ) Ġ: ĠByte Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ(( status Byte . to Unsigned () Ġand Ġ 0 xF 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xF 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status Byte . to Unsigned ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xF 1 , Ġ 0 xF 3 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xF 2 Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// Ġincluding Ġ 0 xF 7 , Ġ 0 xFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xC 0 , Ġ 0 xD 0 Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor Ġ( value Ġ: ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġthis . extra Data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġthis . extra Data Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . extra Data Length Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor Ġ( type Ġ: ĠInt , Ġarg 1 Ġ: ĠInt , Ġarg 2 Ġ: ĠInt , Ġextra Data Ġ: ĠByteArray ?, Ġextra Offset : ĠInt , Ġextra Length : ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġtype Ġ+ Ġ( arg 1 Ġshl Ġ 8 ) Ġ+ Ġ( arg 2 Ġshl Ġ 1 6 ) ĊĠĠĠĠĠĠĠ Ġthis . extra Data Ġ= Ġextra Data ĊĠĠĠĠĠĠĠ Ġthis . extra Data Offset Ġ= Ġextra Offset ĊĠĠĠĠĠĠĠ Ġthis . extra Data Length Ġ= Ġextra Length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġvalue Ġ: ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠThis Ġexpects ĠEnd Sys Ex Ġbyte Ġ_ inclusive _ Ġfor ĠF 0 Ġmessage . ĊĠĠĠ Ġval Ġextra Data Ġ: ĠByteArray ? ĊĠĠĠ Ġval Ġextra Data Offset Ġ: ĠInt ĊĠĠĠ Ġval Ġextra Data Length Ġ: ĠInt ĊĊĠĠĠ Ġval Ġstatus Byte Ġ: ĠByte ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( value Ġand Ġ 0 xFF ). to Byte () ĊĊĠĠĠ Ġval ĠeventType Ġ: ĠByte ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status Byte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMETA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSY SE X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSY SE X _ 2 Ġ-> Ġthis . status Byte ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ( value Ġand Ġ 0 xF 0 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġm sb Ġ: ĠByte ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ(( value Ġand Ġ 0 xFF 0 0 ) Ġshr Ġ 8 ). to Byte () ĊĊĊĠĠĠ Ġval Ġl sb Ġ: ĠByte ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ(( value Ġand Ġ 0 xFF 0 0 0 0 ) Ġshr Ġ 1 6 ). to Byte () ĊĊĠĠĠ Ġval Ġmeta Type Ġ: ĠByte ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm sb ĊĊĠĠĠ Ġval Ġchannel Ġ: ĠByte ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( value Ġand Ġ 0 x 0 F ). to Byte () ĊĊĠĠĠ Ġoverride Ġfun ĠtoString Ġ() Ġ: ĠString ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSm f Writer // Ġdefault Ġmeta Ġevent Ġwriter . Ċ ( var Ġstream : ĠOutputStream ) Ġ{ ĊĊĠĠĠ Ġvar Ġdisable Running Status Ġ: ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Short Ġ( v : ĠShort ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġstream . write Byte Ġ(( v Ġ/ Ġ 0 x 1 0 0 ). to Byte ()) ĊĠĠĠĠĠĠĠ Ġstream . write Byte Ġ(( v Ġ% Ġ 0 x 1 0 0 ). to Byte ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Int Ġ( v Ġ: ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġstream . write Byte Ġ(( v Ġ/ Ġ 0 x 1 0 0 0 0 0 0 ). to Byte ()) ĊĠĠĠĠĠĠĠ Ġstream . write Byte Ġ(( v Ġ/ Ġ 0 x 1 0 0 0 0 Ġand Ġ 0 xFF ). to Byte ()) ĊĠĠĠĠĠĠĠ Ġstream . write Byte Ġ(( v Ġ/ Ġ 0 x 1 0 0 Ġand Ġ 0 xFF ). to Byte ()) ĊĠĠĠĠĠĠĠ Ġstream . write Byte Ġ(( v Ġ% Ġ 0 x 1 0 0 ). to Byte ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Music Ġ( music Ġ: ĠM idi Music ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Header Ġ( music . format . to Short (), Ġmusic . tracks . size . to Short (), Ġmusic . deltaTime Spec . to Short ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( track Ġin Ġmusic . tracks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Track Ġ( track ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Header Ġ( format Ġ: ĠShort , Ġtracks Ġ: ĠShort , Ġdelta Time Spec Ġ: ĠShort ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġstream . write Ġ( byte ArrayOf (' M '. to Byte (), Ġ' T '. to Byte (), Ġ' h '. to Byte (), Ġ' d '. to Byte ()), Ġ 0 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġwrite Short Ġ( 0 ) ĊĠĠĠĠĠĠĠ Ġwrite Short Ġ( 6 ) ĊĠĠĠĠĠĠĠ Ġwrite Short Ġ( format ) ĊĠĠĠĠĠĠĠ Ġwrite Short Ġ( tracks ) ĊĠĠĠĠĠĠĠ Ġwrite Short Ġ( deltaTime Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmeta Event Writer Ġ: Ġ( Boolean , ĠM idi Message , ĠOutputStream ?) Ġ-> ĠInt Ġ= ĠSm f Writer Extension . DEFAULT _ META _ EVENT _ WR ITER ĊĊĠĠĠ Ġfun Ġwrite Track Ġ( track Ġ: ĠM idi Track ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġstream . write Ġ( byte ArrayOf (' M '. to Byte (), Ġ' T '. to Byte (), Ġ' r '. to Byte (), Ġ' k '. to Byte ()), Ġ 0 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġwrite Int Ġ( get Track DataSize Ġ( track )) ĊĊĠĠĠĠĠĠĠ Ġvar Ġrunning _ status Ġ: ĠByte Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġtrack . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite 7 Bit Variable Integer Ġ( e . deltaTime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e . event . eventType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM idi Event . META Ġ-> Ġmeta Event Writer ( false , Ġe , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM idi Event . SY SE X , ĠM idi Event . SY SE X _ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( e . event . eventType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . event . extra Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite 7 Bit Variable Integer ( e . event . extra Data Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write ( e . event . extra Data , Ġe . event . extra Data Offset , Ġe . event . extra Data Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( disable Running Status Ġ|| Ġe . event . status Byte Ġ!= Ġrunning _ status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( e . event . status Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Ġ= ĠM idi Event . fixed DataSize Ġ( e . event . eventType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( e . event . ms b ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( e . event . lsb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ> Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException Ġ(" Unexpected Ġdata Ġsize : Ġ$ len ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning _ status Ġ= Ġe . event . status Byte ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Variant Length Ġ( value Ġ: ĠInt ) Ġ: ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException Ġ( String . format Ġ(" Length Ġmust Ġbe Ġnon - negative Ġinteger : Ġ% d ", Ġvalue )) ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġret Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ: ĠInt Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġwhile Ġ( x Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġx Ġshr Ġ 7 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Track DataSize Ġ( track Ġ: ĠM idi Track Ġ) Ġ: ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġrunning Status Ġ: ĠByte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġtrack . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelta Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+= Ġget Variant Length Ġ( e . deltaTime ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġarguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( e . event . eventType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM idi Event . META Ġ-> Ġsize Ġ+= Ġmeta Event Writer Ġ( true , Ġe , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM idi Event . SY SE X , ĠM idi Event . SY SE X _ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . event . extra Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+= Ġget Variant Length ( e . event . extra Data Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+= Ġe . event . extra Data Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmessage Ġtype Ġ& Ġchannel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( disable Running Status Ġ|| Ġrunning Status Ġ!= Ġe . event . status Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+= ĠM idi Event . fixed DataSize ( e . event . eventType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Status Ġ= Ġe . event . status Byte ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite 7 Bit Variable Integer Ġ( value Ġ: ĠInt ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite 7 Bit Variable Integer Ġ( value , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite 7 Bit Variable Integer Ġ( value Ġ: ĠInt , Ġshifted Ġ: ĠBoolean ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte Ġ(( if Ġ( shift ed ) Ġ 0 x 8 0 Ġelse Ġ 0 ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ>= Ġ 0 x 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite 7 Bit Variable Integer Ġ( value Ġshr Ġ 7 , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġstream . write Byte Ġ((( value Ġand Ġ 0 x 7 F ) Ġ+ Ġif Ġ( shift ed ) Ġ 0 x 8 0 Ġelse Ġ 0 ). to Byte ()) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠSm f Writer Extension Ċ { ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ META _ EVENT _ WR ITER Ġ: Ġ( Boolean , ĠM idi Message , ĠOutputStream ?) Ġ-> ĠInt Ġ= Ġ{ Ġb , m , o Ġ-> Ġdefault Meta Writer Func Ġ( b , m , o ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdefault Meta Writer Func Ġ( length Mode Ġ: ĠBoolean , Ġe Ġ: ĠM idi Message Ġ, Ġstream Ġ: ĠOutputStream ?) Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . event . extra Data Ġ== Ġnull Ġ|| Ġstream Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ[ 0 x 0 0 ] Ġ 0 xFF Ġmeta Type Ġsize Ġ... Ġ( note Ġthat Ġfor Ġmore Ġthan Ġone Ġmeta Ġevent Ġit Ġrequires Ġstep Ġcount Ġof Ġ 0 ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepeat Count Ġ: ĠInt Ġ= Ġe . event . extra Data Length Ġ/ Ġ 0 x 7 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( repeat Count Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 3 Ġ+ Ġe . event . extra Data Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmod Ġ: ĠInt Ġ= Ġe . event . extra Data Length Ġ% Ġ 0 x 7 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrepeat Count Ġ* Ġ( 4 Ġ+ Ġ 0 x 7 F ) Ġ- Ġ 1 Ġ+ Ġif Ġ( mod Ġ> Ġ 0 ) Ġ 4 Ġ+ Ġmod Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwritten Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ: ĠInt Ġ= Ġe Ġ. Ġevent . extra Data Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( written Ġ< Ġtotal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( written Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( 0 ) Ġ// Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( 0 xFF . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( e . event . meta Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠMath . min ( 0 x 7 F , Ġtotal Ġ- Ġwritten ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( size . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write ( e . event . extra Data , Ġe . event . extra Data Offset Ġ+ Ġwritten , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwritten Ġ+= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġv sq Meta Text Splitter Ġ: Ġ( Boolean , ĠM idi Message , ĠOutputStream ) Ġ-> ĠInt Ġ= Ġ{ Ġb , m , o Ġ-> Ġv sq Meta Text Splitter Func Ġ( b , m , o ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġv sq Meta Text Splitter Func Ġ( length Mode Ġ: ĠBoolean , Ġe Ġ: ĠM idi Message Ġ, Ġstream Ġ: ĠOutputStream ?) Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . event . extra Data Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġsplit Ġshould Ġnot Ġbe Ġapplied Ġto Ġ" Master ĠTrack " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . event . extra Data Length Ġ< Ġ 0 x 8 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDEFAULT _ META _ EVENT _ WR ITER ( length Mode , Ġe , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ{ Ġ[ 0 x 0 0 ] Ġ 0 xFF Ġmeta Type ĠDM : xxxx : ... Ġ} Ġ* Ġrepeat Ġ+ Ġ 0 x 0 0 Ġ 0 xFF Ġmeta Type ĠDM : xxxx : mod ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( note Ġthat Ġfor Ġmore Ġthan Ġone Ġmeta Ġevent Ġit Ġrequires Ġstep Ġcount Ġof Ġ 0 ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepeat Count Ġ= Ġe . event . extra Data Length Ġ/ Ġ 0 x 7 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( repeat Count Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 1 Ġ+ Ġe . event . extra Data Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmod Ġ= Ġe . event . extra Data Length Ġ% Ġ 0 x 7 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrepeat Count Ġ* Ġ( 1 2 Ġ+ Ġ 0 x 7 7 ) Ġ- Ġ 1 Ġ+ Ġif Ġ( mod Ġ> Ġ 0 ) Ġ 1 2 + mod Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwritten Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal : ĠInt Ġ= Ġe . event . extra Data Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( written Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( 0 . to Byte ()) Ġ// Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( 0 xFF . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte ( e . event . meta Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠMath . min ( 0 x 7 7 , Ġtotal Ġ- Ġwritten ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write Byte (( size Ġ+ Ġ 8 ). to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write ( String . format (" DM :{ 0 : D 0 4 } :", Ġidx ++ ). toByteArray (), Ġ 0 , Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . write ( e . event . extra Data , Ġe . event . extra Data Offset Ġ+ Ġwritten , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwritten Ġ+= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( written Ġ< Ġtotal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSm f Reader ( private Ġvar Ġstream : ĠInputStream ) Ġ{ ĊĊĠĠĠ Ġvar Ġmusic Ġ= ĠM idi Music Ġ() ĊĊĠĠĠ Ġprivate Ġval Ġdata Ġ= Ġmusic ĊĊĠĠĠ Ġfun Ġread Ġ() Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( read Byte () Ġ!= Ġ' M '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġread Byte () Ġ!= Ġ' T '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġread Byte () Ġ!= Ġ' h '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġread Byte () Ġ!= Ġ' d '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġparse Error (" M Th d Ġis Ġexpected ") ĊĠĠĠĠĠĠĠ Ġif Ġ( readInt 3 2 () Ġ!= Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġparse Error (" Unexpected Ġdata Ġsize Ġ( should Ġbe Ġ 6 )") ĊĠĠĠĠĠĠĠ Ġdata . format Ġ= Ġread Int 1 6 (). to Byte () ĊĠĠĠĠĠĠĠ Ġval Ġtracks Ġ= Ġread Int 1 6 () ĊĠĠĠĠĠĠĠ Ġdata . deltaTime Spec Ġ= Ġread Int 1 6 (). to Byte () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġtracks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . tracks . add ( read Track ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Track Ġ() Ġ: ĠM idi Track Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtr Ġ= ĠM idi Track () ĊĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Byte () Ġ!= Ġ' M '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġread Byte () Ġ!= Ġ' T '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġread Byte () Ġ!= Ġ' r '. to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġread Byte () Ġ!= Ġ' k '. to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġparse Error (" M Tr k Ġis Ġexpected ") ĊĠĠĠĠĠĠĠ Ġval Ġtrack Size Ġ= Ġread Int 3 2 () ĊĠĠĠĠĠĠĠ Ġcurrent _ track _ size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current _ track _ size Ġ< Ġtrack Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġread Variable Length () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtr . messages . add ( read Message ( delta )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ+= Ġdelta ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current _ track _ size Ġ!= Ġtrack Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġparse Error (" Size Ġinformation Ġmismatch ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent _ track _ size Ġ: ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġrunning _ status Ġ: ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġread Message Ġ( deltaTime Ġ: ĠInt ) Ġ: ĠM idi Message ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġpeek Byte Ġ(). to Unsigned () ĊĠĠĠĠĠĠĠ Ġrunning _ status Ġ= Ġif Ġ( b Ġ< Ġ 0 x 8 0 ) Ġrunning _ status Ġelse Ġread Byte Ġ(). to Unsigned () ĊĠĠĠĠĠĠĠ Ġval Ġlen : ĠInt ĊĠĠĠĠĠĠĠ Ġwhen Ġ( running _ status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM idi Event . SY SE X . to Unsigned (), ĠM idi Event . SY SE X _ 2 . to Unsigned (), ĠM idi Event . META . to Unsigned () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Type Ġ= Ġif Ġ( running _ status Ġ== ĠM idi Event . META . to Unsigned ()) Ġread Byte Ġ() Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ= Ġread Variable Length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠByteArray ( len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Bytes ( args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM idi Message Ġ( deltaTime , ĠM idi Event Ġ( running _ status , Ġmeta Type . to Unsigned (), Ġ 0 , Ġargs , Ġ 0 , Ġlen )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġrunning _ status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ+= Ġread Byte (). to Unsigned () Ġshl Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Midi Event . fixed DataSize ( running _ status . to Byte ()) Ġ== Ġ 2 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ+= Ġread Byte (). to Unsigned () Ġshl Ġ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM idi Message Ġ( deltaTime , ĠM idi Event Ġ( value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Bytes Ġ( args Ġ: ĠByteArray ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent _ track _ size Ġ+= Ġargs . size ĊĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( peek _ byte Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs Ġ[ 0 ] Ġ= Ġpeek _ byte . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeek _ byte Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġstream . read Ġ( args , Ġstart , Ġargs . size Ġ- Ġstart ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ< Ġargs . size Ġ- Ġstart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġparse Error Ġ( String . format Ġ(" The Ġstream Ġis Ġins ufficient Ġto Ġread Ġ% d Ġbytes Ġspecified Ġin Ġthe ĠS MF Ġmessage . ĠOnly Ġ% d Ġbytes Ġread .", Ġargs . size , Ġlen )) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream _ position Ġ+= Ġlen ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Variable Length Ġ() Ġ: ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġv Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġread Byte Ġ(). to Unsigned () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ= Ġ( v Ġshl Ġ 7 ) Ġ+ Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġ< Ġ 0 x 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Ġ-= Ġ 0 x 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow Ġparse Error Ġ(" Delta Ġtime Ġspecification Ġexceeds Ġthe Ġ 4 - byte Ġlimitation .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġpeek _ byte Ġ: ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġstream _ position Ġ: ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun Ġpeek Byte Ġ() Ġ: ĠByte ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( peek _ byte Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeek _ byte Ġ= Ġstream . read () ĊĠĠĠĠĠĠĠ Ġif Ġ( peek _ byte Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġparse Error Ġ(" Ins ufficient Ġstream . ĠFailed Ġto Ġread Ġa Ġbyte .") ĊĠĠĠĠĠĠĠ Ġreturn Ġpeek _ byte . to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Byte Ġ() Ġ: ĠByte ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent _ track _ size ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( peek _ byte Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġpeek _ byte . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeek _ byte Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġstream . read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġparse Error Ġ(" Ins ufficient Ġstream . ĠFailed Ġto Ġread Ġa Ġbyte .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret . to Byte () ĊĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream _ position ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Int 1 6 Ġ() Ġ: ĠShort ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ(( read Byte Ġ(). to Unsigned () Ġshl Ġ 8 ) Ġ+ Ġread Byte Ġ(). to Unsigned ()). to Short () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Int 3 2 Ġ() Ġ: ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ((( read Byte Ġ(). to Unsigned () Ġshl Ġ 8 ) Ġ+ Ġread Byte Ġ(). to Unsigned () Ġshl Ġ 8 ) Ġ+ Ġread Byte Ġ(). to Unsigned () Ġshl Ġ 8 ) Ġ+ Ġread Byte Ġ(). to Unsigned () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Error Ġ( msg Ġ: ĠString ) Ġ: ĠException ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparse Error Ġ( msg , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Error Ġ( msg Ġ: ĠString , Ġinner Exception Ġ: ĠException ? Ġ) Ġ: ĠException ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( inner Exception Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSm f Parser Exception Ġ( String . format Ġ(" $ msg ( at Ġ% s )", Ġstream _ position )) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSm f Parser Exception Ġ( String . format Ġ(" $ msg ( at Ġ% s )", Ġstream _ position ), Ġinner Exception ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSm f Parser Exception Ġ: ĠException Ċ { ĊĠĠĠ Ġconstructor Ġ() Ġ: Ġthis Ġ(" SM F Ġparser Ġerror ") ĊĠĠĠ Ġconstructor Ġ( message Ġ: ĠString ) Ġ: Ġsuper Ġ( message ) ĊĠĠĠ Ġconstructor Ġ( message Ġ: ĠString , Ġinner Exception Ġ: ĠException ) Ġ: Ġsuper Ġ( message , Ġinner Exception ) Ċ } Ċ Ċ class ĠSm f Track Mer ger ( private Ġvar Ġsource : ĠM idi Music ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġmerge Ġ( source Ġ: ĠM idi Music ) Ġ: ĠM idi Music ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSm f Track Mer ger Ġ( source ). get Merged Messages Ġ() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFIXME : Ġit Ġshould Ġrather Ġbe Ġimplemented Ġto Ġiterate Ġall ĊĠĠĠ Ġ// Ġtracks Ġwith Ġindex Ġto Ġmessages , Ġpick Ġthe Ġtrack Ġwhich Ġcontains ĊĠĠĠ Ġ// Ġthe Ġnearest Ġevent Ġand Ġpush Ġthe Ġevents Ġinto Ġthe Ġmerged Ġqueue . ĊĠĠĠ Ġ// ĠIt 's Ġsimpler , Ġand Ġcosts Ġless Ġby Ġremoving Ġsort Ġoperation ĊĠĠĠ Ġ// Ġover Ġthousands Ġof Ġevents . ĊĠĠĠ Ġprivate Ġfun Ġget Merged Messages Ġ() Ġ: ĠM idi Music Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġl Ġ= ĠArrayList < Midi Message >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( track Ġin Ġsource . tracks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdelta Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( me v Ġin Ġtrack . messages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Ġ+= Ġme v . deltaTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl . add ( Midi Message ( delta , Ġme v . event )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( l . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠM idi Music () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret . deltaTime Spec Ġ= Ġsource . deltaTime Spec Ġ// Ġempty Ġ( why Ġdid Ġyou Ġneed Ġto Ġsort Ġyour Ġsong Ġfile ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSort () Ġdoes Ġnot Ġalways Ġwork Ġas Ġexpected . ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample , Ġit Ġdoes Ġnot Ġalways Ġpreserve Ġevent ĊĠĠĠĠĠĠĠ Ġ// Ġorders Ġon Ġthe Ġsame Ġchannels Ġwhen Ġthe Ġdelta Ġtime ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġevent ĠB Ġafter Ġevent ĠA Ġis Ġ 0 . ĠIt Ġcould Ġbe Ġsorted ĊĠĠĠĠĠĠĠ Ġ// Ġeither Ġas ĠA -> B Ġor ĠB -> A . ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġresolve Ġthis Ġi ee ue , Ġwe Ġhave Ġto Ġsort Ġ" chunk " ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġevents , Ġnot Ġall Ġsingle Ġevents Ġthemselves , Ġso ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġorder Ġof Ġevents Ġin Ġthe Ġsame Ġchunk Ġis Ġpreserved ĊĠĠĠĠĠĠĠ Ġ// Ġi . e . Ġ[ AB ] Ġat Ġ 4 8 Ġand Ġ[ C DE ] Ġat Ġ 0 Ġshould Ġbe Ġsorted Ġas ĊĠĠĠĠĠĠĠ Ġ// Ġ[ C DE ] Ġ[ AB ]. ĊĊĠĠĠĠĠĠĠ Ġval Ġidx l Ġ= ĠArrayList < Int >( l . size ) ĊĠĠĠĠĠĠĠ Ġidx l . add ( 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġprev Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġl . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l [ i ]. deltaTime Ġ!= Ġprev ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx l . add ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġl [ i ]. deltaTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġidx l . sort With ( Comparator { Ġi 1 , Ġi 2 Ġ-> Ġl Ġ[ i 1 ]. deltaTime - l Ġ[ i 2 ]. deltaTime }) ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġbuild Ġa Ġnew Ġevent Ġlist Ġbased Ġon Ġthe Ġsorted Ġblocks . ĊĠĠĠĠĠĠĠ Ġval Ġl 2 Ġ= ĠArrayList < Midi Message >( l . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġidx : ĠInt ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġidx l . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Ġ= Ġidx l [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġl [ idx ]. deltaTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( idx Ġ< Ġl . size Ġ&& Ġl [ idx ]. deltaTime Ġ== Ġprev ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl 2 . add ( l [ idx ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġl Ġ= Ġl 2 ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġmessages Ġshould Ġbe Ġsorted Ġcorrectly . ĊĊĠĠĠĠĠĠĠ Ġvar Ġwait To Next Ġ= Ġl [ 0 ]. deltaTime ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġl . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( l [ i ]. event . value Ġ!= Ġ 0 ) Ġ{ Ġ// Ġif Ġnon - dummy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġl [ i Ġ+ Ġ 1 ]. deltaTime Ġ- Ġl [ i ]. deltaTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl [ i ] Ġ= ĠM idi Message ( wait To Next , Ġl [ i ]. event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait To Next Ġ= Ġtmp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġl [ l . size Ġ- Ġ 1 ] Ġ= ĠM idi Message ( wait To Next , Ġl [ l . size Ġ- Ġ 1 ]. event ) ĊĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠM idi Music () ĊĠĠĠĠĠĠĠ Ġm . deltaTime Spec Ġ= Ġsource . deltaTime Spec ĊĠĠĠĠĠĠĠ Ġm . format Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm . tracks . add ( Midi Track ( l )) ĊĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSm f Track Splitter ( var Ġsource : ĠMutable List < Midi Message >, Ġdelta Time Spec : ĠByte ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsplit ( source : ĠMutable List < Midi Message >, Ġdelta Time Spec : ĠByte ): ĠM idi Music Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSm f Track Splitter ( source , Ġdelta Time Spec ). split () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġdelta _ time _ spec Ġ= Ġdelta Time Spec ĊĠĠĠ Ġprivate Ġvar Ġtracks Ġ= ĠHashMap < Int , Split Track > Ġ() ĊĊĠĠĠ Ġinternal Ġclass ĠSplit Track ( var Ġtrack ID : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġtotal Delta Time Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġtrack Ġ: ĠM idi Track Ġ= ĠM idi Track Ġ() ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Message Ġ( delta Insert At Ġ: ĠInt , Ġe Ġ: ĠM idi Message ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 2 Ġ= ĠM idi Message Ġ( delta Insert At Ġ- Ġtotal Delta Time , Ġe . event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack . messages . add Ġ( e 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Delta Time Ġ= Ġdelta Insert At ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Delta Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Track Ġ( track Ġ: ĠInt ) Ġ: ĠSplit Track ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġt Ġ= Ġtracks Ġ[ track ] ĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ= ĠSplit Track Ġ( track ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracks Ġ[ track ] Ġ= Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠOverride Ġit Ġto Ġcustomize Ġtrack Ġdispatcher . ĠIt Ġwould Ġbe ĊĠĠĠ Ġ// Ġuseful Ġto Ġsplit Ġnote Ġmessages Ġout Ġfrom Ġnon - note Ġones , ĊĠĠĠ Ġ// Ġto Ġease Ġdata Ġreading . ĊĠĠĠ Ġprivate Ġfun Ġget Track ID Ġ( e Ġ: ĠM idi Message ) Ġ: ĠInt ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( e . event . eventType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM idi Event . META , ĠM idi Event . SY SE X , ĠM idi Event . SY SE X _ 2 Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġe . event . channel . to Unsigned () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit Ġ() Ġ: ĠM idi Music ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Delta Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġsource ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Delta Time Ġ+= Ġe . deltaTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid : ĠInt Ġ= Ġget Track ID ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Track ( id ). addMessage ( total Delta Time , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠM idi Music Ġ() ĊĠĠĠĠĠĠĠ Ġm . deltaTime Spec Ġ= Ġdelta _ time _ spec ĊĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġtracks . values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . tracks . add Ġ( t . track ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm tr Ġ= ĠSplit Track Ġ(- 1 ) ĊĠĠĠĠĠĠĠ Ġtracks [- 1 ] Ġ= Ġm tr ĊĠĠĠ Ġ} Ċ } Ċ