Files
mg4/app/src/test/java/com/evsuite/abrp/MusicPulseTest.java
T
nilsandClaude Opus 5.5 9d84dc6d15 App 2.44.0: the pumpkin light follows the kick drum, behind a switch
MusicPulse reads 40-120 Hz and lights only on jumps of the bass, so
held notes and bass lines stay dark. Settings gets "Pumpkin light
follows the music" (Halloween only, off by default); off, the audio
analyser never starts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LhzAVaUyqcw5PkGjz4mWW6
2026-11-02 13:15:25 +01:00

111 lines
3.5 KiB
Java

package com.evsuite.abrp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class MusicPulseTest {
private static final float STEP = 0.04f;
@Test
public void noReadingAndSilenceLightNothing() {
MusicPulse p = new MusicPulse();
assertEquals(0f, p.update(null, STEP), 0f);
assertEquals(0f, p.update(Float.NaN, STEP), 0f);
assertEquals(0f, p.update(0f, STEP), 0f);
}
@Test
public void aBeatLightsAndFadesSlowerThanItRises() {
MusicPulse p = new MusicPulse();
for (int i = 0; i < 50; i++) p.update(0.05f, STEP);
float beat = p.update(0.5f, STEP);
assertTrue("a beat lights it, got " + beat, beat > 0.8f);
float after = p.update(0.05f, STEP);
assertTrue("it fades, got " + after, after < beat);
assertTrue("slowly, got " + after, after > beat * 0.7f);
}
@Test
public void aSteadyHumSettlesAtNothing() {
MusicPulse p = new MusicPulse();
float last = 1f;
for (int i = 0; i < 400; i++) last = p.update(0.3f, STEP);
assertEquals(0f, last, 0f);
}
@Test
public void aHeldBassNoteLightsOnlyItsStart() {
MusicPulse p = new MusicPulse();
for (int i = 0; i < 50; i++) p.update(0.05f, STEP);
assertTrue(p.update(0.4f, STEP) > 0.8f);
float last = 1f;
for (int i = 0; i < 25; i++) last = p.update(0.4f, STEP);
assertEquals(0f, last, 0f);
}
@Test
public void aWobblingBassLineStaysDark() {
MusicPulse p = new MusicPulse();
for (int i = 0; i < 50; i++) p.update(0.3f, STEP);
float top = 0f;
for (int i = 0; i < 200; i++) top = Math.max(top, p.update(i % 3 == 0 ? 0.33f : 0.3f, STEP));
assertEquals(0f, top, 0f);
}
@Test
public void aSwellingNoteStaysDark() {
MusicPulse p = new MusicPulse();
for (int i = 0; i < 50; i++) p.update(0.1f, STEP);
float top = 0f;
for (int i = 0; i < 100; i++) top = Math.max(top, p.update(0.1f + i * 0.004f, STEP));
assertEquals(0f, top, 0f);
}
@Test
public void aKickOverABassLineLights() {
MusicPulse p = new MusicPulse();
float top = 0f;
for (int i = 0; i < 300; i++) {
float v = p.update(i % 12 == 0 ? 0.6f : (i % 3 == 0 ? 0.33f : 0.3f), STEP);
if (i > 100) top = Math.max(top, v);
}
assertTrue("a kick lights it, got " + top, top > 0.8f);
}
@Test
public void quietAndLoudSongsPulseAlike() {
assertEquals(beatOf(0.5f), beatOf(0.05f), 0.02f);
}
private static float beatOf(float scale) {
MusicPulse p = new MusicPulse();
float top = 0f;
for (int i = 0; i < 500; i++) {
top = Math.max(top * 0.99f, p.update(i % 12 == 0 ? scale : scale * 0.2f, STEP));
}
return top;
}
@Test
public void whenTheMusicStopsItGoesOut() {
MusicPulse p = new MusicPulse();
for (int i = 0; i < 100; i++) p.update(i % 12 == 0 ? 0.5f : 0.1f, STEP);
float last = 1f;
for (int i = 0; i < 100; i++) last = p.update(null, STEP);
assertEquals(0f, last, 0f);
}
@Test
public void itStaysBetweenZeroAndOne() {
MusicPulse p = new MusicPulse();
for (int i = 0; i < 2000; i++) {
Float bass = i % 11 == 0 ? null : Float.valueOf(i % 7 == 0 ? 1f : 0.1f);
float v = p.update(bass, i % 5 == 0 ? 2f : STEP);
assertTrue(v >= 0f && v <= 1f);
}
}
}