Skip to content

Commit

Permalink
Merge pull request #13416 from acolombier/fix/remove-signal-scale
Browse files Browse the repository at this point in the history
fix: remove scaleSignal in waveform analyzer
  • Loading branch information
daschuer authored Sep 19, 2024
2 parents f494727 + e4b6dec commit 067792b
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 62 deletions.
51 changes: 18 additions & 33 deletions src/analyzer/analyzerwaveform.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,6 @@ class QImage;
class EngineFilterIIRBase;
class QSqlDatabase;

inline CSAMPLE scaleSignal(CSAMPLE invalue, FilterIndex index = FilterCount) {
if (invalue == 0.0) {
return 0;
} else if (index == Low || index == Mid) {
//return std::pow(invalue, 2 * 0.5);
return invalue;
} else {
return std::pow(invalue, 2.0f * 0.316f);
}

// According to this discussion
// https://github.com/mixxxdj/mixxx/issues/6352
// it looks like this scaling is done to accentuate
// low level information.

// This scaling can be undone with a function in
// waveform/renderers/waveformrenderersignalbase.h
// but arguable it would be better not to do this scaling here at all
// and do it (or not) at the waveform renderer side.
}

struct WaveformStride {
WaveformStride(double samples, double averageSamples, int stemCount)
: m_position(0),
Expand Down Expand Up @@ -68,13 +47,13 @@ struct WaveformStride {
for (int i = 0; i < ChannelCount; ++i) {
WaveformData& datum = *(data + i);
datum.filtered.all = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_overallData[i]) + 0.5));
m_postScaleConversion * m_overallData[i] + 0.5));
datum.filtered.low = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_filteredData[i][Low], Low) + 0.5));
m_postScaleConversion * m_filteredData[i][Low] + 0.5));
datum.filtered.mid = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_filteredData[i][Mid], Mid) + 0.5));
m_postScaleConversion * m_filteredData[i][Mid] + 0.5));
datum.filtered.high = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_filteredData[i][High], High) + 0.5));
m_postScaleConversion * m_filteredData[i][High] + 0.5));
for (int stemIdx = 0; stemIdx < m_stemCount; stemIdx++) {
datum.stems[stemIdx] = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * m_stemData[i][stemIdx] + 0.5));
Expand All @@ -100,26 +79,32 @@ struct WaveformStride {
for (int i = 0; i < ChannelCount; ++i) {
WaveformData& datum = *(data + i);
datum.filtered.all = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_averageOverallData[i] / m_averageDivisor) + 0.5));
m_postScaleConversion * m_averageOverallData[i] / m_averageDivisor + 0.5));
datum.filtered.low = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_averageFilteredData[i][Low] / m_averageDivisor, Low) + 0.5));
m_postScaleConversion * m_averageFilteredData[i][Low] /
m_averageDivisor +
0.5));
datum.filtered.mid = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_averageFilteredData[i][Mid] / m_averageDivisor, Mid) + 0.5));
m_postScaleConversion * m_averageFilteredData[i][Mid] /
m_averageDivisor +
0.5));
datum.filtered.high = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_averageFilteredData[i][High] / m_averageDivisor, High) + 0.5));
m_postScaleConversion * m_averageFilteredData[i][High] /
m_averageDivisor +
0.5));
}
} else {
// This is the case if The Overview Waveform has more samples than the detailed waveform
for (int i = 0; i < ChannelCount; ++i) {
WaveformData& datum = *(data + i);
datum.filtered.all = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_overallData[i]) + 0.5));
m_postScaleConversion * m_overallData[i] + 0.5));
datum.filtered.low = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_filteredData[i][Low], Low) + 0.5));
m_postScaleConversion * m_filteredData[i][Low] + 0.5));
datum.filtered.mid = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_filteredData[i][Mid], Mid) + 0.5));
m_postScaleConversion * m_filteredData[i][Mid] + 0.5));
datum.filtered.high = static_cast<unsigned char>(math_min(255.0,
m_postScaleConversion * scaleSignal(m_filteredData[i][High], High) + 0.5));
m_postScaleConversion * m_filteredData[i][High] + 0.5));
}
}

Expand Down
2 changes: 0 additions & 2 deletions src/waveform/renderers/allshader/waveformrendererhsv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,6 @@ void WaveformRendererHSV::paintGL() {
maxMid[chn] = static_cast<float>(u8maxMid);
maxHigh[chn] = static_cast<float>(u8maxHigh);
maxAll[chn] = static_cast<float>(u8maxAll);
// Uncomment to undo scaling with pow(value, 2.0f * 0.316f) done in analyzerwaveform.h
// maxAll[chn] = unscale(u8maxAll);
}

float total{};
Expand Down
2 changes: 0 additions & 2 deletions src/waveform/renderers/allshader/waveformrendererrgb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,6 @@ void WaveformRendererRGB::paintGL() {
float maxLow = static_cast<float>(u8maxLow[chn]);
float maxMid = static_cast<float>(u8maxMid[chn]);
float maxHigh = static_cast<float>(u8maxHigh[chn]);
// Uncomment to undo scaling with pow(value, 2.0f * 0.316f) done in analyzerwaveform.h
// float maxAllChn[2]{unscale(u8maxAllChn[0]), unscale(u8maxAllChn[1])};

// Calculate the squared magnitude of the maxLow, maxMid and maxHigh values.
// We take the square root to get the magnitude below.
Expand Down
3 changes: 0 additions & 3 deletions src/waveform/renderers/allshader/waveformrenderersimple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,6 @@ void WaveformRendererSimple::paintGL() {
for (int i = visualIndexStart + chn; i < visualIndexStop + chn; i += 2) {
const WaveformData& waveformData = data[i];
const float filteredAll = static_cast<float>(waveformData.filtered.all);
// Uncomment to undo scaling with pow(value, 2.0f * 0.316f) done
// in analyzerwaveform.h const float filteredAll =
// unscale(waveformData.filtered.all);

max[chn] = math_max(max[chn], filteredAll);
}
Expand Down
10 changes: 0 additions & 10 deletions src/waveform/renderers/waveformrenderersignalbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -226,13 +226,3 @@ void WaveformRendererSignalBase::getGains(float* pAllGain,
}
}
}

std::span<float, 256> WaveformRendererSignalBase::unscaleTable() {
// Table to undo the scaling std::pow(invalue, 2.0f * 0.316f);
// done in scaleSignal in analyzerwaveform.h
static std::array<float, 256> result;
for (int i = 0; i < 256; i++) {
result[i] = 255.f * std::pow(static_cast<float>(i) / 255.f, 1.f / 0.632f);
}
return result;
}
9 changes: 0 additions & 9 deletions src/waveform/renderers/waveformrenderersignalbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,6 @@ class WaveformRendererSignalBase : public WaveformRendererAbstract {
float* pMidGain,
float* highGain);

static std::span<float, 256> unscaleTable();
inline float unscale(unsigned char value) {
// The all and hi components of the waveform data are scaled with pow(value, 2.0f * 0.316f)
// (see analyzerwaveform.h). This function can be used to undo that scaling,
// but apparently it is intentional.
static const auto table = unscaleTable();
return table[value];
}

protected:
ControlProxy* m_pEQEnabled;
ControlProxy* m_pLowFilterControlObject;
Expand Down
8 changes: 8 additions & 0 deletions src/waveform/waveformfactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ WaveformFactory::VersionClass WaveformFactory::waveformVersionToVersionClass(con
return VC_REMOVE;
}

#ifdef __STEM__
if (version == WAVEFORM_6_0_VERSION) {
// Used in Mixxx 2.6 beta, introducing stem data but later replaced with
// the signal scale removal
return VC_REMOVE;
}
#endif

// possible a future version
return VC_KEEP;
}
Expand Down
10 changes: 7 additions & 3 deletions src/waveform/waveformfactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,13 @@ class Waveform;
#define WAVEFORMSUMMARY_5_DESCRIPTION "WaveformSummary 5.0"

#ifdef __STEM__
// Used from Mixxx 2.6 with Stem data
#define WAVEFORM_6_VERSION "Waveform-6.0"
#define WAVEFORM_6_DESCRIPTION "Waveform 6.0"
// Used from Mixxx 2.6-pre-alpha with Stem data (6.0) and without
// analyzer/analyzerwaveform.h:scaleSignal (6.1)
#define WAVEFORM_6_0_VERSION "Waveform-6.0" // Superseded by 6.1
#define WAVEFORM_6_VERSION "Waveform-6.1"
#define WAVEFORMSUMMARY_6_VERSION "WaveformSummary-6.1"
#define WAVEFORM_6_DESCRIPTION "Waveform 6.1"
#define WAVEFORMSUMMARY_6_DESCRIPTION "WaveformSummary 6.1"

#define WAVEFORM_CURRENT_VERSION WAVEFORM_6_VERSION
#define WAVEFORM_CURRENT_DESCRIPTION WAVEFORM_6_DESCRIPTION
Expand Down

0 comments on commit 067792b

Please sign in to comment.