Puredata and Max/MSP are great, but programmed in a visual dataflow style rather than a source-code style. Imo that makes some things much more intuitive and other things really complex.
The visual dataflow style is especially good for interactive stuff, where you're taking inputs and running them through chains of synths and filters, but it gets really hairy if you want to do non-interactive composition. People use it for that too, but you end up with huge banks of delay lines to simulate control-flow constructs, which in other languages could've just been a for loop.
Yeah ! So much this. Iterations / branches / arrays ... in Max is pure nightmare. Supercollider is a breeze to work with hundreds / thousands of audio buffers and the multichannel / polyphonic capabilities are incredible. I found it very hard to build a stable complex patch in Pd / Max if you are not that much experienced with the opaque control flows.
> but you end up with huge banks of delay lines to simulate control-flow constructs
I'm not sure what you're referring to. Pd has a whole category of control objects for routing arbitrary message data. This includes branching and looping in zero logical time.
The visual dataflow style is especially good for interactive stuff, where you're taking inputs and running them through chains of synths and filters, but it gets really hairy if you want to do non-interactive composition. People use it for that too, but you end up with huge banks of delay lines to simulate control-flow constructs, which in other languages could've just been a for loop.