Skip to content

Conversation

@mxmilkiib
Copy link
Contributor

implements two new overview waveform types that layer frequency bands on top of each other, similar to the main waveform's stacked rendering mode.

Changes

  • adds StackedRGB and StackedFiltered to OverviewType enum
  • implements layered rendering functions for RGB and filtered color schemes
  • updates both deck overview widget and library overview column to support the new modes
  • adds UI options in preferences dialog

Behavior

Stacked (RGB): layers low/mid/high bands using RGB color scheme (red/green/blue)
Stacked (Filtered): layers low/mid/high bands using filtered color scheme

bands are drawn in order: low (widest) → mid (on top) → high (on top), so higher frequency content appears layered on top.

both modes work in:

  • deck overview widgets
  • library overview column

Screenshots

TBD

closes #13265

@mxmilkiib
Copy link
Contributor Author

image

@ronso0
Copy link
Member

ronso0 commented Oct 20, 2025

Did you verify the vertical scaling is as before (with RGB accelerated)?

There some CI complaints.

@ronso0
Copy link
Member

ronso0 commented Oct 20, 2025

Please isolate the type changes, ie. remove the hotcue painting.

if (start) {
*start = end;
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please also provide mono mode as the other types do.

Copy link
Contributor Author

@mxmilkiib mxmilkiib Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

all three stacked functions now accept bool mono = false parameter

  • mono mode: sums left+right channels, renders from bottom to top
  • stereo mode: renders left channel (negative y) and right channel (positive y) separately
  • consistent with existing drawWaveformPartRGB, drawWaveformPartLMH, drawWaveformPartHSV

Updated function signatures:

  • drawWaveformPartStackedRGB(..., bool mono = false)
  • drawWaveformPartStackedLMH(..., bool mono = false)
  • drawWaveformPartStackedHSV(..., bool mono = false)

Updated all call sites:

  • render() in waveformoverviewrenderer.cpp passes mono parameterwoverview.cpp
  • uses default parameter (stereo mode)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Btw unnecessarily bloated ai response. All changes are visible in the commit/diff which will be checked anyway.
Just "done, please review" is okay ; )

implements two new overview waveform types that layer frequency bands
on top of each other:
- Stacked (RGB): uses RGB color scheme for low/mid/high bands
- Stacked (Filtered): uses filtered color scheme for low/mid/high bands

the bands are drawn in order (low → mid → high) so that higher
frequency content appears on top, similar to the main waveform's
stacked rendering mode.

both modes work in deck overview widgets and library overview column.

closes mixxxdj#13265
@mxmilkiib mxmilkiib force-pushed the feature/stacked-overview-waveform branch from df6f8eb to d2947b6 Compare October 20, 2025 23:03
@mxmilkiib
Copy link
Contributor Author

mxmilkiib commented Oct 20, 2025

addressed review feedback:

  • removed hotcue commit (now only contains stacked overview waveform feature)
  • added mono mode support to all stacked rendering functions
  • stacked functions now accept bool mono = false parameter like other overview renderers
  • mono mode sums left+right channels and renders from bottom to top
  • stereo mode renders left (negative y) and right (positive y) separately

total changes: 6 files, 288 insertions

Copy link
Member

@ronso0 ronso0 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stacked RGB almost LGTM.

Please remove the redundant HSV and LMH renderers. The existing ones are already stacking bands. Almost the exact same code.
Did you even look at it, or compared the renderings?

// draw low band (widest)
if (low > 0) {
pPainter->setPen(lowColor);
pPainter->drawLine(x, static_cast<int>(-low), x, 0);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cast int to int?
you already implictly convert/promote form char to int above (pWaveform->getLow() et.al return char).

Btw char has been chosen to keep the waveform dataset small, as amplitude of each band / all is 0-255 and (unsigned) char can represent 256 values, 0-255.

Copy link
Contributor Author

@mxmilkiib mxmilkiib Oct 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah, right, so...

in part this is #14813 (maybe I got a bit wrong tho(?))

regardless, lets start with mixxx-git res/ and original Deere;

aand mind that there is also currently #14452 affecting things

oh and there is #12449

(I was about to mention #11837 too, but "mono" is the spatial, not a monochrome colour style, like Simple (and Filtered has a basis in, based on a one colour thing, tho scaled/shaded)

.

as is stands now with the large waveforms;

Filtered is deck colour (and this is also essentially the colour theme of Simple)

and the three waves are three shades of that colour in a Stacked three-layer form

HSV is, for all decks, shades of red, as shaded lines. the H means hue changes, so this is wrong

RGB has the colour theme of HSV, not RGB, so wrong

Simple is a monochrome waveform with the deck colour

Stacked is using the RGB colour theme, so wrong

this waveform is three audio levels/layers, each based on a filtered* signal* to get the three shapes/forms...

.

and as is stands now with the overview waveforms;

Filtered gives the deck overview waveforms the three-level three-shades using the deck colour, again

for the library, they are all orange - deck 2 colour - but they're not brighter in the middle like deck 2 overview waveform, so a bit wrong

HSV gives each deck a waveform in its colour, in the HSV alternating vertical line form, but its not changing Hue based, so wrong

RGB uses the hue based colour theme to both deck and library, so wrong

.

so when I want my non-RGB Stacked waveform that kinda emulates Rekordbox,

I go and set the three waveform 'Signal' variables in the theme, but how to select?

kinda by deduction one might think that (non-RGB) Signal means the Filtered preset

but Filtered is actually a Stacked-form representation of the "signal, filtered through the deck colour (which is based on the Simple preset colour style)"

.

so what to do?

file a bug

and use RGB vars to get my non-RGB style stacked-form preset to be displayed

all this being mostly why I was confused about thee.. state of the states

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First of all the accelerated QOpenGL waveform types look different than the legacy GL types.
And both are rendered differently than the static overviews.
The legacy ones are similiar to the overviews, so if your goal is the best match pick th elegcy ones.

Otoh your stacked RGB overview looks at least similar to the accelerated stacked RGB wvaform.

In Deere the default RGB colors are used.
Btw these can be set here in the Visual node:

<SignalRGBHighColor></SignalRGBHighColor>
<SignalRGBMidColor></SignalRGBMidColor>
<SignalRGBLowColor></SignalRGBLowColor>

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was no response to my review though

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, I went to bed, which I am still in :)

Copy link
Member

@ronso0 ronso0 Oct 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the question is; do we expect RGB parallel to look the same as RGB overview?
given they both have the same name in the config, "RGB"

I'd say "roughly".
There are various RGB modes for the waveforms which already look different (even excl. the 'Stacked' version), and just one simple RGB renderer for the overviews.
So of course they won't look exactly the same.

Can't speak for the QML GUI, maybe it's more consistent there? @acolombier sure knows

Copy link
Member

@ronso0 ronso0 Oct 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also can't tell you anything new about Filtered or HSV. I find them useless.

H in HSV is apparently the SignalLowColor (not to be confused with 'SignalRGBLowColor' 😆 😬 🤔 )

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So bottom line is:
signal colors are not intuitive and need some documentation

Copy link
Contributor Author

@mxmilkiib mxmilkiib Oct 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't repro

can you provide a screenshot please?

What values do you use?

aside from this being straight main and Deere, I have Visual gain at 1.3 Global

overview is Normalised to peak

H in HSV is apparently the SignalLowColor

oh lol

enough for me for today..

Copy link
Contributor Author

@mxmilkiib mxmilkiib Nov 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So;

terms(?);

  • simple = 1 solid waveform, two-tone (on, off) colour
  • stacked = 3 solid waveforms overlaid, simple or involving semi-transparency
  • filtered = 3 stacked waveforms, one colour, plus two shades of
  • RGB colours = either 3 solid/mixed colours, or a colour scale between those three colours
    • SignalRGBHighColor, SignalRGBMidColor, SignalRGBLowColor
  • "monochrome" = one colour, and either two-tone or many shades of
  • "gradient" = each vertical line is one colour (high detail = thinner lines) from a mono or colour scale
  • deck colours = only in Deere
    • other themes have one for deck 1+2 another for 3+4

existing;

  • Filtered
    • Filtered main = 3-wave monochrome stacked, Deere deck colour / deck 1+2, 3+4
    • Filtered overview = 3-wave monochrome stacked, theme/default Signal, orange
  • HSV
    • HSV main = monochrome gradient, theme/default Low (which is Red?)
    • HSV main (w/o acceleration) = monochrome gradient, deck colours
    • HSV overview = monochrome gradient, theme/default Signal, orange
  • RGB
    • RGB main = hue-changing gradient, scale between theme/default R, G, B
    • RGB overview = same
  • Simple
    • Simple main = two-tone monochrome, deck colours / deck 1+2, 3+4
    • Simple overview = doesn't exist
  • Stacked
    • Stacked main (standard) = stacked, theme/default R, G, B
    • Stacked main (high detail) = blended stacks, theme/default R, G, B

new here;

possible ideas;

to think/edit about;

  • SignalHighColor, SignalMedColor, SignalLowColor?
    • used for? possible uses?
  • &c.

I'll edit/finish this later..

if (start) {
*start = end;
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Btw unnecessarily bloated ai response. All changes are visible in the commit/diff which will be checked anyway.
Just "done, please review" is okay ; )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stacked overview waveform?

2 participants