|
@@ -40,41 +40,41 @@ struct Port { |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
/** Sets the voltage of the given channel. */ |
|
|
/** Sets the voltage of the given channel. */ |
|
|
void setVoltage(float voltage, int channel = 0) { |
|
|
|
|
|
|
|
|
void setVoltage(float voltage, uint8_t channel = 0) { |
|
|
voltages[channel] = voltage; |
|
|
voltages[channel] = voltage; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Returns the voltage of the given channel. |
|
|
/** Returns the voltage of the given channel. |
|
|
Because of proper bookkeeping, all channels higher than the input port's number of channels should be 0V. |
|
|
Because of proper bookkeeping, all channels higher than the input port's number of channels should be 0V. |
|
|
*/ |
|
|
*/ |
|
|
float getVoltage(int channel = 0) { |
|
|
|
|
|
|
|
|
float getVoltage(uint8_t channel = 0) { |
|
|
return voltages[channel]; |
|
|
return voltages[channel]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Returns the given channel's voltage if the port is polyphonic, otherwise returns the first voltage (channel 0). */ |
|
|
/** Returns the given channel's voltage if the port is polyphonic, otherwise returns the first voltage (channel 0). */ |
|
|
float getPolyVoltage(int channel) { |
|
|
|
|
|
|
|
|
float getPolyVoltage(uint8_t channel) { |
|
|
return isMonophonic() ? getVoltage(0) : getVoltage(channel); |
|
|
return isMonophonic() ? getVoltage(0) : getVoltage(channel); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Returns the voltage if a cable is connected, otherwise returns the given normal voltage. */ |
|
|
/** Returns the voltage if a cable is connected, otherwise returns the given normal voltage. */ |
|
|
float getNormalVoltage(float normalVoltage, int channel = 0) { |
|
|
|
|
|
|
|
|
float getNormalVoltage(float normalVoltage, uint8_t channel = 0) { |
|
|
return isConnected() ? getVoltage(channel) : normalVoltage; |
|
|
return isConnected() ? getVoltage(channel) : normalVoltage; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
float getNormalPolyVoltage(float normalVoltage, int channel) { |
|
|
|
|
|
|
|
|
float getNormalPolyVoltage(float normalVoltage, uint8_t channel) { |
|
|
return isConnected() ? getPolyVoltage(channel) : normalVoltage; |
|
|
return isConnected() ? getPolyVoltage(channel) : normalVoltage; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Returns a pointer to the array of voltages beginning with firstChannel. |
|
|
/** Returns a pointer to the array of voltages beginning with firstChannel. |
|
|
The pointer can be used for reading and writing. |
|
|
The pointer can be used for reading and writing. |
|
|
*/ |
|
|
*/ |
|
|
float* getVoltages(int firstChannel = 0) { |
|
|
|
|
|
|
|
|
float* getVoltages(uint8_t firstChannel = 0) { |
|
|
return &voltages[firstChannel]; |
|
|
return &voltages[firstChannel]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Copies the port's voltages to an array of size at least `channels`. */ |
|
|
/** Copies the port's voltages to an array of size at least `channels`. */ |
|
|
void readVoltages(float* v) { |
|
|
void readVoltages(float* v) { |
|
|
for (int c = 0; c < channels; c++) { |
|
|
|
|
|
|
|
|
for (uint8_t c = 0; c < channels; c++) { |
|
|
v[c] = voltages[c]; |
|
|
v[c] = voltages[c]; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@@ -83,14 +83,14 @@ struct Port { |
|
|
Remember to set the number of channels *before* calling this method. |
|
|
Remember to set the number of channels *before* calling this method. |
|
|
*/ |
|
|
*/ |
|
|
void writeVoltages(const float* v) { |
|
|
void writeVoltages(const float* v) { |
|
|
for (int c = 0; c < channels; c++) { |
|
|
|
|
|
|
|
|
for (uint8_t c = 0; c < channels; c++) { |
|
|
voltages[c] = v[c]; |
|
|
voltages[c] = v[c]; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Sets all voltages to 0. */ |
|
|
/** Sets all voltages to 0. */ |
|
|
void clearVoltages() { |
|
|
void clearVoltages() { |
|
|
for (int c = 0; c < channels; c++) { |
|
|
|
|
|
|
|
|
for (uint8_t c = 0; c < channels; c++) { |
|
|
voltages[c] = 0.f; |
|
|
voltages[c] = 0.f; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@@ -98,7 +98,7 @@ struct Port { |
|
|
/** Returns the sum of all voltages. */ |
|
|
/** Returns the sum of all voltages. */ |
|
|
float getVoltageSum() { |
|
|
float getVoltageSum() { |
|
|
float sum = 0.f; |
|
|
float sum = 0.f; |
|
|
for (int c = 0; c < channels; c++) { |
|
|
|
|
|
|
|
|
for (uint8_t c = 0; c < channels; c++) { |
|
|
sum += voltages[c]; |
|
|
sum += voltages[c]; |
|
|
} |
|
|
} |
|
|
return sum; |
|
|
return sum; |
|
@@ -116,7 +116,7 @@ struct Port { |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
float sum = 0.f; |
|
|
float sum = 0.f; |
|
|
for (int c = 0; c < channels; c++) { |
|
|
|
|
|
|
|
|
for (uint8_t c = 0; c < channels; c++) { |
|
|
sum += std::pow(voltages[c], 2); |
|
|
sum += std::pow(voltages[c], 2); |
|
|
} |
|
|
} |
|
|
return std::sqrt(sum); |
|
|
return std::sqrt(sum); |
|
@@ -124,27 +124,27 @@ struct Port { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
template <typename T> |
|
|
T getVoltageSimd(int firstChannel) { |
|
|
|
|
|
|
|
|
T getVoltageSimd(uint8_t firstChannel) { |
|
|
return T::load(&voltages[firstChannel]); |
|
|
return T::load(&voltages[firstChannel]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
template <typename T> |
|
|
T getPolyVoltageSimd(int firstChannel) { |
|
|
|
|
|
|
|
|
T getPolyVoltageSimd(uint8_t firstChannel) { |
|
|
return isMonophonic() ? getVoltage(0) : getVoltageSimd<T>(firstChannel); |
|
|
return isMonophonic() ? getVoltage(0) : getVoltageSimd<T>(firstChannel); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
template <typename T> |
|
|
T getNormalVoltageSimd(T normalVoltage, int firstChannel) { |
|
|
|
|
|
|
|
|
T getNormalVoltageSimd(T normalVoltage, uint8_t firstChannel) { |
|
|
return isConnected() ? getVoltageSimd<T>(firstChannel) : normalVoltage; |
|
|
return isConnected() ? getVoltageSimd<T>(firstChannel) : normalVoltage; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
template <typename T> |
|
|
T getNormalPolyVoltageSimd(T normalVoltage, int firstChannel) { |
|
|
|
|
|
|
|
|
T getNormalPolyVoltageSimd(T normalVoltage, uint8_t firstChannel) { |
|
|
return isConnected() ? getPolyVoltageSimd<T>(firstChannel) : normalVoltage; |
|
|
return isConnected() ? getPolyVoltageSimd<T>(firstChannel) : normalVoltage; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
template <typename T> |
|
|
void setVoltageSimd(T voltage, int firstChannel) { |
|
|
|
|
|
|
|
|
void setVoltageSimd(T voltage, uint8_t firstChannel) { |
|
|
voltage.store(&voltages[firstChannel]); |
|
|
voltage.store(&voltages[firstChannel]); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -153,13 +153,13 @@ struct Port { |
|
|
If disconnected, this does nothing (`channels` remains 0). |
|
|
If disconnected, this does nothing (`channels` remains 0). |
|
|
If 0 is given, `channels` is set to 1 but all voltages are cleared. |
|
|
If 0 is given, `channels` is set to 1 but all voltages are cleared. |
|
|
*/ |
|
|
*/ |
|
|
void setChannels(int channels) { |
|
|
|
|
|
|
|
|
void setChannels(uint8_t channels) { |
|
|
// If disconnected, keep the number of channels at 0. |
|
|
// If disconnected, keep the number of channels at 0. |
|
|
if (this->channels == 0) { |
|
|
if (this->channels == 0) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
// Set higher channel voltages to 0 |
|
|
// Set higher channel voltages to 0 |
|
|
for (int c = channels; c < this->channels; c++) { |
|
|
|
|
|
|
|
|
for (uint8_t c = channels; c < this->channels; c++) { |
|
|
voltages[c] = 0.f; |
|
|
voltages[c] = 0.f; |
|
|
} |
|
|
} |
|
|
// Don't allow caller to set port as disconnected |
|
|
// Don't allow caller to set port as disconnected |
|
|