void MessageLine::processMessage(int inletIndex, PdMessage *message) { switch (inletIndex) { case 0: { MessageElement *messageElement = message->getElement(0); switch (messageElement->getType()) { case FLOAT: { MessageElement *messageElement1 = message->getElement(1); if (messageElement1 != NULL && messageElement1->getType() == FLOAT) { // start a new line processDspToIndex(message->getBlockIndex()); float delayInMs = StaticUtils::millisecondsToSamples( messageElement1->getFloat(), sampleRate); samplesToTarget = lrintf(delayInMs); target = messageElement->getFloat(); slope = (target - lastValue) / delayInMs; } else { // set the current value processDspToIndex(message->getBlockIndex()); target = messageElement->getFloat(); lastValue = target; slope = 0.0f; samplesToTarget = -1; } PdMessage *outgoingMessage = getNextOutgoingMessage(0); outgoingMessage->getElement(0)->setFloat(lastValue); outgoingMessage->setBlockIndex(message->getBlockIndex()); break; } case SYMBOL: { MessageElement *messageElement = message->getElement(0); if (strcmp(messageElement->getSymbol(), "stop") == 0) { processDspToIndex(message->getBlockIndex()); samplesToTarget = -1; } else if (strcmp(messageElement->getSymbol(), "set") == 0) { MessageElement *messageElement1 = message->getElement(0); if (messageElement1 != NULL && messageElement1->getType() == FLOAT) { processDspToIndex(message->getBlockIndex()); target = messageElement1->getFloat(); lastValue = target; samplesToTarget = -1; } } break; } default: { break; } } break; } case 1: { // not sure what to do in this case break; } default: { break; } } }
inline void DspSig::processMessage(int inletIndex, PdMessage *message) { if (inletIndex == 0) { MessageElement *messageElement = message->getElement(0); if (messageElement != NULL && messageElement->getType() == FLOAT) { processDspToIndex(message->getBlockIndex()); constWasReset = constant != messageElement->getFloat(); constant = messageElement->getFloat(); } } }
void MessageSwap::processMessage(int inletIndex, PdMessage *message) { switch (inletIndex) { case 0: { MessageElement *messageElement = message->getElement(0); switch (messageElement->getType()) { case FLOAT: { left = messageElement->getFloat(); PdMessage *outgoingMessageRight = getNextOutgoingMessage(0); outgoingMessageRight->getElement(0)->setFloat(left); outgoingMessageRight->setTimestamp(message->getTimestamp()); sendMessage(1, outgoingMessageRight); // send a message from outlet 1 PdMessage *outgoingMessageLeft = getNextOutgoingMessage(1); outgoingMessageLeft->getElement(0)->setFloat(right); outgoingMessageLeft->setTimestamp(message->getTimestamp()); sendMessage(0, outgoingMessageLeft); // send a message from outlet 0 break; } case BANG: { PdMessage *outgoingMessageRight = getNextOutgoingMessage(0); outgoingMessageRight->getElement(0)->setFloat(left); outgoingMessageRight->setTimestamp(message->getTimestamp()); sendMessage(0, outgoingMessageRight); // send a message from outlet 1 PdMessage *outgoingMessageLeft = getNextOutgoingMessage(1); outgoingMessageLeft->getElement(0)->setFloat(right); outgoingMessageLeft->setTimestamp(message->getTimestamp()); sendMessage(1, outgoingMessageLeft); // send a message from outlet 0 break; } default: { break; } } break; } case 1: { MessageElement *messageElement = message->getElement(0); if (messageElement->getType() == FLOAT) { right = messageElement->getFloat(); } break; } default: { break; } } }
inline void MessageAbsoluteValue::processMessage(int inletIndex, PdMessage *message) { if (inletIndex == 0) { MessageElement *messageElement = message->getElement(0); if (messageElement != NULL && messageElement->getType() == FLOAT) { PdMessage *outgoingMessage = getNextOutgoingMessage(0); outgoingMessage->setBlockIndex(message->getBlockIndex()); outgoingMessage->getElement(0)->setFloat(fabsf(messageElement->getFloat())); } } }
void MessageUnaryOperationObject::processMessage(int inletIndex, PdMessage *message) { if (inletIndex == 0) { // TODO(mhroth): do we need to be able to handle a list of numbers? MessageElement *messageElement = message->getElement(0); if (messageElement->getType() == FLOAT) { PdMessage *outgoingMessage = getNextOutgoingMessage(0); outgoingMessage->setBlockIndex(message->getBlockIndex()); outgoingMessage->getElement(0)->setFloat(performUnaryOperation(messageElement->getFloat())); } } }
void MessageArcTangent::processMessage(int inletIndex, PdMessage *message) { if (inletIndex == 0) { MessageElement *messageElement = message->getElement(0); if (messageElement->getType() == FLOAT) { PdMessage *outgoingMessage = getNextOutgoingMessage(0); outgoingMessage->getElement(0)->setFloat(atanf(messageElement->getFloat())); outgoingMessage->setTimestamp(message->getTimestamp()); sendMessage(0, outgoingMessage); // send a message from outlet 0 } } }
inline void MessagePack::processMessage(int inletIndex, PdMessage *message) { MessageElement *messageElement = message->getElement(0); MessageElement *outgoingMessageElement = (MessageElement *) messageElementList->get(inletIndex); switch (outgoingMessageElement->getType()) { case FLOAT: { outgoingMessageElement->setFloat(messageElement->getFloat()); break; } case SYMBOL: { outgoingMessageElement->setSymbol(messageElement->getSymbol()); break; } default: { break; } } if (inletIndex == 0) { PdMessage *outgoingMessage = getNextOutgoingMessage(0); outgoingMessage->setBlockIndex(message->getBlockIndex()); for (int i = 0; i < messageElementList->getNumElements(); i++) { messageElement = (MessageElement *) messageElementList->get(i); switch (messageElement->getType()) { case FLOAT: { outgoingMessage->getElement(i)->setFloat(messageElement->getFloat()); break; } case SYMBOL: { outgoingMessage->getElement(i)->setSymbol(messageElement->getSymbol()); break; } default: { break; } } } } }
void MessageSubtract::processMessage(int inletIndex, PdMessage *message) { switch (inletIndex) { case 0: { MessageElement *messageElement = message->getElement(0); if (messageElement->getType() == FLOAT) { PdMessage *outgoingMessage = getNextOutgoingMessage(0); outgoingMessage->getElement(0)->setFloat(messageElement->getFloat() - constant); outgoingMessage->setTimestamp(message->getTimestamp()); sendMessage(0, outgoingMessage); // send a message from outlet 0 } break; } case 1: { MessageElement *messageElement = message->getElement(0); if (messageElement->getType() == FLOAT) { constant = messageElement->getFloat(); } break; } default: { break; } } }
void DspPhasor::processMessage(int inletIndex, PdMessage *message) { switch (inletIndex) { case 0: { // update the frequency MessageElement *messageElement = message->getElement(0); if (messageElement->getType() == FLOAT) { processDspToIndex(message->getBlockIndex(graph->getBlockStartTimestamp(), graph->getSampleRate())); frequency = messageElement->getFloat(); } break; } case 1: { // update the phase // TODO(mhroth) break; } default: { break; } } }
inline void MessageFloat::processMessage(int inletIndex, PdMessage *message) { if (inletIndex == 0) { MessageElement *messageElement = message->getElement(0); switch (messageElement->getType()) { case FLOAT: { constant = messageElement->getFloat(); // allow fallthrough } case BANG: { PdMessage *outgoingMessage = getNextOutgoingMessage(0); outgoingMessage->getElement(0)->setFloat(constant); outgoingMessage->setBlockIndex(message->getBlockIndex()); break; } default: { break; } } } }
inline void DspLine::processMessage(int inletIndex, PdMessage *message) { if (inletIndex == 0) { // not sure what the right inlet is for switch (message->getNumElements()) { case 0: { break; // nothing to do } case 1: { // jump to value MessageElement *messageElement = message->getElement(0); if (messageElement->getType() == FLOAT) { processDspToIndex(message->getBlockIndex()); blockIndexOfLastMessage = message->getBlockIndex(); target = messageElement->getFloat(); lastOutputSample = target; slope = 0.0f; numSamplesToTarget = 0; } break; } default: { // at least two inputs // new ramp MessageElement *messageElement0 = message->getElement(0); MessageElement *messageElement1 = message->getElement(1); if (messageElement0 != NULL && messageElement0->getType() == FLOAT && messageElement1 != NULL && messageElement1->getType() == FLOAT) { processDspToIndex(message->getBlockIndex()); blockIndexOfLastMessage = message->getBlockIndex(); target = messageElement0->getFloat(); float timeToTargetMs = messageElement1->getFloat(); // no negative time to targets! float fractionalSamplesToTarget = StaticUtils::millisecondsToSamples( (timeToTargetMs < 1.0f) ? 1.0f : timeToTargetMs, sampleRate); slope = (target - lastOutputSample) / fractionalSamplesToTarget; numSamplesToTarget = (int) fractionalSamplesToTarget; } break; } } } }