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
111 lines
3.5 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|