17 #include "TTClassWrapperMax.h"
20 #include "ext_strings.h"
21 #include "commonsyms.h"
26 #define MAX_NUM_CHANNELS 32
43 void *fade_new(t_symbol *s,
long argc, t_atom *argv);
44 t_int *fade_perform1(t_int *w);
45 t_int *fade_perform2(t_int *w);
46 void fade_dsp(t_fade *x, t_signal **sp,
short *count);
47 void fade_dsp64(t_fade *x, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags);
48 void fade_assist(t_fade *x,
void *b,
long m,
long a,
char *s);
49 void fade_float(t_fade *x,
double value );
50 void fade_free(t_fade *x);
51 t_max_err attr_set_position(t_fade *x,
void *attr,
long argc, t_atom *argv);
52 t_max_err attr_set_shape(t_fade *x,
void *attr,
long argc, t_atom *argv);
53 t_max_err attr_set_mode(t_fade *x,
void *attr,
long argc, t_atom *argv);
54 t_int *fade_perform_stereo_1(t_int *w);
55 t_int *fade_perform_stereo_2(t_int *w);
56 void fade_perform64_1(t_fade *x, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam);
57 void fade_perform64_2(t_fade *x, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam);
60 static t_class *s_fade_class;
71 common_symbols_init();
74 c = class_new(
"j.xfade~", (method)fade_new, (method)fade_free,
sizeof(t_fade), (method)0L, A_GIMME, 0);
77 class_addmethod(c, (method)fade_float,
"float", A_FLOAT,0L);
78 class_addmethod(c, (method)fade_dsp,
"dsp", A_CANT, 0L);
79 class_addmethod(c, (method)fade_dsp64,
"dsp64", A_CANT, 0);
80 class_addmethod(c, (method)object_obex_dumpout,
"dumpout", A_CANT, 0);
81 class_addmethod(c, (method)fade_assist,
"assist", A_CANT, 0L);
84 CLASS_ATTR_LONG(c,
"shape", 0, t_fade, attr_shape);
85 CLASS_ATTR_ACCESSORS(c,
"shape", NULL, attr_set_shape);
86 CLASS_ATTR_ENUMINDEX(c,
"shape", 0,
"EqualPower Linear SquareRoot");
88 CLASS_ATTR_LONG(c,
"mode", 0, t_fade, attr_mode);
89 CLASS_ATTR_ACCESSORS(c,
"mode", NULL, attr_set_mode);
90 CLASS_ATTR_ENUMINDEX(c,
"mode", 0,
"LookupTable Calculate");
92 CLASS_ATTR_FLOAT(c,
"position", 0, t_fade, attr_position);
93 CLASS_ATTR_ACCESSORS(c,
"position", NULL, attr_set_position);
99 class_register(CLASS_BOX, c);
109 void *fade_new(t_symbol *s,
long argc, t_atom *argv)
111 long attrstart = attr_args_offset(argc, argv);
114 t_fade *x = (t_fade *)object_alloc(s_fade_class);
116 object_obex_store((
void *)x, _sym_dumpout, (
object *)outlet_new(x, NULL));
119 if (attrstart && argv) {
120 int argument = atom_getlong(argv);
121 x->numChannels = TTClip(argument, 1, MAX_NUM_CHANNELS);
124 dsp_setup((t_pxobject *)x, (x->numChannels * 2) + 1);
125 x->x_obj.z_misc = Z_NO_INPLACE;
126 for (i=0; i< (x->numChannels); i++)
127 outlet_new((t_pxobject *)x,
"signal");
136 x->xfade->setAttributeValue(
TT(
"mode"),
TT(
"lookup"));
137 x->xfade->setAttributeValue(
TT(
"shape"),
TT(
"equalPower"));
138 x->xfade->setAttributeValue(
TT(
"position"), 0.5);
140 attr_args_process(x, argc, argv);
146 void fade_free(t_fade *x)
148 dsp_free((t_pxobject *)x);
162 void fade_assist(t_fade *x,
void *b,
long msg,
long arg,
char *dst)
165 if (arg < x->numChannels)
166 snprintf(dst, 256,
"(signal) Input A - channel %ld", arg + 1);
167 else if (arg < x->numChannels*2)
168 snprintf(dst, 256,
"(signal) Input B - channel %ld", arg - x->numChannels + 1);
170 strcpy(dst,
"(float/signal) Crossfade Position");
173 if (arg < x->numChannels)
174 snprintf(dst, 256,
"(signal) Mix between A and B - channel %ld", arg + 1);
176 strcpy(dst,
"dumpout");
182 void fade_float(t_fade *x,
double value)
184 x->attr_position = value;
185 x->xfade->setAttributeValue(
TT(
"position"), value);
190 t_max_err attr_set_position(t_fade *x,
void *attr,
long argc, t_atom *argv)
192 fade_float(x, atom_getfloat(argv));
198 t_max_err attr_set_shape(t_fade *x,
void *attr,
long argc, t_atom *argv)
200 x->attr_shape = atom_getlong(argv);
201 if (x->attr_shape == 0)
202 x->xfade->setAttributeValue(
TT(
"shape"),
TT(
"equalPower"));
203 else if (x->attr_shape == 2)
204 x->xfade->setAttributeValue(
TT(
"shape"),
TT(
"squareRoot"));
206 x->xfade->setAttributeValue(
TT(
"shape"),
TT(
"linear"));
213 t_max_err attr_set_mode(t_fade *x,
void *attr,
long argc, t_atom *argv)
215 x->attr_mode = atom_getlong(argv);
216 if (x->attr_mode == 0)
217 x->xfade->setAttributeValue(
TT(
"Mode"),
TT(
"lookup"));
219 x->xfade->setAttributeValue(
TT(
"Mode"),
TT(
"calculate"));
226 t_int *fade_perform1(t_int *w)
228 t_fade *x = (t_fade *)(w[1]);
230 TTUInt8 numChannels = x->audioIn1->getNumChannelsAsInt();
231 TTUInt16 vs = x->audioIn1->getVectorSizeAsInt();
233 for (i=0; i<numChannels; i++) {
235 x->audioIn1->setVector(i, vs, (t_float *)(w[j+1]));
236 x->audioIn2->setVector(i, vs, (t_float *)(w[j+2]));
239 x->xfade->process(*x->audioIn1, *x->audioIn2, *x->audioOut);
241 for (i=0; i<numChannels; i++) {
243 x->audioOut->getVector(i, vs, (t_float *)(w[j+3]));
246 return w + ((numChannels*3)+2);
249 void fade_perform64_1(t_fade *x, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
252 TTUInt8 numChannels = x->audioIn1->getNumChannelsAsInt();
253 TTUInt16 vs = x->audioIn1->getVectorSizeAsInt();
255 for (i=0; i<numChannels; i++) {
256 x->audioIn1->setVector(i, vs, ins[i]);
257 x->audioIn2->setVector(i, vs, ins[i+numChannels]);
260 x->xfade->process(*x->audioIn1, *x->audioIn2, *x->audioOut);
262 for (i=0; i<numChannels; i++)
263 x->audioOut->getVectorCopy(i, vs, outs[i]);
267 t_int *fade_perform2(t_int *w)
269 t_fade *x = (t_fade *)(w[1]);
271 TTUInt16 numChannels = x->audioIn1->getNumChannelsAsInt();
272 TTUInt16 vs = x->audioIn1->getVectorSizeAsInt();
274 for (i=0; i<numChannels; i++) {
276 x->audioIn1->setVector(i, vs, (t_float *)(w[j+1]));
277 x->audioIn2->setVector(i, vs, (t_float *)(w[j+2]));
279 object_attr_setfloat(x, _sym_position, *((t_float *)(w[(numChannels*3)+2])));
281 x->xfade->process(*x->audioIn1, *x->audioIn2, *x->audioOut);
283 for (i=0; i<numChannels; i++) {
285 x->audioOut->getVector(i, vs, (t_float *)(w[j+3]));
288 return w + ((numChannels*3)+3);
292 void fade_perform64_2(t_fade *x, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
295 TTUInt16 numChannels = x->audioIn1->getNumChannelsAsInt();
296 TTUInt16 vs = x->audioIn1->getVectorSizeAsInt();
298 for (i=0; i<numChannels; i++) {
299 x->audioIn1->setVector(i, vs, ins[i]);
300 x->audioIn2->setVector(i, vs, ins[i+numChannels]);
303 object_attr_setfloat(x, _sym_position, (t_float)*ins[numChannels*2]);
305 x->xfade->process(*x->audioIn1, *x->audioIn2, *x->audioOut);
307 for (i=0; i<numChannels; i++)
308 x->audioOut->getVectorCopy(i, vs, outs[i]);
312 void fade_dsp(t_fade *x, t_signal **sp,
short *count)
315 void **audioVectors = NULL;
319 if (count[x->numChannels * 2])
320 audioVectors = (
void**)sysmem_newptr(
sizeof(
void*) * ((x->numChannels * 3) + 2));
322 audioVectors = (
void**)sysmem_newptr(
sizeof(
void*) * ((x->numChannels * 3) + 1));
327 for (i=0; i < x->numChannels; i++) {
328 j = x->numChannels + i;
329 k = x->numChannels*2 + i + 1;
330 if (count[i] && count[j] && count[k]) {
335 audioVectors[l] = sp[i]->s_vec;
337 audioVectors[l] = sp[j]->s_vec;
339 audioVectors[l] = sp[k]->s_vec;
344 if (count[x->numChannels * 2]) {
345 audioVectors[l] = sp[x->numChannels*2]->s_vec;
349 x->audioIn1->setNumChannels(numChannels);
350 x->audioIn2->setNumChannels(numChannels);
351 x->audioOut->setNumChannels(numChannels);
352 x->audioIn1->setVectorSizeWithInt(vs);
353 x->audioIn2->setVectorSizeWithInt(vs);
354 x->audioOut->setVectorSizeWithInt(vs);
356 x->audioOut->alloc();
358 x->xfade->setAttributeValue(kTTSym_sampleRate, sp[0]->s_sr);
360 if (count[x->numChannels * 2])
361 dsp_addv(fade_perform2, l, audioVectors);
363 dsp_addv(fade_perform1, l, audioVectors);
365 sysmem_freeptr(audioVectors);
368 void fade_dsp64(t_fade *x, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags)
384 x->audioIn1->setNumChannels(x->numChannels);
385 x->audioIn2->setNumChannels(x->numChannels);
386 x->audioOut->setNumChannels(x->numChannels);
387 x->audioIn1->setVectorSizeWithInt((
TTUInt16)maxvectorsize);
388 x->audioIn2->setVectorSizeWithInt((
TTUInt16)maxvectorsize);
389 x->audioOut->setVectorSizeWithInt((
TTUInt16)maxvectorsize);
391 x->audioOut->alloc();
393 x->xfade->setAttributeValue(kTTSym_sampleRate, samplerate);
395 if (count[x->numChannels * 2])
396 object_method(dsp64, gensym(
"dsp_add64"), x, fade_perform64_2, 0, NULL);
398 object_method(dsp64, gensym(
"dsp_add64"), x, fade_perform64_1, 0, NULL);
std::uint16_t TTUInt16
16 bit unsigned integer
TTErr TTObjectBaseRelease(TTObjectBasePtr *anObject)
DEPRECATED.
TTAudioObjectBase is the base class for all audio generating and processing objects in Jamoma DSP...
#define TT
This macro is defined as a shortcut for doing a lookup in the symbol table.
TTErr TTObjectBaseInstantiate(const TTSymbol className, TTObjectBasePtr *returnedObjectPtr, const TTValue arguments)
DEPRECATED.
The TTAudioSignal class represents N vectors of audio samples for M channels.
void TTDSP_EXPORT TTDSPInit(const char *pathToBinaries=NULL)
Initialise the Jamoma DSP library, as well as Jamoma Foundation foundation if needed.
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
unsigned char TTUInt8
8 bit unsigned integer (char)