code: function createHopStream(frame_size, hop_size, onFrame, max_data_size) {
    if(hop_size > frame_size) {
      throw new Error("Hop size must be smaller than frame size")
    }
    max_data_size     = max_data_size || frame_size
    var buffer        = new Float32Array(2*frame_size + max_data_size)
    var ptr           = 0
    var frame_slices  = []
    for(var j=0; j+frame_size<=buffer.length; j+=hop_size) {
      frame_slices.push(buffer.subarray(j, j+frame_size))
    }
    return function processHopData(data) {
      var i, j, k
      buffer.set(data, ptr)
      ptr += data.length
      for(i=0, j=0; j+frame_size<=ptr; ++i, j+=hop_size) {
        onFrame(frame_slices[i])
      }
      for(k=0; j<ptr; ) {
        buffer.set(frame_slices[i], k)
        var nhops = Math.ceil((k+frame_size) / hop_size)|0
        var nptr  = nhops * hop_size
        if(nptr !== k+frame_size) {
          nhops -= 1
          nptr -= hop_size
        }
        i += nhops
        j += (nptr - k)
        k  = nptr
      }
      ptr += k - j
    }
  }
docs: Slices a stream of frames into a stream of overlapping windows The size of each frame is the same as the size o