main menu particles fine tuning with visual debug
This commit is contained in:
parent
7130d9872c
commit
d3c166c6d5
@ -22,16 +22,18 @@ public class DoubleHorizontalVisualizer implements Disposable {
|
|||||||
private float offset;
|
private float offset;
|
||||||
private int boundaryThickness;
|
private int boundaryThickness;
|
||||||
private boolean significantBeat;
|
private boolean significantBeat;
|
||||||
private float maxAverageAmplitude;
|
private float dynamicAverageAmplitude;
|
||||||
private byte significantFrames;
|
private byte significantFrames;
|
||||||
private float targetDelta;
|
private float targetDelta;
|
||||||
|
private float significantThreshold = 0.5f;
|
||||||
private float spacePercentage = 0.7f;
|
private float spacePercentage = 0.7f;
|
||||||
private float baseSensitivity = 0.009f;
|
private float baseSensitivity = 0.009f;
|
||||||
private int barCount = 120;
|
private int barCount = 120;
|
||||||
private float barChangeRate = 6.5f;
|
private float barChangeRate = 6.5f;
|
||||||
private int smoothRange = 2;
|
private int smoothRange = 2;
|
||||||
private int binsToInclude = 120;
|
private int binsToInclude = 120;
|
||||||
private Color colorBegin = new Color(0.5f, 0.6f, 0.8f, 0.46f);
|
private Color color = new Color(0.5f, 0.6f, 0.8f, 0.46f);
|
||||||
|
private int averageAmplitude;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -58,11 +60,11 @@ public class DoubleHorizontalVisualizer implements Disposable {
|
|||||||
|
|
||||||
public void act(float delta) {
|
public void act(float delta) {
|
||||||
if (pcm.hasAudioChanged()) {
|
if (pcm.hasAudioChanged()) {
|
||||||
maxAverageAmplitude = 0;
|
dynamicAverageAmplitude = 0;
|
||||||
significantBeat = false;
|
significantBeat = false;
|
||||||
}
|
}
|
||||||
float[] freqBins = pcm.getFrequencyBins();
|
float[] freqBins = pcm.getFrequencyBins();
|
||||||
float averageAmplitude = 0;
|
averageAmplitude = 0;
|
||||||
for (int bar = 0; bar < amplitudes.length; bar++) {
|
for (int bar = 0; bar < amplitudes.length; bar++) {
|
||||||
amplitudes[bar] = 0;
|
amplitudes[bar] = 0;
|
||||||
for (int freq = bar*binsPerBar; freq < (bar*binsPerBar) + binsPerBar; freq++) {
|
for (int freq = bar*binsPerBar; freq < (bar*binsPerBar) + binsPerBar; freq++) {
|
||||||
@ -74,21 +76,24 @@ public class DoubleHorizontalVisualizer implements Disposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
averageAmplitude /= amplitudes.length;
|
averageAmplitude /= amplitudes.length;
|
||||||
if (averageAmplitude > maxAverageAmplitude*0.5f && !significantBeat) {
|
if (averageAmplitude < dynamicAverageAmplitude) {
|
||||||
if (maxAverageAmplitude != 0) {
|
dynamicAverageAmplitude -= 0.01f;
|
||||||
|
} else {
|
||||||
|
dynamicAverageAmplitude = averageAmplitude;
|
||||||
|
}
|
||||||
|
if (averageAmplitude > dynamicAverageAmplitude*significantThreshold && !significantBeat) {
|
||||||
|
if (dynamicAverageAmplitude > 0) {
|
||||||
significantFrames++;
|
significantFrames++;
|
||||||
if (significantFrames >= 16) {
|
if (significantFrames >= 16) {
|
||||||
significantFrames = 0;
|
significantFrames = 0;
|
||||||
significantBeat = true;
|
significantBeat = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (averageAmplitude > maxAverageAmplitude) {
|
|
||||||
maxAverageAmplitude = averageAmplitude;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
significantBeat = false;
|
significantBeat = false;
|
||||||
|
significantFrames = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int bar = 0; bar < barHeights.length; bar++) {
|
for (int bar = 0; bar < barHeights.length; bar++) {
|
||||||
int smoothCount = 1;
|
int smoothCount = 1;
|
||||||
for (int range = 0; range < smoothRange; range++) {
|
for (int range = 0; range < smoothRange; range++) {
|
||||||
@ -136,10 +141,20 @@ public class DoubleHorizontalVisualizer implements Disposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int bar = 0; bar < barCount; bar++) {
|
for (int bar = 0; bar < barCount; bar++) {
|
||||||
shapeRenderer.setColor(colorBegin);
|
shapeRenderer.setColor(color);
|
||||||
shapeRenderer.rect(offset + (spaceBetweenBars+barWidth)*bar, y+height, barWidth, barHeights[bar]);
|
shapeRenderer.rect(offset + (spaceBetweenBars+barWidth)*bar, y+height, barWidth, barHeights[bar]);
|
||||||
shapeRenderer.rect(offset + (spaceBetweenBars+barWidth)*bar, y, barWidth, -barHeights[barHeights.length - 1 - bar]);
|
shapeRenderer.rect(offset + (spaceBetweenBars+barWidth)*bar, y, barWidth, -barHeights[barHeights.length - 1 - bar]);
|
||||||
}
|
}
|
||||||
|
shapeRenderer.setColor(Color.RED);
|
||||||
|
shapeRenderer.rect(0, dynamicAverageAmplitude+y, width, 1);
|
||||||
|
if (significantBeat) {
|
||||||
|
shapeRenderer.setColor(Color.GREEN);
|
||||||
|
} else {
|
||||||
|
shapeRenderer.setColor(Color.WHITE);
|
||||||
|
}
|
||||||
|
shapeRenderer.rect(0, averageAmplitude+y, width, 1);
|
||||||
|
shapeRenderer.setColor(Color.YELLOW);
|
||||||
|
shapeRenderer.rect(0, dynamicAverageAmplitude*significantThreshold + y, width, 1);
|
||||||
shapeRenderer.end();
|
shapeRenderer.end();
|
||||||
Gdx.gl.glDisable(GL20.GL_BLEND);
|
Gdx.gl.glDisable(GL20.GL_BLEND);
|
||||||
batch.begin();
|
batch.begin();
|
||||||
|
@ -63,24 +63,26 @@ public class PCMObtainer implements Observer, PCMSystem {
|
|||||||
df.setRoundingMode(RoundingMode.HALF_EVEN);
|
df.setRoundingMode(RoundingMode.HALF_EVEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized boolean calcPCMData() {
|
private boolean calcPCMData() {
|
||||||
boolean empty = true;
|
synchronized (PCM) {
|
||||||
short chanVal;
|
boolean empty = true;
|
||||||
for (int sid = 0; sid < PCM.length && sid < playingBuffer.remaining(); sid++) {
|
short chanVal;
|
||||||
PCM[sid] = 0;
|
for (int sid = 0; sid < PCM.length && sid < playingBuffer.remaining(); sid++) {
|
||||||
for (int channel = 0; channel < channelCount; channel++) {
|
PCM[sid] = 0;
|
||||||
if (PCM[sid] < (chanVal = playingBuffer.get())) {
|
for (int channel = 0; channel < channelCount; channel++) {
|
||||||
PCM[sid] = chanVal;
|
if (PCM[sid] < (chanVal = playingBuffer.get())) {
|
||||||
|
PCM[sid] = chanVal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
PCM[sid] /= Short.MAX_VALUE + 1f;
|
||||||
|
|
||||||
|
if (PCM[sid] != 0) {
|
||||||
|
empty = false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
PCM[sid] /= Short.MAX_VALUE + 1f;
|
return empty;
|
||||||
|
|
||||||
if (PCM[sid] != 0) {
|
|
||||||
empty = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return empty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkValidityOfPlaybackBuffer() {
|
private void checkValidityOfPlaybackBuffer() {
|
||||||
@ -138,7 +140,8 @@ public class PCMObtainer implements Observer, PCMSystem {
|
|||||||
public float[] getFrequencyBins() {
|
public float[] getFrequencyBins() {
|
||||||
if (mc.isPlaying()) {
|
if (mc.isPlaying()) {
|
||||||
if (updated) {
|
if (updated) {
|
||||||
synchronized (this) {
|
synchronized (PCM) {
|
||||||
|
fft.realForward(PCM);
|
||||||
System.arraycopy(PCM, 1, frequencyBins, 0, frequencyBins.length);
|
System.arraycopy(PCM, 1, frequencyBins, 0, frequencyBins.length);
|
||||||
}
|
}
|
||||||
updated = false;
|
updated = false;
|
||||||
@ -174,9 +177,6 @@ public class PCMObtainer implements Observer, PCMSystem {
|
|||||||
//calculate current pcm data and notify that there is new data
|
//calculate current pcm data and notify that there is new data
|
||||||
checkValidityOfPlaybackBuffer();
|
checkValidityOfPlaybackBuffer();
|
||||||
updated = !calcPCMData();
|
updated = !calcPCMData();
|
||||||
if (updated) {
|
|
||||||
fft.realForward(PCM);
|
|
||||||
}
|
|
||||||
windowsRead++;
|
windowsRead++;
|
||||||
|
|
||||||
//contemplate synchronization
|
//contemplate synchronization
|
||||||
|
@ -286,7 +286,7 @@ public class MusicSelectionPage extends Page implements Observer {
|
|||||||
if (!selectable.isOffScreen()) {
|
if (!selectable.isOffScreen()) {
|
||||||
selectable.getMetadata().loadAlbumCover();
|
selectable.getMetadata().loadAlbumCover();
|
||||||
selectable.loadAttempted();
|
selectable.loadAttempted();
|
||||||
simpleDebug("Loaded " + selectable.getMetadata().getTitle());
|
simpleDebug("Loaded album cover of " + selectable.getMetadata().getTitle());
|
||||||
} else {
|
} else {
|
||||||
simpleDebug("Skipping " + selectable.getMetadata().getTitle());
|
simpleDebug("Skipping " + selectable.getMetadata().getTitle());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user