-
Notifications
You must be signed in to change notification settings - Fork 269
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Any Plugin
cannot process stereo buffers containing only 2 samples
#336
Comments
Adding to this: import numpy as np
from pedalboard import AudioFile
with AudioFile("test.wav", "w", 48000, 1) as f:
f.write(np.random.rand(1, 1)) Also fails for the same ChannelLayout detection. Of course this is an unrealistic minimal example, one has to consider instead a process loop where a chunk gets written to file: in that scenario, this bug can happen if the processing/stream size combination causes an iteration with a chunk of only one sample. While in the 2x2 scenario the workaround would be to write one sample at a time (i.e. two buffers of shape (2, 1)), in the 1x1 no workaround is possible (writing an additional sample may not be acceptable if client code requires invariance of number of samples between pre-process and post-process). |
Thanks for the super-detailed and well written bug report @mttbernardini! You're totally right: the auto-detection of channel layout is a bit of a pain. I see a couple fixes that could be made, like you suggest:
|
Thank you for your reply @psobot. I like the solution you proposed on point (2) and I believe having a scenario in which a I'm not sure I follow you for point (1) though. The behaviour of Let me know your thoughts and if you'd like me to implement this. |
Problem
I'm developing a DSP graph using
pedalboard
. It basically consist of reading arbitrary audio files at configurable chunk size, processing them with aChain
and then writing back the output to file system. While writing unit tests I hit this puzzling behaviour that prevents me from moving forward.If any
Plugin.process(...)
implementation receives a buffer that has shape(2, 2)
, it will fail withRuntimeError: Unable to determine channel layout from shape!
This is not really an uncommon scenario, and can even be replicated with the first example provided in the Pedalboard website, by having a stereo
some-file.wav
at sample ratex
that is exactlyx+2
samples long. In general, if any chosen buffer reading size happens to cause a reminder of 2 samples over the audio file being read, the square matrix condition is met and no processing can be done in pedalboard°.Stack trace
Inspecting the
pedalboard
source code, I recreated the C++ call stack, which is not shown in Python (most recent call last):py::array_t<float> process(...)
defined inprocess.h
pedalboard/pedalboard/process.h
Lines 260 to 261 in 273eb53
py::array_t<float> processFloat32(...)
defined inprocess.h
pedalboard/pedalboard/process.h
Line 166 in 273eb53
template <typename T> ChannelLayout detectChannelLayout(...)
defined inBufferUtils.h
pedalboard/pedalboard/BufferUtils.h
Lines 44 to 45 in 273eb53
Specifically, the last line is hit whenever
Plugin.process(...)
is called with a buffer that has shape(n, n)
(i.e. a square matrix).Proposed solution
Is it possible to change the function signature of
Plugin.process(...)
so that it can accept an explicitChannelLayout
? The semantics would be:None
(default when not provided), then autodetect (existing behaviour, backwards compatible)Since
ReadableAudioFile.read()
reliably returns non-interleaved buffers, then to me it makes sense to enforce the same layout when processing, leaving auto-detection for other scenarios / backwards compatibility?I can help implementing this if needed 👍
° the workaround would be to check the buffer and if squared then append an extra padding sample to make it rectangular, but this seems less than ideal and unnecessarily complicates client code.
The text was updated successfully, but these errors were encountered: