@gsagostinho when you tell it to read between 2 indices in a table it will output some value in between the values of those 2 indices generally, like a crude form of resampling.
It allows one to give tabread4 values such as, say, 1.25. Tabread4~ can resample the integer sample values to give values in between the original integer indices, and in the case of 1.25 the sample in place 1 will be weighted more heavily than the sample in place 2. samples 0 and 3 would also be used for the weighting though, in order to get the cubic polynomial. (that is why one must read starting from sample 1 rather than sample 0 when using tabread4)
(tabread4 uses lagrange interpolation:
https://ccrma.stanford.edu/~jos/pasp/Lagrange_Interpolation.html)
That is what I mean by being able to read in-between samples: it is valid to pass non-integer sample values and receive a "meaningful" output.
This is also what makes it possible to use tabread4~ to play back samples at a slower or faster rate that isn't some integer multiple of it's sample rate, because you can give it (for instance) 1, 1.5, 2, 2.5 etc. If tabread4 could only read integers and was given the same input it would go 1, 1, 2, 2 etc. This is what regular tabread~ does though.