.flags = 0
 };
 
+sfx_set audio_splitter =
+{
+ .sources = "\
+sound/splitter_01.ogg\0"
+};
+
+sfx_set audio_rolls = 
+{
+ .sources = "\
+sound/rolling_01.ogg\0\
+sound/rolling_02.ogg\0"
+};
+
+// One two or three layers of rolling noise
+sfx_system audio_system_balls_rolling =
+{
+       .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx, 
+       .name = "Balls Rolling", .flags = SFX_FLAG_REPEAT
+};
+
+// Various oneshots
+sfx_system audio_system_balls_switching =
+{
+       .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx, 
+       .name = "Balls Switching", .fadeout_length = FADEOUT_LENGTH
+};
+
+// Gameplay critical sounds eg. splitter sound rocking
+sfx_system audio_system_balls_important =
+{
+       .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx, 
+       .name = "Balls Gameplay", .fadeout_length = FADEOUT_LENGTH
+};
+
+// Suplemental sounds
+sfx_system audio_system_balls_extra = 
+{
+       .vol = 1.f, .ch = 1, .vol_src = &audio_volume_sfx, 
+       .name = "Balls Extra", .fadeout_length = FADEOUT_LENGTH
+};
+
 static void resource_load_main(void)
 {
        // Textures
        
        // Audio
        sfx_set_init( &audio_tile_mod, NULL );
+       sfx_set_init( &audio_splitter, NULL );
+       sfx_set_init( &audio_rolls, NULL );
 }
 
 static void resource_free_main(void)
 {
        vg_tex2d_free( texture_list, vg_list_size( texture_list ) );    
        sfx_set_free( &audio_tile_mod );
+       sfx_set_free( &audio_splitter );
+       sfx_set_free( &audio_rolls );
 }
 
 // SHADERS
 
 #define STB_VORBIS_MAX_CHANNELS 2
 #include "stb/stb_vorbis.h"
 
-#define SFX_MAX_SYSTEMS 16
-#define SFX_FLAG_ONESHOT 0x1
-#define SFX_FLAG_STEREO         0x2
-#define FADEOUT_LENGTH 441
-#define FADEOUT_DIVISOR (1.f/(float)FADEOUT_LENGTH)
+#define SFX_MAX_SYSTEMS        16
+#define SFX_FLAG_ONESHOT       0x1
+#define SFX_FLAG_STEREO                0x2
+#define SFX_FLAG_REPEAT        0x4
+#define FADEOUT_LENGTH                 441
+#define FADEOUT_DIVISOR        (1.f/(float)FADEOUT_LENGTH)
 
 typedef struct sfx_vol_control sfx_vol_control;
 typedef struct sfx_system sfx_system;
        float   vol;
        
        // Info
-       int ch, end, cur, flags;
+       int ch, end, cur;
+       u32 flags;
        
        // Effects
        u32 fadeout, fadeout_length, fadeout_cursor;
                if( sys->fadeout_cursor != sys->cur )
                        sys->fadeout = sys->fadeout_length;
                
-               while( cursor < vg_min( sys->cur + frameCount, sys->end ) )
+               u32 frames_write = frameCount;
+               
+               while( frames_write )
                {
-                       audio_mixer_getsamples( pcf, sys->source, cursor, sys->ch );
-                       
-                       avgvol += fabs( pcf[0] * sys->vol );
-                       avgvol += fabs( pcf[1] * sys->vol );
+                       u32 samples_this_run = vg_min( frames_write, sys->end - cursor );
+               
+                       for( u32 j = 0; j < samples_this_run; j ++ )
+                       {
+                               audio_mixer_getsamples( pcf, sys->source, cursor, sys->ch );
+                               
+                               avgvol += fabs( pcf[0] * sys->vol );
+                               avgvol += fabs( pcf[1] * sys->vol );
+                               
+                               pOut32F[ bpos*2+0 ] += pcf[0] * sys->vol;
+                               pOut32F[ bpos*2+1 ] += pcf[1] * sys->vol;
+                               
+                               // Blend the fadeout cursor in to prevent popping
+                               if( sys->fadeout )
+                               {
+                                       if( sys->fadeout_cursor < sys->end )
+                                       {
+                                               audio_mixer_getsamples( pcf, sys->source, sys->fadeout_cursor, sys->ch );
+                                               
+                                               float mul = (float)sys->fadeout * FADEOUT_DIVISOR;
+                                               
+                                               pOut32F[ bpos*2+0 ] += pcf[0] * sys->vol * mul;
+                                               pOut32F[ bpos*2+1 ] += pcf[1] * sys->vol * mul;
+                                               
+                                               sys->fadeout_cursor ++;
+                                               sys->fadeout --;
+                                       }
+                                       else
+                                               sys->fadeout = 0;
+                               }
+
+                               cursor ++;
+                               bpos ++;
+                       }
                        
-                       pOut32F[ bpos*2+0 ] += pcf[0] * sys->vol;
-                       pOut32F[ bpos*2+1 ] += pcf[1] * sys->vol;
+                       frames_write -= samples_this_run;
                        
-                       // Blend the fadeout cursor in to prevent popping
-                       if( sys->fadeout )
+                       if( sys->flags & SFX_FLAG_REPEAT)
                        {
-                               if( sys->fadeout_cursor < sys->end )
+                               if( frames_write )
                                {
-                                       audio_mixer_getsamples( pcf, sys->source, sys->fadeout_cursor, sys->ch );
-                                       
-                                       float mul = (float)sys->fadeout * FADEOUT_DIVISOR;
-                                       
-                                       pOut32F[ bpos*2+0 ] += pcf[0] * sys->vol * mul;
-                                       pOut32F[ bpos*2+1 ] += pcf[1] * sys->vol * mul;
-                                       
-                                       sys->fadeout_cursor ++;
-                                       sys->fadeout --;
+                                       cursor = 0;
+                                       continue;
                                }
-                               else
-                                       sys->fadeout = 0;
                        }
 
-                       cursor ++;
-                       bpos ++;
+                       sys->cur = cursor;
+                       sys->fadeout_cursor = cursor;
+                       sys->signal_average = avgvol / (float)(bpos*2);
+                       
+                       break;
                }
-               
-               sys->signal_average = avgvol / (float)(bpos*2);
-               sys->cur += frameCount;
-               sys->fadeout_cursor = sys->cur;
        }
 
        // Redistribute sound systems
        {
                sfx_system *src = sfx_sys + idx;
        
-               // Keep only if cursor is before end
-               if( src->cur < src->end ) 
+               // Keep only if cursor is before end or repeating
+               if( src->cur < src->end || (src->flags & SFX_FLAG_REPEAT) ) 
                {
                        // Correct source pointer on persisitent originals since we shifted ID's
                        if( !(src->flags & SFX_FLAG_ONESHOT) )