Пример #1
0
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;
    }
  }
}
Пример #2
0
void DspDelayRead::processMessage(int inletIndex, PdMessage *message) {
  if (message->getElement(0)->getType() == FLOAT) {
    // update the delay time
    processDspToIndex(graph->getBlockIndex(message));
    delayInSamples = StaticUtils::millisecondsToSamples(message->getElement(0)->getFloat(), graph->getSampleRate());
    delayInSamplesInt = (int) delayInSamples;
  }
}
Пример #3
0
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();
    }
  }
}
Пример #4
0
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;
      }
    }
  }
}
Пример #5
0
void MessageTimer::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      MessageElement *messageElement = message->getElement(0);
      if (messageElement->getType() == BANG) {
        processDspToIndex(message->getBlockIndex());
        elapsedSamples = 0.0f;
      }
      break;
    }
    case 1: {
      // return the elapsed number milliseconds
      processDspToIndex(message->getBlockIndex());
      PdMessage *outgoingMessage = getNextOutgoingMessage(0);
      outgoingMessage->getElement(0)->setFloat(1000.0f * elapsedSamples / sampleRate);
      outgoingMessage->setBlockIndexAsFloat(message->getBlockIndexAsFloat());
      break;
    }
    default: {
      break;
    }
  }
}
Пример #6
0
void DspHighpassFilter::processMessage(int inletIndex, PdMessage *message) {
  switch (inletIndex) {
    case 0: {
      if (message->isSymbol(0) && strcmp(message->getSymbol(0), "clear") == 0) {
        processDspToIndex(graph->getBlockIndex(message));
        tapIn = 0.0f;
        tapOut = 0.0f;
        memset(filterInputBuffer, 0, (blockSizeInt+2) * sizeof(float));
        memset(filterOutputBuffer, 0, (blockSizeInt+2) * sizeof(float));
      }
      break;
    }
    case 1: {
      if (message->isFloat(0)) {
        processDspToIndex(graph->getBlockIndex(message));
        calculateFilterCoefficients(message->getFloat(0));
      }
      break;
    }
    default: {
      break;
    }
  }
}
Пример #7
0
inline void DspTableRead::processMessage(int inletIndex, PdMessage *message) {
  if (inletIndex == 0) {
    if (message->getNumElements() > 1) {
      MessageElement *messageElement0 = message->getElement(0);
      if (messageElement0 != NULL && messageElement0->getType() == SYMBOL &&
          strcmp(messageElement0->getSymbol(), "set") == 0) {
        MessageElement *messageElement1 = message->getElement(1);
        if (messageElement1 != NULL && messageElement1->getType() == SYMBOL) {
          DspTable *newTable = pdGraph->getTable(messageElement1->getSymbol());
          if (newTable != NULL) {
            processDspToIndex(message->getBlockIndex());
            blockIndexOfLastMessage = message->getBlockIndex();
            setRemoteBuffer(newTable);
          }
        }
      }
    }
  }
}
Пример #8
0
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;
    }
  }
}
Пример #9
0
void DspSignal::processMessage(int inletIndex, PdMessage *message) {
  if (message->isFloat(0)) {
    processDspToIndex(message->getBlockIndex(graph->getBlockStartTimestamp(), graph->getSampleRate()));
    constant = message->getFloat(0);
  }
}
Пример #10
0
void DspSignal::processMessage(int inletIndex, PdMessage *message) {
  if (message->isFloat(0)) {
    processDspToIndex(graph->getBlockIndex(message));
    constant = message->getFloat(0);
  }
}
void DspMessageInputDspOutputObject::process() {
  blockIndexOfLastMessage = 0; // reset the block index of the last message
  prepareInputBuffers(); // sum all of the incoming DSP streams to the local inlet buffers
  processMessages(); // process all the incoming messages
  processDspToIndex(blockSize); // finish processing the local dsp
}
void MessageInputDspOutputObject::process() {
  blockIndexOfLastMessage = 0;
  processMessages(); // process incoming messages
  processDspToIndex(blockSize);
}