40 return 1.0f - 0.25f / (1.0f + (
x - 1.0f) * 4.0f);
41 return x * (1.0f - 0.25f *
x);
44bool edge(fl::u32 stamp, fl::u32 &seen) {
45 if (stamp != 0 && stamp != seen) {
58 const float tau = (target >
mValue) ? attackMs : releaseMs;
64 float alpha = dtMs / (tau + dtMs);
91 float dtMs = (
mLastMs == 0) ? 16.0f :
static_cast<float>(nowMs -
mLastMs);
93 return clampf(dtMs, 0.0f, kMaxFrameMs);
123 mEnergyFast.update(vol, dtMs, kEnergyFastMs, kEnergyFastMs);
125 mEnergySlow.update(vol, dtMs, kEnergySlowMs, kEnergySlowMs);
128 mSense.trend =
clampf((fast - slow) * 4.0f, -1.0f, 1.0f);
133 const float bassHit =
137 mPunch.update(bassHit, dtMs, kTransientAttackMs, kTransientReleaseMs),
140 mShimmer.update(trebHit, dtMs, kTransientAttackMs, kTransientReleaseMs),
157 tuning.presenceReleaseMs);
162 grooveConf, dtMs,
tuning.grooveAttackMs,
tuning.grooveReleaseMs);
181 const float beatMs = 60000.0f /
mSense.bpm;
182 const float since =
static_cast<float>(nowMs -
mLastBeatMs);
192 const float warmthTarget =
195 mSense.warmth =
mWarmth.update(warmthTarget, dtMs, kMoodMs, kMoodMs);
196 mSense.arousal =
mArousal.update(arousalTarget, dtMs, kMoodMs, kMoodMs);
216 mSense.low =
mLow.update(0.0f, dtMs, kBandAttackMs, kBandReleaseMs);
217 mSense.mid =
mMid.update(0.0f, dtMs, kBandAttackMs, kBandReleaseMs);
218 mSense.high =
mHigh.update(0.0f, dtMs, kBandAttackMs, kBandReleaseMs);
220 mEnergyFast.update(0.0f, dtMs, kEnergyFastMs, kEnergyFastMs);
222 mEnergySlow.update(0.0f, dtMs, kEnergySlowMs, kEnergySlowMs);
224 mSense.trend =
clampf((fast - slow) * 4.0f, -1.0f, 1.0f);
226 mPunch.update(0.0f, dtMs, kTransientAttackMs, kTransientReleaseMs);
228 mShimmer.update(0.0f, dtMs, kTransientAttackMs, kTransientReleaseMs);
FastLED chrono implementation - duration types for time measurements.
float getEqBass() FL_NO_EXCEPT
float getMoodArousal() FL_NO_EXCEPT
float getVibeBass() FL_NO_EXCEPT
float getTempoBPM() FL_NO_EXCEPT
float getVibeTreb() FL_NO_EXCEPT
float getMeasurePhase() FL_NO_EXCEPT
float getEqVolume() FL_NO_EXCEPT
float getEqMid() FL_NO_EXCEPT
float getTempoConfidence() FL_NO_EXCEPT
float getEqTreble() FL_NO_EXCEPT
float getVibeBassAtt() FL_NO_EXCEPT
float getVibeTrebAtt() FL_NO_EXCEPT
bool isSilent() FL_NO_EXCEPT
float getBeatConfidence() FL_NO_EXCEPT
float getMoodValence() FL_NO_EXCEPT
float update(float target, float dtMs, float attackMs, float releaseMs)
void update(fl::u32 nowMs)
Poll the Processor and refresh sense(). Call once per frame.
void deriveMood(float dtMs)
void deriveRhythm(fl::u32 nowMs)
fl::shared_ptr< fl::audio::Processor > mProcessor
RoomListener(fl::shared_ptr< fl::audio::Processor > processor)
void rest(fl::u32 nowMs)
Not listening this frame.
const char * regimeName() const
Which regime currently dominates, for logs only.
void deriveBlend(float dtMs)
void blendFrom(float presenceTarget, float grooveConf, float dtMs)
void begin()
Install the event callbacks. Call once after the Processor exists.
float stepClock(fl::u32 nowMs)
Advance the frame clock; returns a bounded dt in ms.
void deriveEnergy(float dtMs)
constexpr common_type_t< T, U > max(T a, U b) FL_NO_EXCEPT
fl::u32 millis()
Universal millisecond timer - returns milliseconds since system startup.
constexpr float kTransientAttackMs
constexpr float kEnergyFastMs
bool edge(fl::u32 stamp, fl::u32 &seen)
constexpr float kEnergySlowMs
constexpr float kMaxFrameMs
constexpr float kBandAttackMs
constexpr float kBandReleaseMs
constexpr float kTransientReleaseMs
float smoothstepf(float e0, float e1, float x)
0 below e0, 1 above e1, smooth in between.
float clampf(float v, float lo, float hi)
float wrapTurns(float t)
Wrap into [0, 1).
Everything a visual is allowed to react to.
One-frame rising edges. Set on the frame the event lands, cleared next.