void cPack_onMessage(HvBase *_c, ControlPack *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { // ensure let index is less than number elements in internal msg int numElements = msg_getNumElements(o->msg); switch (letIn) { case 0: { // first inlet stores all values of input msg and triggers an output for (int i = hv_min_i(numElements, msg_getNumElements(m))-1; i >= 0; --i) { switch (msg_getType(m, i)) { case HV_MSG_FLOAT: msg_setFloat(o->msg, i, msg_getFloat(m, i)); break; case HV_MSG_SYMBOL: case HV_MSG_HASH: msg_setHash(o->msg, i, msg_getHash(m, i)); break; default: break; } } msg_setTimestamp(o->msg, msg_getTimestamp(m)); sendMessage(_c, 0, o->msg); break; } default: { // rest of inlets just store values switch (msg_getType(m, 0)) { case HV_MSG_FLOAT: msg_setFloat(o->msg, letIn, msg_getFloat(m, 0)); break; case HV_MSG_SYMBOL: case HV_MSG_HASH: msg_setHash(o->msg, letIn, msg_getHash(m, 0)); break; default: break; } break; } } }
void cVar_onMessage(HvBase *_c, ControlVar *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { switch (letIn) { case 0: { switch (msg_getType(m,0)) { case HV_MSG_BANG: { HvMessage *n = HV_MESSAGE_ON_STACK(1); if (o->e.type == HV_MSG_FLOAT) msg_initWithFloat(n, msg_getTimestamp(m), o->e.data.f); else if (o->e.type == HV_MSG_HASH) msg_initWithHash(n, msg_getTimestamp(m), o->e.data.h); else return; sendMessage(_c, 0, n); break; } case HV_MSG_FLOAT: { o->e.type = HV_MSG_FLOAT; o->e.data.f = msg_getFloat(m,0); sendMessage(_c, 0, m); break; } case HV_MSG_SYMBOL: case HV_MSG_HASH: { o->e.type = HV_MSG_HASH; o->e.data.h = msg_getHash(m,0); sendMessage(_c, 0, m); break; } default: return; } break; } case 1: { switch (msg_getType(m,0)) { case HV_MSG_FLOAT: { o->e.type = HV_MSG_FLOAT; o->e.data.f = msg_getFloat(m,0); break; } case HV_MSG_SYMBOL: case HV_MSG_HASH: { o->e.type = HV_MSG_HASH; o->e.data.h = msg_getHash(m,0); break; } default: break; } } default: return; } }
void sTabwrite_onMessage(HvBase *_c, SignalTabwrite *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { switch (letIn) { // inlet 0 is the signal inlet case 1: { switch (msg_getType(m,0)) { case BANG: o->head = 0; break; case FLOAT: { o->head = (msg_getFloat(m,0) >= 0.0f) ? (hv_uint32_t) msg_getFloat(m,0) : HV_TABWRITE_STOPPED; break; } case SYMBOL: { if (msg_compareSymbol(m, 0, "stop")) { o->head = HV_TABWRITE_STOPPED; } break; } default: break; } break; } case 2: { if (msg_isHashLike(m,0)) { o->table = ctx_getTableForHash(_c, msg_getHash(m,0)); } break; } default: break; } }
void cTabwrite_onMessage(HvBase *_c, ControlTabwrite *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { switch (letIn) { case 0: { if (msg_isFloat(m,0) && o->table != NULL) { hTable_getBuffer(o->table)[o->x] = msg_getFloat(m,0); // update Y value } break; } case 1: { if (msg_isFloat(m,0) && o->table != NULL) { const int x = (int) msg_getFloat(m,0); if (x >= 0 && x < hTable_getSize(o->table)) { o->x = x; // update X value } } break; } case 2: { if (msg_isHashLike(m,0)) { o->table = ctx_getTableForHash(_c,msg_getHash(m,0)); // update table } break; } default: return; } }
void cSystem_onMessage(HvBase *_c, void *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { HvMessage *n = HV_MESSAGE_ON_STACK(1); if (msg_compareSymbol(m, 0, "samplerate")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) ctx_getSampleRate(_c)); } else if (msg_compareSymbol(m, 0, "numInputChannels")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) ctx_getNumInputChannels(_c)); } else if (msg_compareSymbol(m, 0, "numOutputChannels")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) ctx_getNumOutputChannels(_c)); } else if (msg_compareSymbol(m, 0, "currentTime")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) msg_getTimestamp(m)); } else if (msg_compareSymbol(m, 0, "table")) { // NOTE(mhroth): no need to check message format for symbols as table lookup will fail otherwise HvTable *table = ctx_getTableForHash(_c, msg_getHash(m,1)); if (table != NULL) { if (msg_compareSymbol(m, 2, "length")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) hTable_getLength(table)); } else if (msg_compareSymbol(m, 2, "size")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) hTable_getSize(table)); } else if (msg_compareSymbol(m, 2, "head")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) hTable_getHead(table)); } else return; } else return; } else return; sendMessage(_c, 0, n); }
void cTabread_onMessage(HvBase *_c, ControlTabread *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { switch (letIn) { case 0: { if (msg_isFloat(m,0) && msg_getFloat(m,0) >= 0.0f && o->table != NULL) { const hv_uint32_t x = (hv_uint32_t) msg_getFloat(m,0); if (x < hTable_getSize(o->table)) { HvMessage *n = HV_MESSAGE_ON_STACK(1); msg_initWithFloat(n, msg_getTimestamp(m), hTable_getBuffer(o->table)[x]); sendMessage(_c, 0, n); } } break; } case 1: { if (msg_isHashLike(m,0)) { o->table = ctx_getTableForHash(_c, msg_getHash(m,0)); } break; } default: return; } }
unsigned int hv_msg_getHash(const HvMessage *const m, int i) { return msg_getHash(m, i); }