package Ġcom . tom as z ry k ala . mid ion android . midi Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . arch . lifecycle . Android ViewModel Ċ import Ġandroid . arch . lifecycle . Lifecycle Owner Ċ import Ġandroid . arch . lifecycle . Observer Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . midi . Midi Device Ċ import Ġandroid . media . midi . Midi DeviceInfo Ċ import Ġandroid . media . midi . Midi Input Port Ċ import Ġandroid . media . midi . Midi Manager Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Log Ċ Ċ class ĠM idi Controller ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmidi Manager : ĠM idi Manager Ġ= Ġcontext . getSystem Service ( Context . MIDI _ SERVICE ) Ġas ĠM idi Manager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmidi Device Monitor : ĠM idi Device Monitor Ġ= ĠM idi Device Monitor ( context , Ġmidi Manager ) Ċ ) Ġ: ĠAndroid ViewModel ( context . application Context Ġas ĠApplication ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG : ĠString Ġ= Ġ" Midi Controller " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmidi Input Port : ĠM idi Input Port ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmidi Device : ĠM idi Device ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġopen ( midi DeviceInfo : ĠM idi DeviceInfo ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmidi DeviceInfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ports . first Ġ{ Ġit . type Ġ== ĠM idi DeviceInfo . Port Info . TYPE _ INPUT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. port Number . also Ġ{ Ġport Number Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmidi Manager . open Device ( midi DeviceInfo , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmidi Device Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmidi Input Port Ġ= Ġit . open Input Port ( port Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠHandler ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend ( event : ĠM idi Event ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġevent . toString ()) ĊĠĠĠĠĠĠĠ Ġbyte ArrayOf (( event . type . byte Ġ+ Ġevent . channel ). to Byte (), Ġevent . note , Ġevent . pressure , Ġevent . channel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġmidi Input Port ?. send ( this , Ġ 0 , Ġsize ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve Devices ( lifecycle Owner : ĠLifecycle Owner , Ġobserver : ĠObserver < List < Midi DeviceInfo >>) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmidi Device Monitor . observe ( lifecycle Owner , Ġobserver ) ĊĊĠĠĠ Ġfun Ġremove Observer ( observer : ĠObserver < List < Midi DeviceInfo >>) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmidi Device Monitor . remove Observer ( observer ). also Ġ{ Ġclose () Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġmidi Input Port ?. close () ĊĠĠĠĠĠĠĠ Ġmidi Input Port Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmidi Device ?. close () ĊĠĠĠĠĠĠĠ Ġmidi Device Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ