If you’ve used
SoundFile.channelPeaks you’ve probably discovered how slow it is. It seems it’s so slow because it’s a sclang loop.
I found a much quicker way to do the same using
Signal.peak which has an underlying primitive (C++) implementation. The only slight inconvenience is that
peak only works on a single channel data.
Signal in general didn’t seem to get much love as it doesn’t really have a concept of channels. And it’s not feasible to load just one channel of a file on the client. While
readChannel there’s no equivalent on the client.
But it turns out that even copying arrays as slices is much faster (probably done as a primitive) than any sclang loop. So something like
f = SoundFile.openRead(...) // stereo file here z = Signal.newClear(f.numFrames * f.numChannels) f.readData(z) z.peak // single value (largest amp of both channels) z.numChannels // 1 z.numChannels = 2 // can't set though!! z[0, 2..].peak // works fast and per left channel! z[1, 3..].peak // ibid, right
is approximately an order of magnitude faster than