static CloseableItIt<short[]> decodeWAVToMonoSamples_iterator(File wavFile) {
  ret decodeWAVToMonoSamples_iterator(wavFile, 4096);
}

// windowSize is in seconds
static CloseableItIt<short[]> decodeWAVToMonoSamples_iterator(File wavFile, double windowSize) ctex {
  WAVDecoder decoder = new(newFileInputStream(wavFile));
  ret decodeWAVToMonoSamples_iterator(decoder, iround(windowSize*decoder.sampleRate));
}

// windowSize is in samples
static CloseableItIt<short[]> decodeWAVToMonoSamples_iterator(File wavFile, int windowSize) ctex {
  WAVDecoder decoder = new(newFileInputStream(wavFile));
  ret decodeWAVToMonoSamples_iterator(decoder, windowSize);
}

static CloseableItIt<short[]> decodeWAVToMonoSamples_iterator(WAVDecoder decoder, int windowSize) ctex {
  ret iteratorFromFunction_f0_autoCloseable(func -> short[] {
    short[] buf = new short[windowSize];
    int n = decoder.readMonoSamples(buf);
    if (n <= 0) null;
    ret subArray(buf, 0, n);
  }, decoder);
}