diff --git a/Sources/Max/o.scofo~.cpp b/Sources/Max/o.scofo~.cpp index cbd7950..527acda 100644 --- a/Sources/Max/o.scofo~.cpp +++ b/Sources/Max/o.scofo~.cpp @@ -1,77 +1,77 @@ -#include -#include +#include +#include #include static t_class *oscofo_class = nullptr; class MaxOScofo { - public: - t_pxobject MaxObject; + public: + t_pxobject MaxObject; - // Clock - t_clock *ClockEvent; - t_clock *ClockInfo; + // Clock + t_clock *ClockEvent; + t_clock *ClockInfo; - // OScofo + // OScofo OScofo::OScofo *OpenScofo; - int Event; - float Tempo; - int EventIndex; - bool Following; - std::string PatchDir; + int Event; + float Tempo; + int EventIndex; + bool Following; + std::string PatchDir; - int CurrentEvent; - bool ScoreLoaded; - std::vector Info; - bool InfoLoaded = true; + int CurrentEvent; + bool ScoreLoaded; + std::vector Info; + bool InfoLoaded = true; - // Audio - std::vector inBuffer; - float FFTSize; - float HopSize; - float BlockSize; - float Sr; - unsigned BlockIndex; + // Audio + std::vector inBuffer; + float FFTSize; + float HopSize; + float BlockSize; + float Sr; + unsigned BlockIndex; - // Outlet - void *EventOut; - void *TempoOut; - void *InfoOut; + // Outlet + void *EventOut; + void *TempoOut; + void *InfoOut; }; // ───────────────────────────────────── -static void oscofo_assist(MaxOScofo *x, void *b, long m, long a, char *s){ - if (m == ASSIST_OUTLET){ - switch (a){ - case 0: - snprintf(s, 256, "Score Event Index"); - break; - case 1: - snprintf(s, 256, "Tempo in BPM of the current performance"); - break; - case 2: - snprintf(s, 256, "List of values defined by @info attribute"); - break; +static void oscofo_assist(MaxOScofo *x, void *b, long m, long a, char *s) { + if (m == ASSIST_OUTLET) { + switch (a) { + case 0: + snprintf(s, 256, "Score Event Index"); + break; + case 1: + snprintf(s, 256, "Tempo in BPM of the current performance"); + break; + case 2: + snprintf(s, 256, "List of values defined by @info attribute"); + break; } } else { - switch (a){ - case 0: - snprintf(s, 256, "Signal Input"); - break; - } - } + switch (a) { + case 0: + snprintf(s, 256, "Signal Input"); + break; + } + } } // ───────────────────────────────────── -static void oscofo_score(MaxOScofo *x, t_symbol *s){ +static void oscofo_score(MaxOScofo *x, t_symbol *s) { x->ScoreLoaded = false; - bool WasFollowing = x->Following; - x->Following = false; + bool WasFollowing = x->Following; + x->Following = false; std::string CompletePath = x->PatchDir; CompletePath += "/"; CompletePath += s->s_name; - object_post((t_object *)x, "Loading score %s", CompletePath.c_str()); + object_post((t_object *)x, "Loading score %s", CompletePath.c_str()); bool ok; try { ok = x->OpenScofo->ParseScore(CompletePath.c_str()); @@ -79,14 +79,14 @@ static void oscofo_score(MaxOScofo *x, t_symbol *s){ object_error((t_object *)x, "Error parsing score, %s.", e.what()); return; } - - x->ScoreLoaded = true; - x->Following = WasFollowing; - object_post((t_object *)x, "Score loaded"); + + x->ScoreLoaded = true; + x->Following = WasFollowing; + object_post((t_object *)x, "Score loaded"); } // ───────────────────────────────────── -static void oscofo_set(MaxOScofo *x, t_symbol *s, long argc, t_atom *argv){ +static void oscofo_set(MaxOScofo *x, t_symbol *s, long argc, t_atom *argv) { if (argv[0].a_type != A_SYM) { object_error((t_object *)x, "First argument must be a symbol"); return; @@ -94,11 +94,11 @@ static void oscofo_set(MaxOScofo *x, t_symbol *s, long argc, t_atom *argv){ std::string method = atom_getsym(argv)->s_name; if (method == "sigma") { - float sigma = atom_getfloat(argv + 1); + float sigma = atom_getfloat(argv + 1); x->OpenScofo->SetPitchTemplateSigma(sigma); object_post((t_object *)x, "Sigma set to %f", sigma); } else if (method == "harmonics") { - long harmonics = atom_getlong(argv + 1); + long harmonics = atom_getlong(argv + 1); x->OpenScofo->SetHarmonics(harmonics); object_post((t_object *)x, "Using pitch template with %d harmonics", harmonics); } else if (method == "threshold") { @@ -106,38 +106,38 @@ static void oscofo_set(MaxOScofo *x, t_symbol *s, long argc, t_atom *argv){ x->OpenScofo->SetdBTreshold(dB); object_post((t_object *)x, "Treshold set to %f", atom_getfloat(argv + 1)); } else if (method == "tunning") { - float tunning = atom_getfloat(argv + 1); + float tunning = atom_getfloat(argv + 1); x->OpenScofo->SetTunning(tunning); - object_post((t_object *)x, "Tunning set to %f", tunning); + object_post((t_object *)x, "Tunning set to %f", tunning); } else if (method == "event") { - long f = atom_getlong(argv + 1); + long f = atom_getlong(argv + 1); x->CurrentEvent = f; x->OpenScofo->SetCurrentEvent(f); - object_post((t_object *)x, "Event set to %d", (int)f); + object_post((t_object *)x, "Event set to %d", (int)f); } else { object_error((t_object *)x, "[follower~] Unknown method"); - } + } } // ───────────────────────────────────── static void oscofo_following(MaxOScofo *x, long f) { - if (!x->OpenScofo->ScoreIsLoaded()) { - object_error((t_object *)x, "Score not loaded"); - return; - } - if (f == 1) { - x->Following = true; - object_post((t_object *)x, "Following!"); - } else { - object_post((t_object *)x, "Not Following!"); - x->Following = false; - } + if (!x->OpenScofo->ScoreIsLoaded()) { + object_error((t_object *)x, "Score not loaded"); + return; + } + if (f == 1) { + x->Following = true; + object_post((t_object *)x, "Following!"); + } else { + object_post((t_object *)x, "Not Following!"); + x->Following = false; + } } // ───────────────────────────────────── static void oscofo_start(MaxOScofo *x) { - x->Following = false; - if (!x->OpenScofo->ScoreIsLoaded()) { + x->Following = false; + if (!x->OpenScofo->ScoreIsLoaded()) { object_error((t_object *)x, "Score not loaded"); return; } @@ -151,44 +151,44 @@ static void oscofo_start(MaxOScofo *x) { // ───────────────────────────────────── static void oscofo_tickevent(MaxOScofo *x) { if (x->Event != 0) { - outlet_float(x->TempoOut, x->OpenScofo->GetLiveBPM()); - outlet_float(x->EventOut, x->Event); + outlet_float(x->TempoOut, x->OpenScofo->GetLiveBPM()); + outlet_float(x->EventOut, x->Event); } } // ───────────────────────────────────── static void oscofo_tickinfo(MaxOScofo *x) { - if (x->InfoLoaded) { - t_atom Info[x->Info.size()]; - for (int i = 0; i < x->Info.size(); i++) { - double value = 0; - if (x->Info[i] == "kappa") { - value = x->OpenScofo->GetKappa(); - } else if (x->Info[i] == "db") { - value = x->OpenScofo->GetdBValue(); - } - atom_setfloat(Info, value); - } - outlet_list(x->InfoOut, nullptr, x->Info.size(), Info); - return; - } + if (x->InfoLoaded) { + t_atom Info[x->Info.size()]; + for (int i = 0; i < x->Info.size(); i++) { + double value = 0; + if (x->Info[i] == "kappa") { + value = x->OpenScofo->GetKappa(); + } else if (x->Info[i] == "db") { + value = x->OpenScofo->GetdBValue(); + } + atom_setfloat(Info, value); + } + outlet_list(x->InfoOut, nullptr, x->Info.size(), Info); + return; + } } // ───────────────────────────────────── -static void oscofo_perform64(MaxOScofo *x, t_object *dsp64, double **ins, long numins, double **outs, long numouts, long sampleframes, long flags, void *userparam) -{ - if (!x->OpenScofo->ScoreIsLoaded() || !x->Following) { - return; +static void oscofo_perform64(MaxOScofo *x, t_object *dsp64, double **ins, long numins, double **outs, long numouts, long sampleframes, long flags, + void *userparam) { + if (!x->OpenScofo->ScoreIsLoaded() || !x->Following) { + return; } - x->BlockIndex += sampleframes; + x->BlockIndex += sampleframes; std::copy(x->inBuffer.begin() + sampleframes, x->inBuffer.end(), x->inBuffer.begin()); std::copy(ins[0], ins[0] + sampleframes, x->inBuffer.end() - sampleframes); - if (x->BlockIndex != x->HopSize) { - return; - } + if (x->BlockIndex != x->HopSize) { + return; + } - x->BlockIndex = 0; + x->BlockIndex = 0; bool ok = x->OpenScofo->ProcessBlock(x->inBuffer); if (!ok) { return; @@ -201,87 +201,86 @@ static void oscofo_perform64(MaxOScofo *x, t_object *dsp64, double **ins, long n x->Event = Event; clock_delay(x->ClockEvent, 0); } - clock_delay(x->ClockInfo, 0); + clock_delay(x->ClockInfo, 0); } // ───────────────────────────────────── -static void oscofo_dsp64(MaxOScofo *x, t_object *dsp64, short *count, double samplerate, long maxvectorsize, long flags){ - x->BlockSize = maxvectorsize; +static void oscofo_dsp64(MaxOScofo *x, t_object *dsp64, short *count, double samplerate, long maxvectorsize, long flags) { + x->BlockSize = maxvectorsize; x->BlockIndex = 0; x->inBuffer.resize(x->FFTSize, 0.0f); - object_method(dsp64, gensym("dsp_add64"), x, oscofo_perform64, 0, NULL); + object_method(dsp64, gensym("dsp_add64"), x, oscofo_perform64, 0, NULL); } // ───────────────────────────────────── -static void *oscofo_new(t_symbol *s, long argc, t_atom *argv){ - MaxOScofo *x = (MaxOScofo *)object_alloc(oscofo_class); - if (!x) { - object_error((t_object *)x, "Error creating object"); - return nullptr; - } - double overlap = 4; - for (int i = 0; i < argc; i++) { +static void *oscofo_new(t_symbol *s, long argc, t_atom *argv) { + MaxOScofo *x = (MaxOScofo *)object_alloc(oscofo_class); + if (!x) { + object_error((t_object *)x, "Error creating object"); + return nullptr; + } + double overlap = 4; + for (int i = 0; i < argc; i++) { if (argv[i].a_type == A_SYM || argc >= i + 1) { std::string argument = std::string(atom_getsym(&argv[i])->s_name); - if (argument == "@info") { - x->InfoOut = outlet_new(x, "list"); - int k = 0; - for (int j = i + 1; j < argc; j++) { - if (argv[j].a_type == A_SYM) { - x->Info.push_back(atom_getsym(&argv[j])->s_name); - } - x->InfoLoaded = true; - k++; - } - - } + if (argument == "@info") { + x->InfoOut = outlet_new(x, "list"); + int k = 0; + for (int j = i + 1; j < argc; j++) { + if (argv[j].a_type == A_SYM) { + x->Info.push_back(atom_getsym(&argv[j])->s_name); + } + x->InfoLoaded = true; + k++; + } + } } } - dsp_setup((t_pxobject *)x, 1); - - x->TempoOut = outlet_new(x, "float"); // tempo outlet - x->EventOut = outlet_new(x, "int"); // event outlet - x->ClockEvent = clock_new(x, (method)oscofo_tickevent); - x->ClockInfo = clock_new(x, (method)oscofo_tickinfo); - x->FFTSize = 4096.0f; - x->HopSize = 512.0f; - x->Sr = sys_getsr(); - x->Following = false; - x->Event = -1; - - char PatchPath[MAX_PATH_CHARS]; - short PathId = path_getdefault(); - path_toabsolutesystempath(PathId, NULL, PatchPath); - x->PatchDir = PatchPath; + dsp_setup((t_pxobject *)x, 1); + + x->TempoOut = outlet_new(x, "float"); // tempo outlet + x->EventOut = outlet_new(x, "int"); // event outlet + x->ClockEvent = clock_new(x, (method)oscofo_tickevent); + x->ClockInfo = clock_new(x, (method)oscofo_tickinfo); + x->FFTSize = 4096.0f; + x->HopSize = 1024.0f; + x->Sr = sys_getsr(); + x->Following = false; + x->Event = -1; - x->OpenScofo = new OScofo::OScofo(x->Sr, x->FFTSize, x->HopSize); - return (x); + char PatchPath[MAX_PATH_CHARS]; + short PathId = path_getdefault(); + path_toabsolutesystempath(PathId, NULL, PatchPath); + x->PatchDir = PatchPath; + + x->OpenScofo = new OScofo::OScofo(x->Sr, x->FFTSize, x->HopSize); + return (x); } // ───────────────────────────────────── -static void oscofo_free(MaxOScofo *x){ - delete x->OpenScofo; +static void oscofo_free(MaxOScofo *x) { + delete x->OpenScofo; } // ───────────────────────────────────── -void ext_main(void *r){ - t_class *c = class_new("o.scofo~", (method)oscofo_new, (method)dsp_free, (long)sizeof(MaxOScofo), 0L, A_GIMME, 0); +void ext_main(void *r) { + t_class *c = class_new("o.scofo~", (method)oscofo_new, (method)dsp_free, (long)sizeof(MaxOScofo), 0L, A_GIMME, 0); - // message methods - class_addmethod(c, (method)oscofo_set, "set", A_GIMME, 0); - class_addmethod(c, (method)oscofo_score, "score", A_SYM, 0); - class_addmethod(c, (method)oscofo_following, "follow", A_LONG, 0); - class_addmethod(c, (method)oscofo_start, "start", A_NOTHING, 0); + // message methods + class_addmethod(c, (method)oscofo_set, "set", A_GIMME, 0); + class_addmethod(c, (method)oscofo_score, "score", A_SYM, 0); + class_addmethod(c, (method)oscofo_following, "follow", A_LONG, 0); + class_addmethod(c, (method)oscofo_start, "start", A_NOTHING, 0); - // user methods - class_addmethod(c, (method)stdinletinfo, "inletinfo", A_CANT, 0); - class_addmethod(c, (method)oscofo_assist, "assist", A_CANT, 0); + // user methods + class_addmethod(c, (method)stdinletinfo, "inletinfo", A_CANT, 0); + class_addmethod(c, (method)oscofo_assist, "assist", A_CANT, 0); - // dsp methods - class_addmethod(c, (method)oscofo_dsp64, "dsp64", A_CANT, 0); + // dsp methods + class_addmethod(c, (method)oscofo_dsp64, "dsp64", A_CANT, 0); - // register the class - class_dspinit(c); - class_register(CLASS_BOX, c); - oscofo_class = c; -} \ No newline at end of file + // register the class + class_dspinit(c); + class_register(CLASS_BOX, c); + oscofo_class = c; +} diff --git a/Sources/PureData/o.scofo~.cpp b/Sources/PureData/o.scofo~.cpp index 48c8068..cae17f6 100644 --- a/Sources/PureData/o.scofo~.cpp +++ b/Sources/PureData/o.scofo~.cpp @@ -1,8 +1,4 @@ -#include -#include -#include - -#include "../OScofo.hpp" +#include #include @@ -11,40 +7,64 @@ static t_class *OScofoObj; // ───────────────────────────────────── class PdOScofo { public: - t_object xObj; + t_object PdObject; t_sample Sample; - std::vector inBuffer; - t_clock *Clock; - OScofo::OScofo *OpenScofo; + // Clock + t_clock *ClockEvent; + t_clock *ClockInfo; + + // OScofo + OScofo::OScofo *OpenScofo; int Event; + float Tempo; + int EventIndex; + bool Following; std::string PatchDir; - // Testing - bool Testing = false; - - // Score - bool ScoreLoaded = false; - bool Following = false; - int CurrentEvent = 0; - std::vector PitchTemplate; + int CurrentEvent; + bool ScoreLoaded; + std::vector Info; + bool InfoLoaded = true; // Audio - double BlockIndex; - double BlockSize; - double HopSize; - double FFTSize; - double Sr; - - t_outlet *EventIndex; - t_outlet *Tempo; - t_outlet *Kappa; - t_outlet *Debug; + std::vector inBuffer; + float FFTSize; + float HopSize; + float BlockSize; + float Sr; + unsigned BlockIndex; + + // Outlet + t_outlet *EventOut; + t_outlet *TempoOut; + t_outlet *InfoOut; }; // ───────────────────────────────────── -static void Set(PdOScofo *x, t_symbol *s, int argc, t_atom *argv) { - LOGE() << "PureData Set Methoda"; +static void oscofo_score(PdOScofo *x, t_symbol *s) { + x->ScoreLoaded = false; + std::string CompletePath = x->PatchDir; + CompletePath += "/"; + CompletePath += s->s_name; + post("[o.scofo~] Loading score %s", CompletePath.c_str()); + bool ok; + try { + ok = x->OpenScofo->ParseScore(CompletePath.c_str()); + } catch (std::exception &e) { + pd_error(nullptr, "[o.scofo~] Error parsing score, %s.", e.what()); + return; + } + if (ok) { + x->ScoreLoaded = true; + post("[o.scofo~] Score loaded"); + } else { + pd_error(nullptr, "[o.scofo~] Error loading score"); + } +} + +// ───────────────────────────────────── +static void oscofo_set(PdOScofo *x, t_symbol *s, int argc, t_atom *argv) { if (argv[0].a_type != A_SYMBOL) { pd_error(x, "[follower~] First argument of set method must be a symbol"); return; @@ -60,15 +80,6 @@ static void Set(PdOScofo *x, t_symbol *s, int argc, t_atom *argv) { double dB = atom_getfloat(argv + 1); x->OpenScofo->SetdBTreshold(dB); post("[follower~] Treshold set to %f", atom_getfloat(argv + 1)); - } else if (method == "time") { - std::string submethod = atom_getsymbol(argv + 1)->s_name; - if (submethod == "accum") { - x->OpenScofo->SetTimeAccumFactor(atom_getfloat(argv + 2)); - printf("[follower~] Time accumulation set to %.4f\n", atom_getfloat(argv + 2)); - } else if (submethod == "coupling") { - x->OpenScofo->SetTimeCouplingStrength(atom_getfloat(argv + 2)); - printf("[follower~] Time coupling set to %.4f\n", atom_getfloat(argv + 2)); - } } else if (method == "tunning") { x->OpenScofo->SetTunning(atom_getfloat(argv + 1)); @@ -79,82 +90,62 @@ static void Set(PdOScofo *x, t_symbol *s, int argc, t_atom *argv) { } else { pd_error(x, "[follower~] Unknown method"); } - LOGE() << "PureData End Set Methoda"; } // ───────────────────────────────────── -static void Score(PdOScofo *x, t_symbol *s) { - LOGE() << "PureData Score Method"; - x->ScoreLoaded = false; - std::string CompletePath = x->PatchDir; - CompletePath += "/"; - CompletePath += s->s_name; - std::ifstream file(CompletePath); - if (!file) { - pd_error(nullptr, "[o.scofo~] Score file not found"); - return; - } - bool ok; - try { - ok = x->OpenScofo->ParseScore(CompletePath.c_str()); - } catch (std::exception &e) { - pd_error(nullptr, "[o.scofo~] Error parsing score, %s.", e.what()); +static void oscofo_following(PdOScofo *x, t_float f) { + if (!x->OpenScofo->ScoreIsLoaded()) { + pd_error(x, "[follower~] Score not loaded"); return; } - if (ok) { - x->ScoreLoaded = true; - post("[o.scofo~] Score loaded"); + if (f == 1) { + x->Following = true; } else { - pd_error(nullptr, "[o.scofo~] Error loading score"); + x->Following = false; } - LOGE() << "PureData end Score Method"; } // ───────────────────────────────────── -static void Start(PdOScofo *x) { - LOGE() << "PureData Start Method"; +static void oscofo_start(PdOScofo *x) { if (!x->OpenScofo->ScoreIsLoaded()) { pd_error(nullptr, "[o.scofo~] Score not loaded"); return; } x->CurrentEvent = -1; x->OpenScofo->SetCurrentEvent(-1); - outlet_float(x->Tempo, x->OpenScofo->GetLiveBPM()); - outlet_float(x->EventIndex, 0); + outlet_float(x->TempoOut, x->OpenScofo->GetLiveBPM()); + outlet_float(x->EventOut, 0); x->Following = true; - - LOGE() << "PureData end Start Method"; } // ───────────────────────────────────── -static void Follow(PdOScofo *x, t_float f) { - if (!x->OpenScofo->ScoreIsLoaded()) { - pd_error(x, "[follower~] Score not loaded"); - return; - } - if (f == 1) { - x->Following = true; - } else { - x->Following = false; +static void oscofo_tickevent(PdOScofo *x) { + if (x->Event != 0) { + outlet_float(x->TempoOut, x->OpenScofo->GetLiveBPM()); + outlet_float(x->EventOut, x->Event); } } // ───────────────────────────────────── -static void ClockTick(PdOScofo *x) { - LOGE() << "PureData ClockTick"; - if (x->Event != 0) { - if (x->Kappa) { - outlet_float(x->Kappa, x->OpenScofo->GetKappa()); +static void oscofo_tickinfo(PdOScofo *x) { + if (x->InfoLoaded) { + t_atom Info[x->Info.size()]; + for (int i = 0; i < x->Info.size(); i++) { + double value = 0; + if (x->Info[i] == "kappa") { + value = x->OpenScofo->GetKappa(); + } else if (x->Info[i] == "db") { + value = x->OpenScofo->GetdBValue(); + } + SETFLOAT(&Info[i], value); } - outlet_float(x->Tempo, x->OpenScofo->GetLiveBPM()); - outlet_float(x->EventIndex, x->Event); + outlet_list(x->InfoOut, nullptr, x->Info.size(), Info); + return; } - - LOGE() << "PureData ClockTick end"; } // ───────────────────────────────────── -static t_int *DspPerform(t_int *w) { +static t_int *oscofo_perform(t_int *w) { PdOScofo *x = (PdOScofo *)(w[1]); t_sample *in = (t_sample *)(w[2]); int n = static_cast(w[3]); @@ -182,85 +173,80 @@ static t_int *DspPerform(t_int *w) { } if (Event != x->Event) { x->Event = Event; - clock_delay(x->Clock, 0); + clock_delay(x->ClockEvent, 0); } + clock_delay(x->ClockInfo, 0); return (w + 4); } // ───────────────────────────────────── -static void AddDsp(PdOScofo *x, t_signal **sp) { - LOGE() << "AddDsp"; +static void oscofo_adddsp(PdOScofo *x, t_signal **sp) { x->BlockSize = sp[0]->s_n; x->BlockIndex = 0; x->inBuffer.resize(x->FFTSize, 0.0f); - dsp_add(DspPerform, 3, x, sp[0]->s_vec, sp[0]->s_n); - LOGE() << "AddDsp Successful"; + dsp_add(oscofo_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); } // ───────────────────────────────────── -static void *NewOScofo(t_symbol *s, int argc, t_atom *argv) { - LOGE() << "NewOScofo"; - +static void *oscofo_new(t_symbol *s, int argc, t_atom *argv) { PdOScofo *x = (PdOScofo *)pd_new(OScofoObj); - x->EventIndex = outlet_new(&x->xObj, &s_float); - x->Tempo = outlet_new(&x->xObj, &s_float); - x->FFTSize = 4096.0f; - x->HopSize = 1024.0f; - x->Sr = sys_getsr(); + if (!x) { + pd_error(nullptr, "[o.scofo~] Error creating object"); + return nullptr; + } + + x->EventOut = outlet_new(&x->PdObject, &s_float); // event outlet + x->TempoOut = outlet_new(&x->PdObject, &s_float); // tempo outlet + double overlap = 4; for (int i = 0; i < argc; i++) { if (argv[i].a_type == A_SYMBOL || argc >= i + 1) { std::string argument = std::string(atom_getsymbol(&argv[i])->s_name); - if (argument == "-w") { - if (argv[i + 1].a_type == A_FLOAT) { - x->FFTSize = atom_getfloat(&argv[i + 1]); - i++; - } - } - if (argument == "-o") { - if (argv[i + 1].a_type == A_FLOAT) { - overlap = atom_getfloat(&argv[i + 1]); - i++; + if (argument == "-info" || argument == "@info") { + x->InfoOut = outlet_new(&x->PdObject, &s_list); + int k = 0; + for (int j = i + 1; j < argc; j++) { + if (argv[j].a_type == A_SYMBOL) { + x->Info.push_back(atom_getsymbol(&argv[j])->s_name); + } + x->InfoLoaded = true; + k++; } } - if (argument == "-kappa") { - x->Kappa = outlet_new(&x->xObj, &s_float); - // TODO: Output value of SyncStrengh - } } } - if (overlap != 4) { - x->HopSize = x->FFTSize / overlap; - } + + x->ClockEvent = clock_new(x, (t_method)oscofo_tickevent); + x->ClockInfo = clock_new(x, (t_method)oscofo_tickinfo); + x->FFTSize = 4096.0f; + x->HopSize = 1024.0f; + x->Sr = sys_getsr(); + x->Following = false; + x->Event = -1; + t_canvas *canvas = canvas_getcurrent(); x->PatchDir = canvas_getdir(canvas)->s_name; - x->Clock = clock_new(x, (t_method)ClockTick); - x->Event = 0; - x->OpenScofo = new OScofo::OScofo(x->Sr, x->FFTSize, x->HopSize); - x->Following = false; - - LOGE() << "Returning NewOScofo"; - return x; + return (x); } // ───────────────────────────────────── -static void *FreeOScofo(PdOScofo *x) { - LOGE() << "Start Free of NewOScofo"; +static void oscofo_free(PdOScofo *x) { delete x->OpenScofo; - LOGE() << "End Free of NewOScofo"; - return nullptr; } // ───────────────────────────────────── extern "C" void setup_o0x2escofo_tilde(void) { - OScofoObj = class_new(gensym("o.scofo~"), (t_newmethod)NewOScofo, (t_method)FreeOScofo, sizeof(PdOScofo), CLASS_DEFAULT, A_GIMME, 0); + OScofoObj = class_new(gensym("o.scofo~"), (t_newmethod)oscofo_new, (t_method)oscofo_free, sizeof(PdOScofo), CLASS_DEFAULT, A_GIMME, 0); + + // message methods + class_addmethod(OScofoObj, (t_method)oscofo_score, gensym("score"), A_SYMBOL, 0); + class_addmethod(OScofoObj, (t_method)oscofo_start, gensym("start"), A_NULL, 0); + class_addmethod(OScofoObj, (t_method)oscofo_following, gensym("follow"), A_FLOAT, 0); + class_addmethod(OScofoObj, (t_method)oscofo_set, gensym("set"), A_GIMME, 0); + // dsp CLASS_MAINSIGNALIN(OScofoObj, PdOScofo, Sample); - class_addmethod(OScofoObj, (t_method)AddDsp, gensym("dsp"), A_CANT, 0); - class_addmethod(OScofoObj, (t_method)Score, gensym("score"), A_SYMBOL, 0); - class_addmethod(OScofoObj, (t_method)Start, gensym("start"), A_NULL, 0); - class_addmethod(OScofoObj, (t_method)Follow, gensym("follow"), A_FLOAT, 0); - class_addmethod(OScofoObj, (t_method)Set, gensym("set"), A_GIMME, 0); + class_addmethod(OScofoObj, (t_method)oscofo_adddsp, gensym("dsp"), A_CANT, 0); }