package Ġcom . h arry 1 4 5 3 . k launch pad . api Ċ Ċ import Ġjs External .* Ċ import Ġkotlinx . browser . window Ċ import Ġkotlinx . coroutines . await Ċ import Ġorg . kh ronos . webgl . Uint 8 Array Ċ import Ġto Map Ċ Ċ private Ġdata Ġclass ĠM idi Input DeviceInfo Impl ( ĊĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠ Ġoverride Ġval Ġversion : ĠString , ĊĠĠĠ Ġval Ġdevice : ĠMIDI Input Ċ ) Ġ: ĠM idi Input DeviceInfo Ċ Ċ internal Ġactual Ġsuspend Ġfun Ġlist Midi Input Devices Impl (): ĠList < Midi Input DeviceInfo > Ġ{ ĊĠĠĠ Ġval Ġmidi Access Ġ= Ġwindow . navigator . request MIDI Access ( midi Options ( sy sex Ġ= Ġtrue )). await () ĊĠĠĠ Ġreturn Ġmidi Access . inputs . toMap (). map Ġ{ Ġ(_, Ġdevice ) Ġ-> ĠM idi Input DeviceInfo Impl ( device . name . or Empty (), Ġdevice . version . or Empty (), Ġdevice ) Ġ} Ċ } Ċ Ċ internal Ġactual Ġsuspend Ġfun Ġopen Midi Input Device Impl ( device Info : ĠM idi Input DeviceInfo ): ĠM idi Input Device Ġ{ ĊĠĠĠ Ġrequire ( device Info Ġis ĠM idi Input DeviceInfo Impl ) ĊĠĠĠ Ġreturn ĠM idi Input Device Impl ( device Info . device . open (). await ()) Ċ } Ċ Ċ private Ġdata Ġclass ĠM idi Output DeviceInfo Impl ( ĊĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠ Ġoverride Ġval Ġversion : ĠString , ĊĠĠĠ Ġval Ġdevice : ĠMIDI Output Ċ ) Ġ: ĠM idi Output DeviceInfo Ċ Ċ internal Ġactual Ġsuspend Ġfun Ġlist Midi Output Devices Impl (): ĠList < Midi Output DeviceInfo > Ġ{ ĊĠĠĠ Ġval Ġmidi Access Ġ= Ġwindow . navigator . request MIDI Access ( midi Options ( sy sex Ġ= Ġtrue )). await () ĊĠĠĠ Ġreturn Ġmidi Access . outputs . toMap (). map Ġ{ Ġ(_, Ġdevice ) Ġ-> ĠM idi Output DeviceInfo Impl ( device . name . or Empty (), Ġdevice . version . or Empty (), Ġdevice ) Ġ} Ċ } Ċ Ċ internal Ġactual Ġsuspend Ġfun Ġopen Midi Output Device Impl ( device Info : ĠM idi Output DeviceInfo ): ĠM idi Output Device Ġ{ ĊĠĠĠ Ġrequire ( device Info Ġis ĠM idi Output DeviceInfo Impl ) ĊĠĠĠ Ġreturn ĠM idi Output Device Impl ( device Info . device . open (). await ()) Ċ } Ċ Ċ private Ġabstract Ġclass ĠAbstract Midi Device Wrapper ( private Ġval Ġdevice : ĠM ID IP ort ) Ġ: ĠC losable Ġ{ ĊĠĠĠ Ġoverride Ġval Ġis Closed : ĠBoolean Ġget () Ġ= Ġdevice . state Ġ== Ġ" connected " ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdevice . close () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠM idi Input Device Impl ( private Ġval Ġdevice : ĠMIDI Input ) Ġ: ĠAbstract Midi Device Wrapper ( device ), ĠM idi Input Device Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset Message Listener ( message Listener : Ġ( message : ĠByteArray ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdevice . on mid ime ssage Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Listener ( it . data . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠM idi Output Device Impl ( private Ġval Ġdevice : ĠMIDI Output ) Ġ: ĠAbstract Midi Device Wrapper ( device ), ĠM idi Output Device Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠsendMessage ( message : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdevice . send ( Uint 8 Array ( message . to Typed Array ())) ĊĠĠĠ Ġ} Ċ } Ċ