some more norns/max dev questions for this thread:
I’ve been spending the last few days studying up and working on an external for softcut (using MaxCpp per @zebra’s suggestion above). It’s been pretty approachable, I think I’m almost ready to get a successful build but I’m getting these kind of confounding Undefined Symbol errors from the linker.

That looks like it’s coming from the sofcut code, but we know that works so I’m wondering if it’s somewhere in my Xcode target config or c++ versions or somewhere on that side of thing. From what I’ve gathered this error is supposed to mean a function is declared and not defined, but seems like it can also point to trickier issues.
This is the only code I’ve actually written, doesn’t really seem like it’s the source of the problem though.
Summary
#include "maxcpp6.h"
#include "softcut/SoftCut.h"
#include "softcut/Types.h"
#include "Utilities.h"
// inherit from the MSP base class, template-specialized for myself:
class Softcut_msp : public MspCpp6<Softcut_msp> {
public:
enum { MaxBlockFrames = 2048, NumVoices = 6 };
enum { BufFrames = 16777216 };
softcut::SoftCut<NumVoices> cut;
float buf[2][BufFrames];
bool enabled[NumVoices];
softcut::phase_t quantPhase[NumVoices];
Softcut_msp(t_symbol * sym, long ac, t_atom * av) {
setupIO(NumVoices, NumVoices);
post("object created");
for(int i=0; i<NumVoices; ++i) {
cut.setVoiceBuffer(i, buf[i&1], BufFrames);
}
}
~Softcut_msp() {
post("object freed");
}
// methods:
void bang(long inlet) {
post("bang in inlet %i!", inlet);
}
void test(long inlet, t_symbol * s, long ac, t_atom * av) {
post("%s in inlet %i (%i args)", s->s_name, inlet, ac);
}
// default signal processing method is called 'perform'
void perform(double **ins, long numins, double **outs, long numouts, long sampleframes) {
// example code to invert inputs
for (long v = 0; v < numouts; v++) {
double * in = ins[v];
double * out = outs[v];
if (!enabled[v]) {
continue;
}
cut.processBlock(v, (const float *) in, (float*) out, (int) sampleframes);
}
}
};
C74_EXPORT int main(void) {
// create a class with the given name:
Softcut_msp::makeMaxClass("softcut~");
REGISTER_METHOD(Softcut_msp, bang);
REGISTER_METHOD_GIMME(Softcut_msp, test);
}
anywho, I’ll keep digging but wanted to post in case anyone had any quick pointers