Yep — you can absolutely drive particle colour from your spectrum. The key is: a spectrum is “one value per frequency bin”, so you need to decide how particles choose a bin (ID, X position, age, etc.), then sample the spectrum and turn that value into a colour.
Below are two solid approaches (the first is easiest and usually looks great).
Keep your current Age → Ramp TOP setup, and let the audio control hue/sat/value (globally, or with 3 bands).
-
Make 3 bands from the spectrum
- From your
scale_spectrum (or your spectrum CHOP), create 3 ranges:
- Low / Mid / High using
Band EQ CHOP or Select CHOP + Analyze CHOP (Average / RMS).
Math CHOP → fit each band to 0–1.
- Optional:
Filter/Lag CHOP to smooth.
-
Drive colour adjustment
- Put an
HSV Adjust TOP (or Level TOP) after your ramp (or after the particle render).
- Export:
- Low band → Hue shift (small range, eg 0–0.15)
- Mid band → Saturation
- High band → Value/Brightness (or Emission if you’re in MAT)
This keeps your nice age-gradient look, but makes it breathe with the music.
This is the “each particle picks a frequency bin” method.
scale_spectrum CHOP
→ Resample CHOP (e.g. 256 samples)
→ Math CHOP (fit to 0–1)
→ CHOP to TOP (set 256×1)
Now you have a 1-pixel-tall texture where X = frequency bin and the pixel value = amplitude.
You want to use amplitude (0–1) to “look up” into your ramp gradient:
Ramp TOP (your palette, e.g. 256×1)
- Build a lookup coordinate TOP:
- Put amplitude into R channel (this becomes U)
- Put 0.5 into G (this becomes V)
- (B/A don’t matter)
A quick way:
CHOP to TOP gives you amplitude as grayscale → use Reorder TOP / Shuffle TOP to put it in R
- Make a
Constant TOP at 256×1 with G = 0.5
Composite TOP to combine them into RG
Then:
Lookup TOP
- Input 0 =
Ramp TOP
- Input 1 = your RG lookup coords TOP
- Output = 256×1 “spectrum-colour strip” (each frequency bin now has an RGB colour)
Now you need a coordinate per particle to index that 256×1 strip. Common mappings:
- Particle ID → bin (nice “distributed” look)
- Particle X position → bin (nice “spatial EQ” look)
- Particle age → bin (colour sweeps that follow the spectrum)
On the Material page (or sometimes Render page), look for something like:
- Color Type = Lookup / Texture / Ramp
- Color Lookup TOP (or CHOP)
Point it at your spectrum-colour strip TOP, and set the lookup coordinate source to ID or Position.
You do it in the shader:
particlesGpu → right-click → Allow Editing of Contents
- Find the particle material (often a
GLSL MAT).
- Add a sampler for your spectrum-colour strip TOP and sample it using something like:
u = fract(particleID / numParticles) (ID mapping)
- or
u = fit(pos.x, minX, maxX, 0, 1) (position mapping)
Then multiply or mix with your existing age-ramp colour:
finalColor = mix(ageRampColor, spectrumColor, audioMix)
or
finalColor = ageRampColor * spectrumColor
If you’re aiming for something that’s quick and reliably looks good in a show:
- Start with Option A (age ramp stays readable, spectrum adds life)
Then, if you want “frequency bins across particles,” move to Option B.
If you tell me what you want to drive the bin selection (ID vs position vs age) and whether your particlesGpu Material page has a Color Lookup field like your Size Lookup (CHOP), I can give you the exact node chain + the exact parameter names to set.