19 #ifdef JCOM_SEND_TILDE
21 #define info_numChannels 0
22 #define info_vectorSize 1
69 #ifdef JCOM_SEND_TILDE
72 t_int* send_perform(t_int *w);
75 void send_dsp(
TTPtr self, t_signal **sp,
short *count);
78 void send_perform64(
TTPtr self, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam);
81 void send_dsp64(
TTPtr self, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags);
112 void send_list(
TTPtr self, t_symbol *msg,
long argc, t_atom *argv);
146 ModularSpec *spec =
new ModularSpec;
150 #ifdef JCOM_SEND_TILDE
156 #ifdef JCOM_SEND_TILDE
165 class_addmethod(c->maxClass, (method)
send_assist,
"assist", A_CANT, 0L);
169 #ifdef JCOM_SEND_TILDE
170 class_addmethod(c->maxClass, (method)send_dsp,
"dsp", A_CANT, 0L);
171 class_addmethod(c->maxClass, (method)send_dsp64,
"dsp64", A_CANT, 0);
173 class_addmethod(c->maxClass, (method)
send_bang,
"bang", 0L);
174 class_addmethod(c->maxClass, (method)
send_int,
"int", A_LONG, 0L);
175 class_addmethod(c->maxClass, (method)
send_float,
"float", A_FLOAT, 0L);
176 class_addmethod(c->maxClass, (method)
send_list,
"list", A_GIMME, 0L);
180 class_addmethod(c->maxClass, (method)
send_address,
"address", A_SYM, 0L);
186 #pragma mark Object life
192 long attrstart = attr_args_offset(argc, argv);
196 if (attrstart && argv)
197 address = atom_getsym(argv);
199 address = _sym_nothing;
209 #ifdef JCOM_SEND_TILDE
214 dsp_setup((t_pxobject *)x, 1);
215 x->
obj.z_misc = Z_NO_INPLACE | Z_PUT_FIRST;
222 attr_args_process(x, argc, argv);
230 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
246 #ifdef JCOM_SEND_TILDE
249 dsp_free((t_pxobject *)x);
254 #pragma mark NodeLib association
262 TTAddress absoluteAddress, returnedAddress;
267 if (x->
address == kTTAdrsEmpty)
278 contextAddress = v[0];
286 makeInternals_receiver(x, contextAddress,
TTSymbol(
"/model:address"), gensym(
"return_model_address"), anObject, x->
patcherContext == kTTSym_view);
298 contextAddress = kTTAdrsRoot;
302 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
303 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
318 object_error((t_object*)x,
"tries to bind too many times on %s", x->
address.
c_str());
319 object_obex_dumpout((t_object*)x, gensym(
"error"), 0, NULL);
342 atom_setsym(a, gensym((
char*)absoluteAddress.
c_str()));
343 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
345 JamomaDebug object_post((t_object*)x,
"binds on %s", absoluteAddress.
c_str());
350 #pragma mark Methods bound to input/inlets
356 #ifdef JCOM_SEND_TILDE
357 strcpy(dst,
"signal: Forwarded to node, address of node");
359 strcpy(dst,
"value(s): Forwarded to node, address of node");
362 strcpy(dst,
"dumpout");
365 #ifndef JCOM_SEND_TILDE
376 atom_setlong(&a, value);
384 atom_setfloat(&a, value);
393 if (x->
address == kTTAdrsEmpty) {
405 newMsg = _sym_nothing;
408 else if (atom_gettype(argv) == A_LONG)
410 else if (atom_gettype(argv) == A_FLOAT)
412 else if (atom_gettype(argv) == A_SYM)
413 newMsg = _sym_symbol;
448 aReceiver.
set(kTTSym_address, kTTAdrsEmpty);
463 object_obex_dumpout((t_object*)x, gensym(
"address"), 1, a);
465 JamomaDebug object_post((t_object*)x,
"binds on %s", x->
address.
c_str());
474 #pragma mark Methods relating to audio processing
476 #ifdef JCOM_SEND_TILDE
479 t_int *send_perform(t_int *w)
483 TTListPtr objectCache = NULL;
491 if (x->
obj.z_disabled)
499 objectCache = TTListPtr((
TTPtr)v[0]);
504 aSender->
mSignal.
get(kTTSym_vectorSize, vectorSize);
510 envelope = (t_float *)(w[3]);
516 mean = sum / vectorSize;
520 for (objectCache->begin(); objectCache->end(); objectCache->next()) {
522 anObject = objectCache->current()[0];
524 if (anObject.
valid()) {
527 if (anObject.
name() == kTTSym_InputAudio)
528 TTInputPtr(anObject.
instance())->mSignalCache.appendUnique(aSender->
mSignal);
531 else if (anObject.
name() == kTTSym_Data)
532 anObject.
send(kTTSym_Command, v);
545 void send_perform64(
TTPtr self, t_object *dsp64,
double **ins,
long numins,
double **outs,
long numouts,
long sampleframes,
long flags,
void *userparam)
549 TTListPtr objectCache = NULL;
557 if (x->
obj.z_disabled)
565 objectCache = TTListPtr((
TTPtr)v[0]);
570 aSender->
mSignal.
get(kTTSym_vectorSize, vectorSize);
582 mean = sum / vectorSize;
586 for (objectCache->begin(); objectCache->end(); objectCache->next()) {
588 anObject = objectCache->current()[0];
590 if (anObject.
valid()) {
593 if (anObject.
name() == kTTSym_InputAudio)
594 TTInputPtr(anObject.
instance())->mSignalCache.appendUnique(aSender->
mSignal);
597 else if (anObject.
name() == kTTSym_Data)
598 anObject.
send(kTTSym_Command, v);
607 void send_dsp(
TTPtr self, t_signal **sp,
short *count)
611 void** audioVectors = NULL;
616 audioVectors = (
void**)sysmem_newptr(
sizeof(
void*) * 3);
619 if (count[0] || count[1]) {
620 if (sp[0]->s_n > vectorSize)
621 vectorSize = sp[0]->s_n;
623 audioVectors[1] = sp[0]->s_vec;
624 audioVectors[2] = sp[1]->s_vec;
629 aSender->
mSignal.
set(kTTSym_vectorSize, vectorSize);
631 dsp_addv(send_perform, 3, audioVectors);
632 sysmem_freeptr(audioVectors);
637 void send_dsp64(
TTPtr self, t_object *dsp64,
short *count,
double samplerate,
long maxvectorsize,
long flags)
649 object_method(dsp64, gensym(
"dsp_add64"), x, send_perform64, 0, NULL);
void send_int(TTPtr self, long value)
int handler for j.send
TTAddress appendAddress(const TTAddress &toAppend)
Return a new TTAddress with the appended part.
TTObject subscriberObject
The instance of a TTSubscriber object used to register the wrapped object in the tree structure...
std::uint16_t TTUInt16
16 bit unsigned integer
void send_assist(TTPtr self, void *b, long msg, long arg, char *dst)
Assistance Method.
TTErr send(const TTSymbol aName)
Send a message to this object with no arguments.
void WrappedSenderClass_anything(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
anything else handler for j.send
TTAddress appendAttribute(TTSymbol anAttribute)
Return a new TTAddress with attribute part.
void send_bang(TTPtr self)
bang handler for j.send
TTErr wrapTTModularClassAsMaxClass(TTSymbol &ttblueClassName, const char *maxClassName, WrappedClassPtr *c, ModularSpec *specificities)
Wrap a Jamoma class as a Max class.
TTErr lookup(const TTSymbol key, TTValue &value)
Find the value for the given key.
We build a directory of TTNodes, and you can request a pointer for any TTNode, or add an observer to ...
TTAddress address
sometime external needs to store an address (e.g. send, receive, view, ...)
TTSymbol patcherClass
the patcher class in which the external is
TTObject mSignal
any data structure to send complex signal
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Create and use Jamoma object instances.
void send_float(TTPtr self, double value)
float handler for j.send
TTErr getAttributeValue(const TTSymbol name, TTValue &value)
Get an attribute value for an object.
t_object * patcherPtr
the patcher in which the external is (ignoring subpatcher)
this flag means that an address have no leading slash
void WrapTTSenderClass(WrappedClassPtr c)
Wrap the j.send class as a Max object.
TTHashPtr internals
An hash table to store any internal TTObjectBases (like TTData, TTViewer, ...)
void send_return_model_address(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
Internal method called when the model:address parameter changed.
void * TTPtr
A generic pointer.
TTErr get(const TTSymbol aName, T &aReturnedValue) const
Get an attribute value for an object.
void send_input(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
Internal method used to send data to a j.in.
TTSymbol name() const
Return the name of this class.
t_object obj
Max control object header.
TTErr set(const TTSymbol aName, T aValue)
Set an attribute value for an object.
The TTSymbol class is used to represent a string and efficiently pass and compare that string...
float TTFloat32
32 bit floating point number
TTObject wrappedObject
The instance of the Jamoma object we are wrapping.
The TTAudioSignal class represents N vectors of audio samples for M channels.
this flag means that an address have a leading slash
const char * c_str() const
Return a pointer to the internal string as a C-string.
void WrappedSenderClass_new(TTPtr self, long argc, t_atom *argv)
Wrapper for the j.send constructor class, called when an instance is created.
Data Structure for this object.
TTAddressType getType()
Get the type.
TTErr remove(const TTSymbol key)
Remove an item from the hash table.
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
void send_subscribe(TTPtr self)
Associate j.send(~) with NodeLib.
Wraps Jamoma Core classes as objects for Max/MSP.
int C74_EXPORT main(void)
Set up this class as a Max external the first time an object of this kind is instantiated.
TTSymbol patcherContext
the patcher context in which the external is (model, view)
TTSymbol patcherName
the patcher name in which the external is
TTObjectBase * instance() const
Return a direct pointer to the internal instance.
void send_address(TTPtr self, t_symbol *address)
address message handler for j.send.
TTBoolean valid() const
Determine if the object contained by this TTObject is truly ready for use.
TTSymbol & getName()
Get the name part.
WrappedModularInstance * WrappedModularInstancePtr
Pointer to a wrapped instance of our object.
TTFloat64 TTSampleValue
A value representing a single audio sample.
[doxygenAppendixC_copyExample]
void WrappedSenderClass_free(TTPtr self)
Wrapper for the j.send deconstructor class, called when an instance is destroyed. ...
void send_list(TTPtr self, t_symbol *msg, long argc, t_atom *argv)
list handler for j.send