package Ġorg . open rnd r . extras . web Ċ Ċ import Ġkotlinx . browser . document Ċ import Ġkotlinx . browser . window Ċ import Ġorg . kh ronos . webgl . Uint 8 Array Ċ import Ġorg . kh ronos . webgl . get Ċ import Ġorg . w 3 c . dom . HTML Audio Element Ċ import Ġorg . w 3 c . dom . medi ac apt ure . Media Stream Ċ import Ġorg . w 3 c . dom . medi ac apt ure . Media Stream Constraints Ċ import Ġkotlin . js . Promise ĊĊ Ċ class ĠAudio Device ( ĊĠĠĠ Ġval Ġstream : ĠMedia Stream , ĊĠĠĠ Ġval Ġaudio Context : Ġdynamic Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġfft Levels Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġval Ġmicro phone Level : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfft Levels . average (). toInt () ĊĊĠĠĠ Ġfun Ġstart Analysis ( fft Size : ĠInt Ġ= Ġ 1 2 8 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanaly ser Ġ= Ġaudio Context . create Analy ser () ĊĠĠĠĠĠĠĠ Ġval Ġmicro phone Ġ= Ġaudio Context . create Media Stream Source ( stream ) ĊĠĠĠĠĠĠĠ Ġval Ġjavascript Node Ġ= Ġaudio Context . create Script Processor ( 2 0 4 8 , Ġ 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġanaly ser . smoothing Time Constant Ġ= Ġ 0 . 8 ĊĠĠĠĠĠĠĠ Ġanaly ser . fft Size Ġ= Ġfft Size ĊĠĠĠĠĠĠĠ Ġmicro phone . connect ( analy ser ) ĊĠĠĠĠĠĠĠ Ġanaly ser . connect ( javascript Node ) ĊĠĠĠĠĠĠĠ Ġjavascript Node . connect ( audio Context . destination ) ĊĠĠĠĠĠĠĠ Ġjavascript Node . on audio process Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠUint 8 Array ( analy ser . frequency Bin Count Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanaly ser . getByte Frequency Data ( array ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfft Levels Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġarray . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfft Levels . add ( array . get ( i ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġload Audio Device (): ĠPromise < Audio Device > Ġ{ ĊĠĠĠ Ġreturn ĠPromise () Ġ{ Ġresolve , Ġreject Ġ-> ĊĠĠĠĠĠĠĠ Ġwindow . navigator . media Devices . getUser Media ( Media Stream Constraints ( false , Ġ Ġtrue )). then Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Context : Ġdynamic Ġ= Ġjs (" new ĠAudio Context () ") Ġ// Ġexplicit Ġtype Ġdefinition Ġis Ġnot Ġrequired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( Audio Device ( stream , Ġaudio Context )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġload Audio ( src : ĠString ): ĠPromise < HTML Audio Element > Ġ{ ĊĠĠĠ Ġreturn ĠPromise () Ġ{ Ġresolve , Ġreject Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġaudio Ġ= Ġdocument . createElement (" audio ") Ġas ĠHTML Audio Element ĊĠĠĠĠĠĠĠ Ġaudio . src Ġ= Ġsrc ĊĠĠĠĠĠĠĠ Ġconsole . log ( audio ) ĊĊĠĠĠĠĠĠĠ Ġaudio . addEventListener (" abort ", Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( event ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġaudio . addEventListener (" error ", Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( event ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġaudio . addEventListener (" can play ", Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( audio ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ }