package Ġorg . dom aint bn . som md . core . parsing Ċ Ċ import Ġorg . dom aint bn . som md . core . mus ical . Music Time Ċ import Ġorg . dom aint bn . som md . core . mus ical . Play head Ċ import Ġorg . dom aint bn . som md . core . mus ical . Timeline Note Ċ Ċ /** Ċ Ġ* ĠAltern ative Ġname : ĠPlay head Coordinator Ċ Ġ* ĠCan Ġhandle Ġsequences Ġof Ġcommands Ġand Ġdelegate Ġthose Ġto Ġappropriate ĠPlay head ( s ) Ċ Ġ* Ġto Ġgenerate Ġa Ġtimeline Ġof Ġnotes Ċ Ġ*/ Ċ class ĠMaster Play head () Ġ{ ĊĊĠĠĠ Ġprivate Ġclass ĠBranch Handler () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġph Start State Ġ= Ġmutable ListOf < Play head >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġph End State Ġ= Ġmutable ListOf < Play head >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġph Is Reset Ġ= Ġmutable ListOf < Boolean >() ĊĊĊĊ ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Branch ( play head : ĠPlay head ): ĠPlay head Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ph Is Reset . add ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ph Start State . add ( play head . get Copy ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġplay head ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġreset Branch ( play head : ĠPlay head ): ĠPlay head Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ph Is Reset . last ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph End State . add ( play head . get Copy ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph Is Reset [ ph Is Reset . size - 1 ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġph Start State . last (). get Copy () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġend Branch ( play head : ĠPlay head ): ĠPlay head Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ph Is Reset . last ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout : ĠPlay head Ġ= Ġph End State . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ph End State . remove At ( ph End State . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ph Start State . remove At ( ph Start State . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph Is Reset . remove At ( ph Is Reset . size - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ph Start State . remove At ( ph Start State . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph Is Reset . remove At ( ph Is Reset . size - 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġplay head . get Copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Inside Branch (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġph Start State . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbranch Handler Ġ= ĠBranch Handler () ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Local ( comm seq : ĠCommand Seq ): ĠList < Timeline Note > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġmutable ListOf < Timeline Note >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurr Play H Ġ= ĠPlay head () ĊĠĠĠĠĠĠĠ Ġfor Ġ( comm Ġin Ġcomm seq ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( comm . command Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . REG ULAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġcomm . apply On ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . addAll ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . BRANCH _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Play H Ġ= Ġthis . branch Handler . start Branch ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . BRANCH _ RESET Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Play H Ġ= Ġthis . branch Handler . reset Branch ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . BRANCH _ END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Play H Ġ= Ġthis . branch Handler . end Branch ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoutput . toList () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġprocess ( comm seq : ĠCommand Seq ): ĠList < Timeline Note > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Local ( comm seq ) ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMore Info ( val Ġx Ġ: ĠCommand Type , Ġval Ġy Ġ: ĠTimeline Note ?, Ġval Ġmt Ġ: ĠMusic Time ){ ĊĠĠĠĠĠĠĠ Ġfun Ġprint Me (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnote Txt Ġ= Ġy ?. print Me () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ mt Ġ, Ġ${ x . name } Ġ$ note Txt " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġprocess Detailed ( comm seq : ĠCommand Seq ) Ġ: ĠList < More Info >{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġmutable ListOf < More Info >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurr Play H Ġ= ĠPlay head () ĊĠĠĠĠĠĠĠ Ġfor Ġ( comm Ġin Ġcomm seq ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( comm . command Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . REG ULAR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġcomm . apply On ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( x . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . addAll ( x . map Ġ{ ĠMore Info ( Command Type . REG ULAR , Ġit , Ġcurr Play H . time Pos . get Copy ()) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( More Info ( Command Type . REG ULAR , null , curr Play H . time Pos . get Copy ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . BRANCH _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Play H Ġ= Ġthis . branch Handler . start Branch ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( More Info ( comm . command Type , null , curr Play H . time Pos . get Copy ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . BRANCH _ RESET Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Play H Ġ= Ġthis . branch Handler . reset Branch ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( More Info ( comm . command Type , null , curr Play H . time Pos . get Copy ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Type . BRANCH _ END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Play H Ġ= Ġthis . branch Handler . end Branch ( curr Play H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( More Info ( comm . command Type , null , curr Play H . time Pos . get Copy ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoutput . toList () ĊĠĠĠ Ġ} ĊĊĊĊĊ Ċ }