code: function tick (a) {
  			if (isStopped) return;
  
  			let playedTime = context.currentTime - initTime;
  			let playedCount = playedTime * sampleRate;
  
  			//if offset has changed - notify processor to provide a new piece of data
  			if (lastCount - playedCount < samplesPerFrame) {
  				//send queued data chunk to buffer
  				util.copy(shift(samplesPerFrame), buffer, lastCount % buffer.length)
  
  				//increase rendered count
  				lastCount += samplesPerFrame;
  
  				//if there is a holding pressure control - release it
  				if (release) {
  					let cb = release;
  					release = null;
  					cb()
  				}
  
  				//call tick extra-time in case if there is a room for buffer
  				//it will plan timeout, if none
  				tick()
  			}
  			//else plan tick for the expected time of starving
  			else {
  				//time of starving is when played time reaches (last count time) - half-duration
  				let starvingTime = (lastCount - samplesPerFrame) / sampleRate;
  				let remainingTime = starvingTime - playedTime;
  				setTimeout(tick, remainingTime * 1000)
  			}
  		}
docs: tick function - if the half-buffer is passed - emit the tick event, which will fill the buffer