package Ġcom . sdp digital . glass block bar . ble Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroid . preference . Preference Manager Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . provider . Settings . Setting NotFoundException Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . sdp digital . glass block bar . view model . Time Signature Ċ import Ġkotlin . math . round Ċ Ċ object ĠUtils Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG _ TAG : ĠString ? Ġ= Ġ( Utils :: class . java ). simple Name ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ LOCATION _ NOT _ REQUIRED Ġ= Ġ" location _ not _ required " ĊĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ PERMISSION _ REQUEST ED Ġ= Ġ" permission _ requested " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether ĠBluetooth Ġis Ġenabled . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif ĠBluetooth Ġis Ġenabled , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis B le Enabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġadapter Ġ!= Ġnull Ġ&& Ġadapter . isEnabled ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġfor Ġrequired Ġpermissions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġpermissions Ġare Ġalready Ġgranted , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Location Permissions Granted ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( Context Compat . check Self Permission ( context , ĠManifest . permission . ACCESS _ F INE _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġlocation Ġpermission Ġhas Ġbeen Ġrequested Ġat Ġleast Ġtwice Ġand ĊĠĠĠĠ Ġ* Ġuser Ġdenied Ġit , Ġand Ġchecked Ġ' Don 't Ġask Ġagain '. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity Ġthe Ġactivity . ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġif Ġpermission Ġhas Ġbeen Ġdenied Ġand Ġthe Ġpopup Ġwill Ġnot Ġcome Ġup Ġany Ġmore , ĊĠĠĠĠ Ġ* Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Location Permission Denied Fore ver ( activity : ĠActivity ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( activity ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ(! is Location Permissions Granted ( activity ) Ġ// ĠLocation Ġpermission Ġmust Ġbe Ġdenied ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġpreferences . getBoolean ( PRE FS _ PERMISSION _ REQUEST ED , Ġfalse ) Ġ// ĠPermission Ġmust Ġhave Ġbeen Ġrequested Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! Activity Compat . should Show Request Permission R ationale ( activity , ĠManifest . permission . ACCESS _ F INE _ LOCATION )) Ġ// ĠThis Ġmethod Ġshould Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOn Ġsome Ġdevices Ġrunning ĠAndroid ĠMar shm allow Ġor Ġnewer Ġlocation Ġservices Ġmust Ġbe Ġenabled Ġin ĊĠĠĠĠ Ġ* Ġorder Ġto Ġscan Ġfor ĠBluetooth ĠLE Ġdevices . ĠThis Ġmethod Ġreturns Ġwhether Ġthe ĠLocation Ġhas Ġbeen ĊĠĠĠĠ Ġ* Ġenabled Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon ĠAndroid Ġ 6 . 0 + Ġif Ġlocation Ġmode Ġis Ġdifferent Ġthan ĠLOC ATION _ MODE _ OFF . ĊĠĠĠĠ Ġ* ĠIt Ġalways Ġreturns Ġtrue Ġon ĠAndroid Ġversions Ġprior Ġto ĠMar shm allow . ĊĠĠĠĠ Ġ*/ Ċ ĉ @ Jvm Static Ċ ĉ fun Ġis Location Enabled ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Mar shm allow Or Above ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocation Mode Ġ= ĠSettings . Secure . LOCATION _ MODE _ OFF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Mode Ġ= ĠSettings . Secure . getInt ( context . content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . Secure . LOCATION _ MODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSetting NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocation Mode Ġ!= ĠSettings . Secure . LOCATION _ MODE _ OFF ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLocation Ġenabled Ġis Ġrequired Ġon Ġsome Ġph ones Ġrunning ĠAndroid ĠMar shm allow Ġor Ġnewer ĊĠĠĠĠ Ġ* Ġ( for Ġexample Ġon ĠN exus Ġand ĠPixel Ġdevices ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġthe Ġcontext . ĊĠĠĠĠ Ġ* Ġ@ return ĠFalse Ġif Ġit Ġis Ġknown Ġthat Ġlocation Ġis Ġnot Ġrequired , Ġtrue Ġotherwise . ĊĠĠĠĠ Ġ*/ Ċ ĉ @ Jvm Static Ċ ĉ fun Ġis Location Required ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpreferences . getBoolean ( PRE FS _ LOCATION _ NOT _ REQUIRED , Ġis Mar shm allow Or Above ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġa ĠBluetooth ĠLE Ġpacket Ġis Ġreceived Ġwhile ĠLocation Ġis Ġdisabled Ġit Ġmeans Ġthat ĠLocation ĊĠĠĠĠ Ġ* Ġis Ġnot Ġrequired Ġon Ġthis Ġdevice Ġin Ġorder Ġto Ġscan Ġfor ĠLE Ġdevices . ĠThis Ġis Ġa Ġcase Ġof ĠSamsung ĊĠĠĠĠ Ġ* Ġph ones , Ġfor Ġexample . ĠSave Ġthis Ġinformation Ġfor Ġthe Ġfuture Ġto Ġkeep Ġthe ĠLocation Ġinfo Ġhidden . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġthe Ġcontext . ĊĠĠĠĠ Ġ*/ Ċ ĉ @ Jvm Static Ċ ĉ fun Ġmark Location Not Required ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠ Ġpreferences . edit (). put Boolean ( PRE FS _ LOCATION _ NOT _ REQUIRED , Ġfalse ). apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfirst Ġtime Ġan Ġapp Ġrequests Ġa Ġpermission Ġthere Ġis Ġno Ġ' Don 't Ġask Ġagain ' Ġcheckbox Ġand ĊĠĠĠĠ Ġ* Ġ[ Activity Compat . should Show Request Permission R ationale ] Ġreturns Ġfalse . ĊĠĠĠĠ Ġ* ĠThis Ġsituation Ġis Ġsimilar Ġto Ġa Ġpermission Ġbeing Ġdenied Ġforever , Ġso Ġto Ġdistinguish Ġboth Ġcases ĊĠĠĠĠ Ġ* Ġa Ġflag Ġneeds Ġto Ġbe Ġsaved . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġthe Ġcontext . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmark Location Permission Requested ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠ Ġpreferences . edit (). put Boolean ( PRE FS _ PERMISSION _ REQUEST ED , Ġtrue ). apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Mar shm allow Or Above : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ĊĊĠĠĠ Ġfun Ġconvert Eq Bytes To Minimal Bytes ( eq Bytes : ĠArray < Int >): ĠArray < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠretVal Bytes Ġ= ĠArray ( 4 ) Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġone Digit Ġ= Ġ 1 Ġ// Ġ 0 0 1 Ġin Ġbinary ĊĠĠĠĠĠĠĠ Ġval Ġtwo Digits Ġ= Ġ 3 Ġ// Ġ 0 0 1 Ġin Ġbinary ĊĠĠĠĠĠĠĠ Ġval Ġthree Digits Ġ= Ġ 7 Ġ// Ġ 1 1 1 Ġin Ġbinary ĊĠĠĠĠĠĠĠ Ġval Ġfull Mask Ġ= Ġ 2 5 5 Ġ// Ġ 1 1 1 1 1 1 1 1 Ġin Ġbinary ĊĊĠĠĠĠĠĠĠ Ġvar Ġeq Byte Ġ= Ġeq Bytes . map Ġ{ Ġit Ġand Ġthree Digits Ġ} ĊĊĉ ĉ ret Val Bytes [ 0 ] Ġ= Ġ( eq Byte [ 0 ] Ġshl Ġ 5 ) Ġor Ġ( eq Byte [ 1 ] Ġshl Ġ 2 ) Ġor Ġ( eq Byte [ 2 ] Ġshr Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 1 ] Ġ= Ġ(( eq Byte [ 2 ] Ġand Ġone Digit ) Ġshl Ġ 7 ) Ġor Ġ( eq Byte [ 3 ] Ġshl Ġ 4 ) Ġor Ġ( eq Byte [ 4 ] Ġshl Ġ 1 ) Ġor Ġ( eq Byte [ 5 ] Ġshr Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 2 ] Ġ= Ġ(( eq Byte [ 5 ] Ġand Ġtwo Digits ) Ġshl Ġ 6 ) Ġor Ġ( eq Byte [ 6 ] Ġshl Ġ 3 ) Ġor Ġeq Byte [ 7 ] ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 3 ] Ġ= Ġeq Byte [ 8 ] ĊĊĠĠĠĠĠĠĠ Ġreturn ĠretVal Bytes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconvert Minimal Bytes To Eq Bytes ( eq Byte : ĠArray < Int >): ĠArray < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠretVal Bytes Ġ= ĠArray ( 9 ) Ġ{ Ġ 0 Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmask Val Ġ= Ġ 7 Ġ// Ġ 1 1 1 Ġin Ġbinary ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 0 ] Ġ= Ġ( eq Byte [ 0 ] Ġshr Ġ 5 ) Ġand Ġmask Val ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 1 ] Ġ= Ġ( eq Byte [ 0 ] Ġshr Ġ 2 ) Ġand Ġmask Val ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 2 ] Ġ= Ġ(( eq Byte [ 0 ] Ġshl Ġ 1 ) Ġand Ġmask Val ) Ġor Ġ(( eq Byte [ 1 ] Ġshr Ġ 7 ) Ġand Ġmask Val ) ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 3 ] Ġ= Ġ( eq Byte [ 1 ] Ġshr Ġ 4 ) Ġand Ġmask Val ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 4 ] Ġ= Ġ( eq Byte [ 1 ] Ġshr Ġ 1 ) Ġand Ġmask Val ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 5 ] Ġ= Ġ(( eq Byte [ 1 ] Ġshl Ġ 2 ) Ġand Ġmask Val ) Ġor Ġ(( eq Byte [ 2 ] Ġshr Ġ 6 ) Ġand Ġmask Val ) ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 6 ] Ġ= Ġ( eq Byte [ 2 ] Ġshr Ġ 3 ) Ġand Ġmask Val ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 7 ] Ġ= Ġeq Byte [ 2 ] Ġand Ġmask Val ĊĠĠĠĠĠĠĠ ĠretVal Bytes [ 8 ] Ġ= Ġeq Byte [ 3 ] ĊĊĠĠĠĠĠĠĠ Ġreturn ĠretVal Bytes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠOne Ġminute Ġin Ġmilliseconds ĊĠĠĠ Ġconst Ġprivate Ġval Ġper Minute Millis Ġ= Ġ( 1 0 0 0 L Ġ* Ġ 6 0 L ). toDouble () ĊĠĠĠ Ġ// ĠOne Ġminute Ġin Ġmicro seconds ĊĠĠĠ Ġconst Ġprivate Ġval Ġper Minute Micro s Ġ= Ġ 6 0 0 0 0 0 0 0 . 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBe at Ġdivision Ġis Ġa Ġway Ġto Ġdivide Ġbe ats Ġby Ġfactors Ġcommon Ġin Ġmus ical Ġnotes ĊĠĠĠĠ Ġ* Ġ 2 4 Ġis Ġused Ġas Ġthe Ġtransmit Ġprotocol Ġfor ĠBLE , Ġfor Ġthe Ġsame Ġreasons Ġthat ĊĠĠĠĠ Ġ* ĠMIDI Ġprotocol Ġchose Ġ 2 4 Ġas Ġthe Ġbeat Ġdivision . ĊĠĠĠĠ Ġ* ĠIts Ġthe Ġminimal Ġdivision Ġthat Ġworks Ġwith Ġall Ġtime Ġsignatures Ġand Ġtrip let Ġnotes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġrest Ġof Ġthem Ġare Ġused Ġto Ġquant ize Ġmusic Ġin Ġmore Ġcommon Ġ( 4 / 4 ) Ġpatterns . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġenum Ġclass ĠBe at Division ( val Ġdivisor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFO UR TH ( 4 ), ĊĠĠĠĠĠĠĠ ĠE IGH TH ( 8 ), ĊĠĠĠĠĠĠĠ ĠS IX TE ENT H ( 1 6 ), ĊĠĠĠĠĠĠĠ ĠT W ENT Y _ FO UR TH ( 2 4 ); ĊĊĠĠĠĠĠĠĠ Ġval Ġone : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 . 0 Ġ/ Ġdivisor . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġdivision Ġthe Ġdivision al Ġunit Ġof Ġthe Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġtime In Micro s Ġof Ġcurrent Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm Ġbe ats Ġper Ġminute ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm StartTime Micro s Ġstart Ġtime Ġof Ġb pm Ġcounting Ġin Ġmicro seconds ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnumber Ġof Ġ 2 4 th Ġbe ats Ġin Ġlong Ġformat ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquant ize Beat To ( division : ĠBe at Division , Ġtime In Micro s : ĠLong , Ġb pm : ĠInt , Ġb pm StartTime Micro s : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Be ats Ġ= Ġbe ats Elapsed ( time In Micro s , Ġb pm , Ġb pm StartTime Micro s ) ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Division al Be ats Ġ= ĠnumberOf Be ats Ġ/ Ġdivision . one ĊĠĠĠĠĠĠĠ Ġreturn Ġround ( numberOf Division al Be ats ). to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġdivision Ġthe Ġdivision al Ġunit Ġof Ġthe Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġtime In Micro s Ġof Ġcurrent Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm Ġbe ats Ġper Ġminute ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm StartTime Micro s Ġstart Ġtime Ġof Ġb pm Ġcounting Ġin Ġmicro seconds ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtimestamp Ġin Ġmicro seconds Ġof Ġthe Ġtime Ġsynced Ġto Ġclosest Ġ 2 4 th Ġbeat ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquant ize Beat To In Micro s ( division : ĠBe at Division , Ġtime In Micro s : ĠLong , Ġb pm : ĠInt , Ġb pm StartTime Micro s : ĠLong ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrounded NumberOf Division al Be ats Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquant ize Beat To ( division , Ġtime In Micro s , Ġb pm , Ġb pm StartTime Micro s ) ĊĠĠĠĠĠĠĠ Ġval Ġrounded NumberOf Be ats Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrounded NumberOf Division al Be ats . toDouble () Ġ/ Ġdivision . div isor . toDouble () ĊĠĠĠĠĠĠĠ Ġreturn Ġrounded NumberOf Be ats Ġ* Ġmicro s In Beat ( bpm ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġdivision Ġthe Ġdivision al Ġunit Ġof Ġthe Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġtime In Micro s Ġof Ġcurrent Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm Ġbe ats Ġper Ġminute ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm StartTime Micro s Ġstart Ġtime Ġof Ġb pm Ġcounting Ġin Ġmicro seconds ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnumber Ġof Ġ 2 4 th Ġbe ats Ġthrough Ġthe Ġcurrent Ġmeasure Ġthat Ġthe Ġtime Ġis Ġrounded Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquant ize Beat Within Measure To ( division : ĠBe at Division , Ġtime Signature : ĠTime Signature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime In Micro s : ĠLong , Ġb pm : ĠInt , Ġb pm StartTime Micro s : ĠLong ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbe ats Elapsed Ġ= Ġbe ats Elapsed ( time In Micro s , Ġb pm , Ġb pm StartTime Micro s ) ĊĠĠĠĠĠĠĠ Ġval Ġbe ats Through Measure Ġ= Ġbe ats Through Measure ( time Signature , Ġbe ats Elapsed ) ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Division al Be ats Ġ= Ġbe ats Through Measure Ġ/ Ġdivision . one ĊĠĠĠĠĠĠĠ Ġreturn Ġround ( numberOf Division al Be ats ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSame Ġas Ġabove Ġexcept Ġthat Ġit Ġtrunc ates Ġthe Ġbeat Ġinstead Ġof Ġrounding Ġit ĊĠĠĠĠ Ġ* Ġ@ param Ġdivision Ġthe Ġdivision al Ġunit Ġof Ġthe Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġtime In Micro s Ġof Ġcurrent Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm Ġbe ats Ġper Ġminute ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm StartTime Micro s Ġstart Ġtime Ġof Ġb pm Ġcounting Ġin Ġmicro seconds ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnumber Ġof Ġ 2 4 th Ġbe ats Ġthrough Ġthe Ġcurrent Ġmeasure Ġthat Ġthe Ġtime Ġis Ġrounded Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquant ize Beat Within Measure To Truncate ( division : ĠBe at Division , Ġtime Signature : ĠTime Signature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime In Micro s : ĠLong , Ġb pm : ĠInt , Ġb pm StartTime Micro s : ĠLong ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbe ats Elapsed Ġ= Ġbe ats Elapsed ( time In Micro s , Ġb pm , Ġb pm StartTime Micro s ) ĊĠĠĠĠĠĠĠ Ġval Ġbe ats Through Measure Ġ= Ġbe ats Through Measure ( time Signature , Ġbe ats Elapsed ) ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Division al Be ats Ġ= Ġbe ats Through Measure Ġ/ Ġdivision . one ĊĠĠĠĠĠĠĠ Ġreturn ĠnumberOf Division al Be ats . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġtime In Micro s Ġof Ġcurrent Ġbeat ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm Ġbe ats Ġper Ġminute ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm StartTime Micro s Ġstart Ġtime Ġof Ġb pm Ġcounting Ġin Ġmicro seconds ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġwhole Ġand Ġfraction al Ġnumber Ġof Ġbe ats Ġin Ġdouble Ġformat ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbe ats Elapsed ( time In Micro s : ĠLong , Ġb pm : ĠInt , Ġb pm StartTime Micro s : ĠLong ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( time In Micro s Ġ- Ġb pm StartTime Micro s ) Ġ/ Ġmicro s In Beat ( bpm ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġtime Signature Ġwith Ġvalid Ġbe ats Ġper Ġmeasure ĊĠĠĠĠ Ġ* Ġ@ param Ġbe ats Elapsed Ġresults Ġof Ġbe ats Elapsed Ġfunction ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnumber Ġof Ġbe ats Ġthrough Ġthe Ġcurrent Ġmeasure ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbe ats Through Measure ( time Signature : ĠTime Signature , Ġbe ats Elapsed : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġbe ats Elapsed Ġ% Ġbe ats Per Measure ĊĠĠĠĠĠĠĠ Ġval Ġbe ats Elapsed Division Ġ= Ġbe ats Elapsed Ġ/ Ġtime Signature . beats Per Measure . toDouble () ĊĠĠĠĠĠĠĠ Ġreturn Ġbe ats Elapsed Ġ- Ġ( beats Elapsed Division . toInt () Ġ* Ġtime Signature . beats Per Measure ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġb pm Ġbe ats Ġper Ġminute ĊĠĠĠĠ Ġ* Ġ@ return Ġnumber Ġof Ġmilliseconds Ġin Ġa Ġbeat Ġin Ġdouble Ġprecision ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmicro s In Beat ( bpm : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġper Minute Micro s Ġ/ Ġb pm ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġb pm Ġvalue Ġin Ġdecimal Ġprecision ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġb pm Fraction al ( micro s In Beat : ĠLong ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġper Minute Micro s Ġ/ Ġmicro s In Beat ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġb pm Ġvalue Ġrounded Ġto Ġa Ġwhole Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġb pm ( micro s In Beat : ĠDouble ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġround ( per Minute Micro s Ġ/ Ġmicro s In Beat ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠBe at Ġmeasure Ġcharacteristic Ġdata Ġlength ĊĠĠĠ Ġconst Ġval Ġbeat Meas ue Data Length Ġ= Ġ 2 0 ĊĠĠĠ Ġ// ĠStart Ġcommand Ġbyte ĊĠĠĠ Ġconst Ġval Ġstart Sequence Byte Ġ= Ġ 2 ĊĠĠĠ Ġ// ĠAppend Ġpart Ġto Ġprevious Ġsequence Ġmessages ĊĠĠĠ Ġconst Ġval Ġappend Sequence Byte Ġ= Ġ 3 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTo Ġefficiently Ġsend Ġquant ized Ġbeat Ġsequences Ġthrough ĠBLE , ĊĠĠĠĠ Ġ* Ġwe Ġquant ize Ġall Ġuser Ġt aps Ġto Ġwithin Ġa Ġ 2 4 th Ġbeat Ġin Ġthe Ġloop Ġ( like ĠMIDI ). ĊĠĠĠĠ Ġ* ĠA Ġloop Ġis Ġa Ġmus ical Ġmeasure Ġin Ġthe Ġspecified Ġtime Ġsignature . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠEach Ġbyte Ġvalue Ġbetween Ġthe Ġstart Ġand Ġend Ġcommands ĊĠĠĠĠ Ġ* Ġrepresents Ġa Ġ 2 4 th Ġbeat , Ġand Ġthe Ġactual ĊĠĠĠĠ Ġ* Ġtime Ġin Ġmilliseconds Ġthese Ġrepresent Ġis Ġcomputed Ġby Ġthe Ġreceiver ĊĠĠĠĠ Ġ* Ġusing ĠB PM , ĠB PM Ġtime Ġoffset , Ġand Ġtime Ġsignature . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġbeat Ġsequence Ġmessage Ġformat Ġis Ġas Ġfollows : ĊĠĠĠĠ Ġ* Ġ[ start Sequence Byte ][ animation _ index Ġ= ĠAI Ġin Ġthese Ġexamples ] ĊĠĠĠĠ Ġ* Ġ[ 0 Ġif Ġstarting Ġon Ġa Ġbeat , Ġor Ġ 2 4 th Ġbe ats Ġto Ġfirst Ġbeat ] ĊĠĠĠĠ Ġ* Ġ[ distance Ġin Ġ 2 4 th Ġbe ats Ġfrom Ġfirst Ġbeat Ġto Ġsecond Ġbeat ] ĊĠĠĠĠ Ġ* Ġ[ distance Ġin Ġ 2 4 th Ġbe ats Ġfrom Ġfirst Ġbeat Ġto Ġsecond Ġbeat ... ĊĠĠĠĠ Ġ* Ġbut Ġ 2 5 5 Ġif Ġdistance Ġ> Ġ 2 5 5 Ġ( 1 0 x Ġ 2 4 th Ġbe ats ), Ġand Ġnext Ġbyte Ġis Ġadded Ġto Ġ 2 5 5 ] ĊĠĠĠĠ Ġ* Ġ[ end Sequence Byte ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTake Ġa Ġsimple Ġexample Ġof Ġ 4 / 4 Ġwith Ġthe Ġuser Ġt apping Ġon Ġthe Ġbeat , Ġthe Ġsequence Ġwould Ġbe : ĊĠĠĠĠ Ġ* Ġ[ 1 ][ AI ]][ 0 ][ 2 4 ][ 2 4 ][ 2 4 ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTake Ġa Ġmore Ġcomplicated Ġexample Ġof Ġ 1 6 / 1 6 Ġwith Ġthe Ġuser Ġt apping ĊĠĠĠĠ Ġ* Ġon Ġonly Ġthe Ġlast Ġbeat Ġ( 1 5 / 1 6 ) Ġin Ġthe Ġmeasure : ĊĠĠĠĠ Ġ* Ġ[ 1 ][ AI ][ 2 5 5 ][ 1 0 5 ] ĊĠĠĠĠ Ġ* ĠHere Ġwe Ġhad Ġto Ġsplit Ġthe Ġtap Ġinto Ġ 2 Ġbytes Ġas Ġthere Ġis Ġ 3 6 0 Ġ 2 4 th Ġbe ats ĊĠĠĠĠ Ġ* Ġto Ġthe Ġ 1 5 / 1 6 th Ġbeat Ġin Ġthe Ġmeasure , Ġand Ġa Ġbyte Ġonly Ġhas Ġ 2 5 5 Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTake Ġan Ġeven Ġmore Ġcomplicated Ġexample Ġof Ġwhen Ġwe Ġneed Ġto Ġsplit Ġthe Ġmessage Ġinto ĊĠĠĠĠ Ġ* Ġmultiple ĠByte Arrays , Ġdue Ġto Ġthe Ġlimitation Ġin ĠBLE ĠMT U Ġsize Ġmatching Ġcharacteristic Ġsize . ĊĠĠĠĠ Ġ* ĠS ay Ġwe Ġwant Ġto Ġsend Ġa Ġmeasure Ġwith Ġbe ats Ġevery Ġ 1 6 th Ġnote Ġin Ġa Ġ 1 6 / 1 6 Ġtime Ġsignature . ĊĠĠĠĠ Ġ* ĠThe Ġbyte Ġsequence Ġwould Ġlook Ġlike Ġthis : ĊĠĠĠĠ Ġ* Ġ[ 1 ][ AI ][ 0 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ] ĊĠĠĠĠ Ġ* Ġ[ 2 ][ AI ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ] ĊĠĠĠĠ Ġ* Ġ[ 2 ][ AI ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ] ĊĠĠĠĠ Ġ* Ġ[ 2 ][ AI ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ][ 6 ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTake Ġan Ġeven ĠEVEN Ġmore Ġcomplicated Ġexample Ġof Ġwhen Ġwe Ġneed Ġto Ġsplit Ġthe Ġmessage Ġinto ĊĠĠĠĠ Ġ* Ġmultiple ĠByte Arrays , Ġwith Ġthe Ġfirst Ġarray Ġending Ġon Ġ 2 5 5 . ĠĠ 1 7 Ġ 3 2 nd Ġnotes Ġand Ġthen Ġa Ġlong Ġrest . ĊĠĠĠĠ Ġ* ĠThe Ġbyte Ġsequence Ġwould Ġlook Ġlike Ġthis : ĊĠĠĠĠ Ġ* Ġ[ 1 ][ AI ][ 0 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 3 ][ 2 5 5 ] ĊĠĠĠĠ Ġ* Ġ[ 2 ][ AI ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġtakes Ġ 4 Ġmessages Ġto Ġsend Ġthat Ġsequence . ĊĠĠĠĠ Ġ* ĠSee Ġthese Ġexamples Ġas ĠUnit ĠTests Ġin ĠB le Util UnitTest . encode Measure Of Quant ized Be ats _ Test () ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġt aps Quant ized To 2 4 th Be ats Ġthe Ġquant ized Ġbe ats , Ġi . e . Ġin Ġ 4 / 4 Ġfirst Ġbeat Ġis Ġ 0 , ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġbeat Ġis Ġ 2 4 , Ġand Ġlast Ġis Ġ( 4 Ġ* Ġ 2 4 ) Ġ= Ġ 9 6 . ĊĠĠĠĠ Ġ* Ġ@ return Ġmessages Ġready Ġto Ġsend Ġover ĠBLE Ġto Ġdescribe Ġa Ġbeat Ġsequence ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġencode Beat Sequence ( animation Index : ĠInt , Ġt aps Quant ized To 2 4 th Be ats : ĠList < Int >): ĠList < IntArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg List Ġ= ĠArrayList < IntArray >() ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠArrayList < Int >() ĊĊĠĠĠĠĠĠĠ Ġvar ĠaddTo Msg Ġ: Ġ( Int ) Ġ-> ĠUnit Ġ= Ġ{ Ġto Add : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . size Ġ>= Ġbeat Meas ue Data Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg List . add ( msg . to IntArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . add ( append Sequence Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . add ( animation Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . add ( to Add ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsorted T aps Ġ= Ġt aps Quant ized To 2 4 th Be ats . sorted () ĊĠĠĠĠĠĠĠ Ġ// ĠBe ats Ġmust Ġbe Ġsorted , Ġlow Ġto Ġhigh , Ġto Ġsend Ġdistance Ġto Ġnext Ġbeat ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġbeat ) Ġin Ġsorted T aps . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġstart Ġsequence Ġof Ġthe Ġfirst Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Msg ( start Sequence Byte ) Ġ Ġ// ĠAlways Ġstart Ġwith Ġthis Ġto Ġgive Ġcontext Ġto Ġfollowing Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Msg ( animation Index ) ĠĠĠĠ Ġ// ĠThe Ġanimation Ġthis Ġsequence Ġshould Ġbe Ġassigned Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġthe Ġstart Ġsequence Ġof Ġapp ending Ġa Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Msg ( append Sequence Byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . add ( animation Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġthe Ġdifference Ġfrom Ġlast Ġtap Ġfor Ġall Ġsteps Ġbut Ġthe Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdiff Ġ= Ġif ( i Ġ== Ġ 0 ) Ġ{ Ġbeat Ġ} Ġelse Ġ{ Ġbeat Ġ- Ġsorted T aps [ i - 1 ] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( diff Ġ>= Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Msg ( 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiff Ġ-= Ġ 2 5 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( diff Ġ>= Ġ 0 Ġ|| Ġi Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Msg ( diff ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġwe Ġneed Ġto Ġend Ġthe Ġlast Ġsequence Ġby Ġfilling Ġall Ġ 2 0 Ġbytes ĊĠĠĠĠĠĠĠ Ġif Ġ( msg . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmsg . size Ġuntil Ġbeat Meas ue Data Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . add ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg List . add ( msg . to IntArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmsg List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġde codes Ġmessages Ġthat Ġare Ġencoded Ġlike Ġabove Ġin Ġencode Measure Of Quant ized Be ats . ĊĠĠĠĠ Ġ* Ġ@ param Ġlast Beat Val Ġin Ġthe Ġcurrent Ġencoded Message ĊĠĠĠĠ Ġ* Ġ@ param Ġbeat Sequence Ġthe Ġcurrent Ġbeat Ġsequence Ġfor Ġthe Ġdesign ated Ġanimation ĊĠĠĠĠ Ġ* Ġ@ param Ġstart Beat Value Ġthis Ġis Ġthe Ġvalue Ġat Ġwhich Ġwe Ġshould Ġstart Ġcounting Ġat ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġdecoding Ġthe Ġnext Ġmessage ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnew Ġbeat Sequence Ġvalue Ġto Ġbe Ġused ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdecode And Append Beat Sequence ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Message : ĠArray < Int >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Message Size : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbeat Sequence : ĠArray < Int >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbeat Sequence Size : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Beat Value : ĠInt ): ĠDe coded ReturnValue Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġtwo Ġbytes Ġalways Ġdesign ate Ġmessage Ġtype Ġand Ġthe Ġanimation Ġindex ĊĠĠĠĠĠĠĠ Ġval Ġmessage Type Ġ= Ġencoded Message [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġanimation Index Ġ= Ġencoded Message [ 1 ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġlength Ġof Ġthe Ġbeat Ġsequence Ġsection Ġof Ġthe Ġmessage ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġend Ġis Ġsign aled Ġby Ġa Ġzero Ġafter Ġthe Ġ 3 rd Ġbyte ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġvar Ġaccurate Message Size Ġ= Ġ 0 Ġ Ġ// Ġset Ġto Ġ 1 Ġto Ġget Ġit Ġto Ġrun ĊĠĠĠĠĠĠĠ Ġvar Ġfound Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġcount 2 5 5 Ġ= Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCount Ġthe Ġnumber Ġof Ġ 2 5 5 Ġvalues ĊĠĠĠĠĠĠĠ Ġif Ġ( encoded Message [ 2 ] Ġ== Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount 2 5 5 ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! found Ġ&& Ġ( i Ġ< Ġencoded Message Size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġend Ġof Ġthe Ġmessage , Ġif Ġthese Ġconditions Ġare Ġmet ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoded Message [ i ] Ġ== Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( encoded Message [ i Ġ- Ġ 1 ] Ġ!= Ġ 2 5 5 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccurate Message Size Ġ= Ġi Ġ- Ġ 2 Ġ- Ġcount 2 5 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( encoded Message [ i ] Ġ== Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġ 2 5 5 Ġin Ġthe Ġmessage Ġcount , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbecause Ġit Ġis Ġa Ġcontinuing Ġsum ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount 2 5 5 ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġwhole Ġbeat Ġsequence Ġin Ġthe Ġmessage Ġis Ġvalid ĊĠĠĠĠĠĠĠ Ġif Ġ( accur ate Message Size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccurate Message Size Ġ= Ġencoded Message Size Ġ- Ġ 2 Ġ- Ġcount 2 5 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġstarting Ġthe Ġsequence , Ġerase Ġall Ġprevious Ġdata ĊĠĠĠĠĠĠĠ Ġvar Ġnew Beat Sequence Size Ġ= Ġbeat Sequence Size Ġ+ Ġaccurate Message Size ĊĠĠĠĠĠĠĠ Ġvar Ġnew Last Beat Val In 2 4 th Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( message Type Ġ== Ġstart Sequence Byte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Beat Sequence Size Ġ= Ġaccurate Message Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Last Beat Val In 2 4 th Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew Ġarray Ġwith Ġthe Ġnew Ġsize ĊĠĠĠĠĠĠĠ Ġvar Ġnew Beat Sequence Ġ= ĠArray ( new Beat Sequence Size ) Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠFill Ġup Ġthe Ġarray , Ġdepending Ġon Ġthe Ġmessage Type ĊĠĠĠĠĠĠĠ Ġif Ġ( message Type Ġ== Ġappend Sequence Byte ) Ġ{ Ġ Ġ// Ġappend Sequence Byte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( copy I Ġin Ġ 0 Ġuntil Ġbeat Sequence Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Beat Sequence [ copy I ] Ġ= Ġbeat Sequence [ copy I ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġbeat Sequence Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Last Beat Val In 2 4 th Ġ= Ġstart Beat Value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow , Ġfill Ġin Ġthe Ġrest Ġof Ġthe Ġtranslated Ġbeat Ġsequence Ġto Ġfull Ġtime Ġsignature Ġbeat Ġscale ĊĠĠĠĠĠĠĠ Ġ// ĠSk ipping Ġfirst Ġ 2 Ġbytes Ġfor Ġmessage Type Ġand Ġanimation Idx ĊĠĠĠĠĠĠĠ Ġfor Ġ( encoded Idx Ġin Ġ 2 Ġuntil Ġ( accur ate Message Size Ġ+ Ġ 2 Ġ+ Ġcount 2 5 5 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlways Ġadd Ġto Ġthe Ġrunning Ġtotal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Last Beat Val In 2 4 th Ġ+= Ġencoded Message [ encoded Idx ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 5 5 Ġis Ġa Ġcase Ġwhere Ġit Ġis Ġconsidered Ġ" car ried Ġover " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġthe Ġnext Ġsum , Ġand Ġnot Ġan Ġactual Ġbeat Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoded Message [ encoded Idx ] Ġ!= Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Beat Sequence [ i ] Ġ= Ġnew Last Beat Val In 2 4 th ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġthe Ġtranslated Ġ arduino Ġcode , Ġhere Ġwe Ġmust ... ĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġold Ġmemory Ġhere Ġin Ġc ĊĠĠĠĠĠĠĠ Ġ// ĠDe - reference Ġpassed Ġin Ġlast Beat Val Ġhere Ġin ĠC ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDe coded ReturnValue ( new Beat Sequence , Ġnew Beat Sequence Size , Ġnew Last Beat Val In 2 4 th ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDe coded ReturnValue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbeat Sequence : ĠArray < Int > Ġ= ĠArray ( 0 ) Ġ{ Ġ 0 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbeat Sequence Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Beat Value : ĠInt Ġ= Ġ 0 ) Ċ }