package Ġdev . ats ush i eno . kt midi Ċ Ċ import Ġkotlin . math . round Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assert Content Equals Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertTrue ĊĊ Ċ @ kotlin . Experimental Unsigned Types Ċ class ĠM idi Music UnitTest Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Sm f B pm () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 0 . 0 , Ġround ( Midi Music . get Sm f B pm ( byte ArrayOf ( 7 , Ġ 0 xA 1 . to Byte (), Ġ 0 x 2 0 ), Ġ 0 )), Ġ" 1 2 0 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 4 0 . 0 , Ġround ( Midi Music . get Sm f B pm ( byte ArrayOf ( 6 , Ġ 0 x 8 A . to Byte (), Ġ 0 xB 1 . to Byte ()), Ġ 0 )), Ġ" 1 4 0 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Fixed Size () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , ĠM idi Event . fixed DataSize ( 0 x 9 0 . to Byte ()). toInt (), Ġ" Note On ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , ĠM idi Event . fixed DataSize ( 0 xC 0 . to Byte ()). toInt (), Ġ" Program Change ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , ĠM idi Event . fixed DataSize ( 0 xD 0 . to Byte ()). toInt (), Ġ" CA f ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , ĠM idi Event . fixed DataSize ( 0 xA 0 . to Byte ()). toInt (), Ġ" PA f ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , ĠM idi Event . fixed DataSize ( 0 xF 0 . to Byte ()). toInt (), Ġ" Sys Ex ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , ĠM idi Event . fixed DataSize ( 0 xF 2 . to Byte ()). toInt (), Ġ" Song Position Pointer ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , ĠM idi Event . fixed DataSize ( 0 xF 3 . to Byte ()). toInt (), Ġ" Song Select ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , ĠM idi Event . fixed DataSize ( 0 xF 8 . to Byte ()). toInt (), Ġ" Midi Clock ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , ĠM idi Event . fixed DataSize ( 0 xFF . to Byte ()). toInt (), Ġ" META ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmidi Event Convert () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbytes 1 Ġ= Ġbyte ArrayOf ( 0 xF 8 . to Byte ()) ĊĠĠĠĠĠĠĠ Ġvar Ġevents 1 Ġ= ĠM idi Event . convert ( bytes 1 , Ġ 0 , Ġbytes 1 . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġevents 1 . count (), Ġ" bytes 1 Ġcount ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġbytes 2 Ġ= Ġbyte ArrayOf ( 0 xFE . to Byte ()) ĊĠĠĠĠĠĠĠ Ġvar Ġevents 2 Ġ= ĠM idi Event . convert ( bytes 2 , Ġ 0 , Ġbytes 2 . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġevents 2 . count (), Ġ" bytes 2 Ġcount ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġunsigned Operations () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevt Ġ= ĠM idi Event ( 0 xFF , Ġ 3 , Ġ 4 , Ġchar ArrayOf (' t ', Ġ' e ', Ġ' s ', Ġ' t '). map Ġ{ Ġc Ġ-> Ġc . code . to Byte () Ġ}. toByteArray (), Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 xFF . to Byte (), Ġevt . eventType , Ġ" eventType ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġevt . ms b , Ġ" ms b ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġevt . lsb , Ġ" lsb ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġevt . extra Data Length , Ġ" extra Data Length ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmidi Music Get Play Time Milliseconds At Tick () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmusic = ĠTest Helper . getM idi Music () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġmusic . getTime Position In Milliseconds For Tick ( 0 ), Ġ" tick Ġ 0 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 5 , Ġmusic . getTime Position In Milliseconds For Tick ( 4 8 ), Ġ" tick Ġ 4 8 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 0 0 , Ġmusic . getTime Position In Milliseconds For Tick ( 1 9 2 ), Ġ" tick Ġ 1 9 2 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsm f Reader Read Ġ() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠU . M , ĠU . T , ĠL . h , ĠL . d , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 6 , Ġ 0 , Ġ 1 , Ġ 0 , Ġ 1 , Ġ 0 , Ġ 0 x 3 0 , Ġ// Ġat Ġ 1 4 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠU . M , ĠU . T , ĠL . r , ĠL . k , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 x 1 C , Ġ// Ġat Ġ 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 x 9 0 , Ġ 0 x 3 C , Ġ 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 3 0 , Ġ 0 x 8 0 , Ġ 0 x 3 C , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 x 9 0 , Ġ 0 x 3 E , Ġ 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 3 0 , Ġ 0 x 8 0 , Ġ 0 x 3 E , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 x 9 0 , Ġ 0 x 4 0 , Ġ 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 3 0 , Ġ 0 x 8 0 , Ġ 0 x 4 0 , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 xFF , Ġ 0 x 2 F , Ġ 0 ). map Ġ{ Ġi Ġ-> Ġi . to Byte () Ġ}. toByteArray () ĊĠĠĠĠĠĠĠ Ġval Ġmusic Ġ= ĠM idi Music (). apply Ġ{ Ġread ( expected . toList ()) Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 4 4 , Ġmusic . getTotal Ticks (), Ġ" total Ġticks ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsm f Writer Write () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmusic Ġ= ĠM idi Music () ĊĠĠĠĠĠĠĠ Ġval Ġtrack Ġ= ĠM idi Track () ĊĠĠĠĠĠĠĠ Ġmusic . tracks . add ( track ) ĊĠĠĠĠĠĠĠ Ġval Ġsy sex Data Ġ= ĠarrayOf ( 0 x 7 D , Ġ 0 x 0 B , Ġ 0 x 2 D , Ġ 0 x 3 1 , Ġ 0 x 3 4 , Ġ 0 x 3 7 , Ġ 0 x 3 2 , Ġ 0 x 3 5 , Ġ 0 x 3 4 , Ġ 0 x 3 9 , Ġ 0 x 3 9 , Ġ 0 x 3 7 , Ġ 0 x 3 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġv Ġ-> Ġv . to Byte () Ġ}. toByteArray () ĊĠĠĠĠĠĠĠ Ġtrack . messages . add ( Midi Message ( 0 , ĠM idi Event ( 0 xF 0 , Ġ 0 , Ġ 0 , Ġsy sex Data ))) ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġmutable ListOf < Byte >() ĊĠĠĠĠĠĠĠ ĠSm f Writer ( bytes ). write Music ( music ) ĊĠĠĠĠĠĠĠ Ġval Ġtrack Head Ġ= ĠarrayOf (' M '. code , Ġ' T '. code , Ġ' r '. code , Ġ' k '. code , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 1 6 , Ġ 0 , Ġ 0 xF 0 ). map Ġ{ Ġv Ġ-> Ġv . to Byte () Ġ}. toByteArray () ĊĠĠĠĠĠĠĠ Ġval Ġheader Chunk Size Ġ= Ġ 1 4 Ġ// ĠM Th d Ġ+ Ġsize Info ( 0 Ġ 0 Ġ 0 Ġ 6 ) Ġ+ Ġactual Size ( 6 Ġbytes ) ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġbytes . drop ( header Chunk Size ). toByteArray () ĊĠĠĠĠĠĠĠ Ġassert Content Equals ( track Head Ġ+ Ġsy sex Data Ġ+ Ġbyte ArrayOf ( 0 xF 7 . to Byte ()), Ġactual , Ġ" SM F Ġtrack ") ĊĊĠĠĠĠĠĠĠ Ġbytes . clear () ĊĠĠĠĠĠĠĠ ĠSm f Writer ( bytes ). write Music ( music ) ĊĠĠĠĠĠĠĠ Ġmusic . tracks . clear () ĊĠĠĠĠĠĠĠ ĠassertTrue ( bytes . size Ġ> Ġ 0 , Ġ" bytes Ġsize ") ĊĠĠĠĠĠĠĠ Ġmusic . read ( bytes ) ĊĠĠĠĠĠĠĠ Ġval Ġevt Ġ= Ġmusic . tracks . first (). messages . first (). event ĊĠĠĠĠĠĠĠ Ġassert Content Equals ( sy sex Data , Ġevt . extra Data !!. drop ( evt . extra Data Offset ). take ( evt . extra Data Length ). toByteArray (), Ġ" read ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( header Chunk Size Ġ+ Ġtrack Head . size Ġ+ Ġsy sex Data . size Ġ+ Ġ 1 , Ġbytes . size , Ġ" music Ġbytes Ġsize ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠU Ġand ĠL Ġcannot Ġshare Ġcase - ins ensit ively Ġidentical Ġfields Ġfor ĠJNI Ġsignature ... ĊĠĠĠ Ġclass ĠU Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠM Ġ= Ġ' M '. code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT Ġ= Ġ' T '. code ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠL Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġ' h '. code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġ' d '. code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġ' r '. code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġk Ġ= Ġ' k '. code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġ' e '. code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġ' s '. code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġ' t '. code ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġconvert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġint ArrayOf ( 0 xF 0 , Ġ 0 x 0 A , Ġ 0 x 4 1 , Ġ 0 x 1 0 , Ġ 0 x 4 2 , Ġ 0 x 1 2 , Ġ 0 x 4 0 , Ġ 0 , Ġ 0 x 7 F , Ġ 0 , Ġ 0 x 4 1 , Ġ 0 xF 7 ). map Ġ{ Ġit . to Byte () Ġ}. toByteArray () Ġ// Ġam Ġtoo Ġlazy Ġto Ġadd Ġcast Ġto Ġbyte ... ĊĠĠĠĠĠĠĠ Ġval Ġmsgs Ġ= ĠM idi Event . convert Ġ( bytes , Ġ 0 , Ġbytes . size ). as Iterable (). toList () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġmsgs . size , Ġ" message Ġlength ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( bytes . size , Ġmsgs . first (). extra Data Length ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġencode 7 Bit Length () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf < Byte >( 0 ), ĠM idi Message . encode 7 Bit Length ( 0 ). toList (), Ġ" test 1 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf < Byte >( 0 x 7 F ), ĠM idi Message . encode 7 Bit Length ( 0 x 7 F ). toList (), Ġ" test 2 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 0 x 8 0 . to Byte (), Ġ 1 ), ĠM idi Message . encode 7 Bit Length ( 0 x 8 0 ). toList (), Ġ" test 3 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 0 xFF . to Byte (), Ġ 1 ), ĠM idi Message . encode 7 Bit Length ( 0 xFF ). toList (), Ġ" test 4 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 0 x 8 0 . to Byte (), Ġ 2 ), ĠM idi Message . encode 7 Bit Length ( 0 x 1 0 0 ). toList (), Ġ" test 5 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 0 xFF . to Byte (), Ġ 0 x 7 F . to Byte ()), ĠM idi Message . encode 7 Bit Length ( 0 x 3 FFF ). toList (), Ġ" test 6 ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 0 x 8 0 . to Byte (), Ġ 0 x 8 0 . to Byte (), Ġ 1 ), ĠM idi Message . encode 7 Bit Length ( 0 x 4 0 0 0 ). toList (), Ġ" test 7 ") ĊĠĠĠ Ġ} Ċ } Ċ