17 #include "TTClassWrapperMax.h"
20 #include "ext_strings.h"
21 #include "commonsyms.h"
34 t_symbol* attrOperator;
42 void* op_new(t_symbol *msg,
short argc, t_atom *argv);
43 void op_free(t_op *x);
44 void op_assist(t_op *x,
void *b,
long msg,
long arg,
char *dst);
45 t_int* op_perform(t_int *w);
46 void op_dsp(t_op *x, t_signal **sp,
short *count);
47 void op_dsp64(t_op *x, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags);
48 t_max_err op_setOperator(t_op *x,
void *attr,
long argc, t_atom *argv);
49 t_max_err op_setOperand(t_op *x,
void *attr,
long argc, t_atom *argv);
64 common_symbols_init();
66 c = class_new(
"j.op~",(method)op_new, (method)op_free,
sizeof(t_op), (method)0L, A_GIMME, 0);
68 class_addmethod(c, (method)op_dsp,
"dsp", A_CANT, 0);
69 class_addmethod(c, (method)op_dsp64,
"dsp64", A_CANT, 0);
70 class_addmethod(c, (method)op_assist,
"assist", A_CANT, 0);
71 class_addmethod(c, (method)object_obex_dumpout,
"dumpout", A_CANT, 0);
73 CLASS_ATTR_SYM(c,
"operator", 0, t_op, attrOperator);
74 CLASS_ATTR_ACCESSORS(c,
"operator", NULL, op_setOperator);
75 CLASS_ATTR_ENUM(c,
"operator", 0,
"+ - * / % > >= == != <= < abs acos asin atan ceil cos cosh exp floor log log10 sin sinh sqrt tan tanh");
77 CLASS_ATTR_FLOAT(c,
"operand", 0, t_op, attrOperand);
78 CLASS_ATTR_ACCESSORS(c,
"operand", NULL, op_setOperand);
81 class_register(CLASS_BOX, c);
90 void* op_new(t_symbol *msg,
short argc, t_atom *argv)
94 long attrstart = attr_args_offset(argc, argv);
97 x = (t_op *)object_alloc(s_op_class);
99 x->maxNumChannels = 2;
100 if (attrstart && argv)
101 x->maxNumChannels = atom_getlong(argv);
108 attr_args_process(x,argc,argv);
110 object_obex_store((
void *)x, _sym_dumpout, (
object *)outlet_new(x,NULL));
111 dsp_setup((t_pxobject *)x, x->maxNumChannels);
112 for (i=0; i < x->maxNumChannels; i++)
113 outlet_new((t_pxobject *)x,
"signal");
115 x->obj.z_misc = Z_NO_INPLACE;
121 void op_free(t_op *x)
123 dsp_free((t_pxobject *)x);
134 void op_assist(t_op *x,
void *b,
long msg,
long arg,
char *dst)
138 snprintf(dst, 256,
"(signal) input %ld, control messages", arg+1);
140 snprintf(dst, 256,
"(signal) input %ld", arg+1);
143 if (arg == x->maxNumChannels)
144 strcpy(dst,
"dumpout");
146 snprintf(dst, 256,
"(signal) processed audio (ch. %ld)", arg+1);
155 t_int *op_perform(t_int *w)
157 t_op *x = (t_op *)(w[1]);
159 TTUInt16 vs = x->audioIn->getVectorSizeAsInt();
161 for (i=0; i<x->numChannels; i++) {
163 x->audioIn->setVector(i, vs, (t_float *)w[j+1]);
166 if (!x->obj.z_disabled)
167 x->op->process(x->audioIn, x->audioOut);
169 for (i=0; i<x->numChannels; i++) {
171 x->audioOut->getVector(i, vs, (t_float *)w[j+2]);
174 return w + ((x->numChannels*2)+2);
179 void op_dsp(t_op *x, t_signal **sp,
short *count)
182 void **audioVectors = NULL;
184 audioVectors = (
void**)sysmem_newptr(
sizeof(
void*) * ((x->maxNumChannels * 2) + 1));
190 for (i=0; i < x->maxNumChannels; i++) {
191 j = x->maxNumChannels + i;
192 if (count[i] && count[j]) {
194 if (sp[i]->s_n > x->vs)
197 audioVectors[k] = sp[i]->s_vec;
199 audioVectors[k] = sp[j]->s_vec;
204 x->audioIn->setAttributeValue(kTTSym_numChannels, x->maxNumChannels);
205 x->audioOut->setAttributeValue(kTTSym_numChannels, x->maxNumChannels);
206 x->audioIn->setAttributeValue(kTTSym_vectorSize, x->vs);
207 x->audioOut->setAttributeValue(kTTSym_vectorSize, x->vs);
209 x->audioOut->sendMessage(
TT(
"alloc"));
211 x->op->setAttributeValue(kTTSym_sampleRate, sp[0]->s_sr);
213 dsp_addv(op_perform, k, audioVectors);
214 sysmem_freeptr(audioVectors);
218 t_max_err op_setOperator(t_op *x,
void *attr,
long argc, t_atom *argv)
221 x->attrOperator = atom_getsym(argv);
222 x->op->setAttributeValue(
TT(
"operator"),
TT(x->attrOperator->s_name));
228 t_max_err op_setOperand(t_op *x,
void *attr,
long argc, t_atom *argv)
231 x->attrOperand = atom_getfloat(argv);
232 x->op->setAttributeValue(
TT(
"operand"), x->attrOperand);
238 void op_perform64(t_op *x, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
241 TTUInt16 vs = x->audioIn->getVectorSizeAsInt();
243 for (i=0; i<x->numChannels; i++)
244 x->audioIn->setVector(i, vs, ins[i]);
247 x->op->process(x->audioIn, x->audioOut);
249 for (i=0; i<x->numChannels; i++)
250 x->audioOut->getVectorCopy(i, vs, outs[i]);
254 void op_perform_zero(t_op *x, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
258 for (i=0; i<numouts; i++)
259 memset(outs[i], 0,
sizeof(
double) * sampleframes);
263 void op_dsp64(t_op *x, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags)
271 for (i=0; i < x->maxNumChannels; i++) {
272 j = x->maxNumChannels + i;
273 if (count[i] && count[j])
274 x->numChannels = i+1;
277 if (x->numChannels > 0) {
278 x->audioIn->setAttributeValue(kTTSym_numChannels, x->numChannels);
279 x->audioOut->setAttributeValue(kTTSym_numChannels, x->numChannels);
280 x->audioIn->setAttributeValue(kTTSym_vectorSize, (
TTUInt16)maxvectorsize);
281 x->audioOut->setAttributeValue(kTTSym_vectorSize, (
TTUInt16)maxvectorsize);
283 x->audioOut->sendMessage(
TT(
"alloc"));
285 x->op->setAttributeValue(kTTSym_sampleRate, samplerate);
286 object_method(dsp64, gensym(
"dsp_add64"), x, op_perform64, 0, NULL);
289 object_method(dsp64, gensym(
"dsp_add64"), x, op_perform_zero, 0, NULL);
std::uint16_t TTUInt16
16 bit unsigned integer
TTErr TTObjectBaseRelease(TTObjectBasePtr *anObject)
DEPRECATED.
TTFOUNDATION_EXPORT TTEnvironment * ttEnvironment
The environment object has one instance, which is global in scope.
TTAudioObjectBase is the base class for all audio generating and processing objects in Jamoma DSP...
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
TTErr setAttributeValue(const TTSymbol name, TTValue &value)
Set an attribute value for an object.
#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.
[doxygenAppendixC_copyExample]