Audio processing is done by calling the run method on each object in the signal chain.

for osc in self.oscillators.iter_mut() { osc.run(); } self.mixer.run(); self.env.run();

This allows for processing to be moved to a different thread if desired