package audioProject.controller;
import static java.lang.Math.min;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import toritools.additionaltypes.HistoryQueue;
/**
* Wave analysis engine. Maps are of size milliseconds.
* @author toriscope
*
*/
public class WaveController {
private boolean beat = false;
private float feel = 0.0f;
final List<Float> feelArray = new ArrayList<Float>(), beatArray = new ArrayList<Float>();
final HistoryQueue<Float> history;
private final float averageFeel;
int bossTime, victoryTime;
long lastTime = 0;
//private float beatScalar = 0;
public WaveController(final String songName, final int historyLength) throws FileNotFoundException {
Scanner feelScan = new Scanner(new File("audioProject/" + songName + "_feels.kres"));
while(feelScan.hasNextFloat()) {
float entry = feelScan.nextFloat();
feelArray.add(entry);
}
Scanner beatScan = new Scanner(new File("audioProject/" + songName + "_beats.kres"));
while(beatScan.hasNextFloat()) {
beatArray.add(beatScan.nextFloat());
}
history = new HistoryQueue<Float>(historyLength + 1);
for(int i = 0; i < historyLength; i++) {
history.push(0f);
}
// Find average.
float a = 0;
for (float b: feelArray) {
a += b;
}
averageFeel = a / feelArray.size();
victoryTime = (int) (feelArray.size() * .99);
/*
ArrayList<Integer> beatIndex = new ArrayList<Integer>();
for (int i = 0; i < beatArray.size(); i++) {
if (beatArray.get(i) == 1.0f)
beatIndex.add(i);
}
int beatFalloff = 200000;
// Add bells, sweep right
for (Integer index: beatIndex) {
for (int i = index + 1; i < index + beatFalloff; i++) {
if (i >= beatArray.size())
continue;
float newBeat = (float) Math.pow(.99, i - (index));
beatArray.set(i, newBeat);
}
}*/
bossTime = feelArray.size() / 2;
for (int i = feelArray.size() / 4; i < feelArray.size(); i++) {
if (feelArray.get(i) > feelArray.get(bossTime))
bossTime = i;
}
System.out.println("Boss Time: " + (float) bossTime / feelArray.size());
}
public void setTime44100(final long newTime) {
beat = false;
for(int i = (int) lastTime; i < newTime; i++) {
if (beat = beatArray.get(i) == 1)
break;
}
//System.out.println(beatScalar = (!beat) ? beatArray.get((int) newTime) : 1);
lastTime = newTime;
feel = min(1, feelArray.get((int) newTime));
history.push(feel);
}
public List<Float> pastN () {
return history;
}
public boolean isBeat() {
return beat;
}
public float getFeel() {
return feel;
}
public float getAverageFeel() {
return averageFeel;
}
public float getBossTime() {
return bossTime;
}
public long getVictoryTime() {
return victoryTime;
}
public int getPercentage() {
return (int) (((float) lastTime / feelArray.size()) * 100);
}
// public float getBeatScalar() {
// return beatScalar;
// }
}