package Ġname . ats ush i eno . fluid syn th mid ide vices ervice j Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . media . midi . Midi Receiver Ċ import Ġandroid . util . Log Ċ import Ġfluid syn th . and roi dex t ensions . Android Logger Ċ import Ġfluid syn th . and roi dex t ensions . Android Native Asset Sound Font Loader Ċ import Ġfluid syn th . Audio Driver Ċ import Ġfluid syn th . Settings Ċ import Ġfluid syn th . Sound Font Loader Ċ import Ġfluid syn th . Syn th Ċ Ċ internal Ġfun ĠByte . to Unsigned () Ġ= Ġif Ġ( this Ġ< Ġ 0 ) Ġ 2 5 6 Ġ+ Ġthis Ġelse Ġthis . toInt () Ċ Ċ class ĠFluid syn th Midi Receiver Ġ( context : ĠContext ) Ġ: ĠM idi Receiver () Ċ { ĊĠĠĠ Ġprivate Ġval Ġsettings : ĠSettings ĊĠĠĠ Ġprivate Ġval Ġsyn : ĠSyn th ĊĠĠĠ Ġprivate Ġval Ġad river : ĠAudio Driver ĊĠĠĠ Ġprivate Ġval Ġasset _ sf loader : ĠSound Font Loader ĊĊĠĠĠ Ġprivate Ġvar Ġis _ dis posed Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . setProperty Ġ(" j na . nos ys ", Ġ" false ") Ġ// Ġhttps :// github . com / java - native - access / j na / issues / 3 8 4 # issuecomment - 4 4 1 4 0 5 2 6 6 ĊĠĠĠĠĠĠĠ ĠAndroid Logger . install Android Logger () ĊĊĠĠĠĠĠĠĠ Ġvar Ġam Ġ= ĠApplication Model . getInstance ( context ) ĊĠĠĠĠĠĠĠ Ġsettings Ġ= ĠSettings Ġ() ĊĠĠĠĠĠĠĠ Ġsettings . getEntry Ġ( Configuration Keys . Syn th Thread Safe Api ). setInt Value Ġ( 0 ) ĊĠĠĠĠĠĠĠ Ġsettings . getEntry Ġ( Configuration Keys . Syn th Gain ). set Double Value Ġ( am . audio Gain Percentage Ġ/ Ġ 1 0 0 . 0 ) Ġ// ĠSee Ġhttps :// github . com / ats ush i eno / fluid syn th - midi - service - j / issues / 7 ĊĠĠĠĠĠĠĠ Ġ// settings . getEntry Ġ( Configuration Keys . Audio Driver ). set StringValue Ġ(" opens les ") ĊĠĠĠĠĠĠĠ Ġ// settings . getEntry Ġ( Configuration Keys . Audio Sample Format ). set StringValue Ġ(" float ") ĊĠĠĠĠĠĠĠ Ġsettings . getEntry Ġ(" audio . o bo e . sharing - mode "). set StringValue ( if Ġ( am . audio Exclusive Use ) Ġ" Exclusive " Ġelse Ġ" Shared ") ĊĠĠĠĠĠĠĠ Ġsettings . getEntry Ġ(" audio . o bo e . performance - mode "). set StringValue ( am . performance Mode ) ĊĠĠĠĠĠĠĠ Ġsettings . getEntry Ġ( Configuration Keys . Syn th Sample Rate ). set Double Value Ġ( am . sample Rate . toDouble ()) ĊĠĠĠĠĠĠĠ Ġsettings . getEntry Ġ( Configuration Keys . Audio Period Size ). setInt Value Ġ( am . frames Per Buffer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġshould Ġbe Ġable Ġto Ġuse Ġthis Ġaltern atively , Ġbut Ġit Ġstill Ġhas Ġsome Ġissue Ġthat Ġcallbacks Ġare Ġreset Ġin Ġthe Ġmiddle , Ġmore ĠGC Ġpin ning Ġis Ġlikely Ġrequired . ĊĠĠĠĠĠĠĠ Ġ// asset _ sf loader Ġ= ĠAndroid Asset Sound Font Loader ( settings , Ġcontext . assets ) ĊĠĠĠĠĠĠĠ Ġasset _ sf loader Ġ= ĠAndroid Native Asset Sound Font Loader ( settings , Ġcontext . assets ) ĊĠĠĠĠĠĠĠ Ġsyn Ġ= ĠSyn th Ġ( settings ) ĊĠĠĠĠĠĠĠ Ġsyn . handleError Ġ= Ġfun Ġ( errorCode : ĠInt , Ġwrapper Error : ĠString , Ġnative Error : ĠString ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Fluid syn th Midi Service ", Ġ"$ wrapper Error Ġ( error Ġcode Ġ$ errorCode : Ġ$ native Error )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( wrapper Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" note off Ġoperation Ġfailed " Ġ-> Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsyn . add Sound Font Loader Ġ( asset _ sf loader ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( sf Ġin ĠApplication Model . getInstance ( context ). sound Fonts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsyn . load Sound Font Ġ( sf , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġad river Ġ= ĠAudio Driver Ġ( syn . get Settings (), Ġsyn ) ĊĠĠĠĠĠĠĠ Ġsyn . system Reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Disposed () Ġ: ĠBoolean { ĊĠĠĠĠĠĠĠ Ġreturn Ġis _ dis posed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispose () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// asset _ sf loader . close Ġ() ĊĠĠĠĠĠĠĠ Ġad river . close Ġ() ĊĠĠĠĠĠĠĠ Ġsyn . close Ġ() ĊĠĠĠĠĠĠĠ Ġsettings . close Ġ() ĊĠĠĠĠĠĠĠ Ġis _ dis posed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Send ( msg : ĠByteArray ?, Ġoffset : ĠInt , Ġcount : ĠInt , Ġtimestamp : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : Ġconsider Ġtimestamp ĊĠĠĠĠĠĠĠ Ġif Ġ( msg Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException Ġ(" null Ġmsg ") ĊĠĠĠĠĠĠĠ Ġvar Ġoff Ġ= Ġoffset ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġcount ĊĠĠĠĠĠĠĠ Ġvar Ġrunning Status Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( c Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstat Ġ= Ġmsg [ off ]. to Unsigned () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat Ġ< Ġ 0 x 8 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstat Ġ= Ġrunning Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoff ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrunning Status Ġ= Ġstat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġch Ġ= Ġstat Ġand Ġ 0 x 0 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( stat Ġand Ġ 0 xF 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 8 0 Ġ-> Ġsyn . note Off ( ch , Ġmsg [ off ]. to Unsigned ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg [ off Ġ+ Ġ 1 ]. toInt () Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyn . note Off ( ch , Ġmsg [ off ]. to Unsigned ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyn . note On ( ch , Ġmsg [ off ]. to Unsigned (), Ġmsg [ off Ġ+ Ġ 1 ]. to Unsigned ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xA 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo ĠPA f Ġin Ġfluid syn th ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xB 0 Ġ-> Ġsyn . cc ( ch , Ġmsg [ off ]. to Unsigned (), Ġmsg [ off Ġ+ Ġ 1 ]. to Unsigned ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xC 0 Ġ-> Ġsyn . program Change ( ch , Ġmsg [ off ]. to Unsigned ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xD 0 Ġ-> Ġsyn . channel Pressure ( ch , Ġmsg [ off ]. to Unsigned ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 0 Ġ-> Ġsyn . pitch B end ( ch , Ġmsg [ off ]. to Unsigned () Ġ+ Ġmsg [ off Ġ+ Ġ 1 ]. to Unsigned () Ġ* Ġ 0 x 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xF 0 Ġ-> Ġsyn . sy sex ( msg . copyOf Range ( off , Ġoff Ġ+ Ġc Ġ- Ġ 1 ), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( stat Ġand Ġ 0 xF 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xC 0 , 0 xD 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoff ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 xF 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ+= Ġc Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ-= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }