+
+ audio_lock();
+
+ float air = s->state.activity <= k_skate_activity_air_to_grind? 1.0f: 0.0f,
+ speed = v3_length( player->rb.v ),
+ attn = vg_minf( 1.0f, speed*0.1f ),
+ slide = vg_clampf( fabsf(s->state.slip), 0.0f, 1.0f ),
+
+ vol_main = sqrtf( (1.0f-air)*attn*(1.0f-slide) * 0.4f ),
+ vol_air = sqrtf( air *attn * 0.5f ),
+ vol_slide = sqrtf( (1.0f-air)*attn*slide * 0.25f );
+
+ const u32 flags = AUDIO_FLAG_SPACIAL_3D|AUDIO_FLAG_LOOP;
+ if( !s->aud_main )
+ s->aud_main = audio_request_channel( &audio_board[0], flags );
+
+ if( !s->aud_air )
+ s->aud_air = audio_request_channel( &audio_board[1], flags );
+
+ if( !s->aud_slide )
+ s->aud_slide = audio_request_channel( &audio_board[2], flags );
+
+
+ /* brrrrrrrrrrrt sound for tiles and stuff
+ * --------------------------------------------------------*/
+ float sidechain_amt = 0.0f,
+ hz = speed * 2.0f;
+
+ if( s->surface == k_surface_prop_tiles )
+ sidechain_amt = 1.0f;
+ else
+ sidechain_amt = 0.0f;
+
+ audio_set_lfo_frequency( 0, hz );
+ audio_set_lfo_wave( 0, k_lfo_polynomial_bipolar,
+ vg_lerpf( 250.0f, 80.0f, attn ) );
+
+ if( s->aud_main ){
+ s->aud_main->colour = 0x00103efe;
+ audio_channel_set_spacial( s->aud_main, player->rb.co, 40.0f );
+ audio_channel_slope_volume( s->aud_main, 0.05f, vol_main );
+ audio_channel_sidechain_lfo( s->aud_main, 0, sidechain_amt );
+
+ float rate = 1.0f + (attn-0.5f)*0.2f;
+ audio_channel_set_sampling_rate( s->aud_main, rate );
+ }
+
+ if( s->aud_slide ){
+ s->aud_slide->colour = 0x00103efe;
+ audio_channel_set_spacial( s->aud_slide, player->rb.co, 40.0f );
+ audio_channel_slope_volume( s->aud_slide, 0.05f, vol_slide );
+ audio_channel_sidechain_lfo( s->aud_slide, 0, sidechain_amt );
+ }
+
+ if( s->aud_air ){
+ s->aud_air->colour = 0x00103efe;
+ audio_channel_set_spacial( s->aud_air, player->rb.co, 40.0f );
+ audio_channel_slope_volume( s->aud_air, 0.05f, vol_air );
+ }
+
+ audio_unlock();