// Path: src/main/java/org/harmony_analyser/application/visualizations/VisualizationData.java
// public class VisualizationData {
// 	private String pluginName;
// 	private List<Float> timestamps;
// 	private List<Float> values;
// 	private List<String> labels;
// 
// 	public final static VisualizationData EMPTY_VISUALIZATION_DATA = new VisualizationData();
// 
// 	public VisualizationData() {
// 		setTimestamps(new ArrayList<>());
// 		setValues(new ArrayList<>());
// 		setLabels(new ArrayList<>());
// 	}
// 
// 	List<Float> getTimestamps() {
// 		return timestamps;
// 	}
// 
// 	public List<Float> getValues() {
// 		return values;
// 	}
// 
// 	List<String> getLabels() {
// 		return labels;
// 	}
// 
// 	String getPluginName() {
// 		return pluginName;
// 	}
// 
// 	public void setTimestamps(List<Float> timestamps) {
// 		this.timestamps = timestamps;
// 	}
// 
// 	public void setValues(List<Float> values) {
// 		this.values = values;
// 	}
// 
// 	public void setLabels(List<String> labels) {
// 		this.labels = labels;
// 	}
// 
// 	public void setPluginName(String pluginName) {
// 		this.pluginName = pluginName;
// 	}
// }
// 
// Path: src/main/java/org/harmony_analyser/jharmonyanalyser/chroma_analyser/Chroma.java
// @SuppressWarnings({"SameParameterValue", "WeakerAccess"})
// 
// public class Chroma {
// 	public final float[] values;
// 
// 	public static final Chroma EMPTY_CHROMA = new Chroma();
// 
// 	/* Exceptions */
// 
// 	public class WrongChromaSize extends Exception {
// 		public WrongChromaSize(String message) {
// 			super(message);
// 		}
// 	}
// 
// 	public Chroma() {
// 		this.values = new float[0];
// 	}
// 
// 	public Chroma(float[] chroma) throws WrongChromaSize {
// 		this.values = new float[Chromanal.CHROMA_LENGTH];
// 		if (chroma.length != Chromanal.CHROMA_LENGTH) {
// 			throw new WrongChromaSize("Wrong Chroma size");
// 		}
// 		System.arraycopy(chroma, 0, values, 0, Chromanal.CHROMA_LENGTH - 1);
// 	}
// 
// 	/* Public / Package methods */
// 
// 	/* Private methods */
// }


import org.harmony_analyser.application.visualizations.VisualizationData;
import org.harmony_analyser.jharmonyanalyser.chroma_analyser.Chroma;
import org.harmony_analyser.jharmonyanalyser.services.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
		List<String> inputFileLinesList = Files.readAllLines(new File(inputFile).toPath(), Charset.defaultCharset());
		List<Float> inputFileTimestampList = new ArrayList<>();
		List<Float> inputFileValuesList = new ArrayList<>();

		// 1. Get timestamps from the input file
		inputFileTimestampList.addAll(inputFileLinesList.stream().map(AudioAnalysisHelper::getTimestampFromLine).collect(Collectors.toList()));

		// 2. Get values from the input file
		inputFileValuesList.addAll(inputFileLinesList.stream().map(AudioAnalysisHelper::getFloatFromLine).collect(Collectors.toList()));

		// 3. Iterate over timestamps and values, creating time series values
		List<Float> outputTimestampList = new ArrayList<>();
		List<Float> outputValuesList = new ArrayList<>();
		float previousTimestamp, previousValue, timestamp;
		previousTimestamp = inputFileTimestampList.get(0);
		previousValue = inputFileValuesList.get(0);
		float sampleLength = 1 / samplingRate;
		int index = 0;
		for (Float value : inputFileValuesList) {
			if (index == 0) {
				index++;
				continue;
			}
			timestamp = inputFileTimestampList.get(index);

			// Find out difference between timestamps and values
			float timestampDifference = timestamp - previousTimestamp;
			float valueDifference = value - previousValue;
			verboseLog("timestampDifference: " + timestampDifference);
			verboseLog("valueDifference: " + valueDifference);
// Path: src/main/java/org/harmony_analyser/application/visualizations/VisualizationData.java
// public class VisualizationData {
// 	private String pluginName;
// 	private List<Float> timestamps;
// 	private List<Float> values;
// 	private List<String> labels;
// 
// 	public final static VisualizationData EMPTY_VISUALIZATION_DATA = new VisualizationData();
// 
// 	public VisualizationData() {
// 		setTimestamps(new ArrayList<>());
// 		setValues(new ArrayList<>());
// 		setLabels(new ArrayList<>());
// 	}
// 
// 	List<Float> getTimestamps() {
// 		return timestamps;
// 	}
// 
// 	public List<Float> getValues() {
// 		return values;
// 	}
// 
// 	List<String> getLabels() {
// 		return labels;
// 	}
// 
// 	String getPluginName() {
// 		return pluginName;
// 	}
// 
// 	public void setTimestamps(List<Float> timestamps) {
// 		this.timestamps = timestamps;
// 	}
// 
// 	public void setValues(List<Float> values) {
// 		this.values = values;
// 	}
// 
// 	public void setLabels(List<String> labels) {
// 		this.labels = labels;
// 	}
// 
// 	public void setPluginName(String pluginName) {
// 		this.pluginName = pluginName;
// 	}
// }
// 
// Path: src/main/java/org/harmony_analyser/jharmonyanalyser/chroma_analyser/Chroma.java
// @SuppressWarnings({"SameParameterValue", "WeakerAccess"})
// 
// public class Chroma {
// 	public final float[] values;
// 
// 	public static final Chroma EMPTY_CHROMA = new Chroma();
// 
// 	/* Exceptions */
// 
// 	public class WrongChromaSize extends Exception {
// 		public WrongChromaSize(String message) {
// 			super(message);
// 		}
// 	}
// 
// 	public Chroma() {
// 		this.values = new float[0];
// 	}
// 
// 	public Chroma(float[] chroma) throws WrongChromaSize {
// 		this.values = new float[Chromanal.CHROMA_LENGTH];
// 		if (chroma.length != Chromanal.CHROMA_LENGTH) {
// 			throw new WrongChromaSize("Wrong Chroma size");
// 		}
// 		System.arraycopy(chroma, 0, values, 0, Chromanal.CHROMA_LENGTH - 1);
// 	}
// 
// 	/* Public / Package methods */
// 
// 	/* Private methods */
// }


// Path: src/main/java/org/harmony_analyser/jharmonyanalyser/filters/TimeSeriesFilter.java
import org.harmony_analyser.application.visualizations.VisualizationData;
import org.harmony_analyser.jharmonyanalyser.chroma_analyser.Chroma;
import org.harmony_analyser.jharmonyanalyser.services.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

		List<String> inputFileLinesList = Files.readAllLines(new File(inputFile).toPath(), Charset.defaultCharset());
		List<Float> inputFileTimestampList = new ArrayList<>();
		List<Float> inputFileValuesList = new ArrayList<>();

		// 1. Get timestamps from the input file
		inputFileTimestampList.addAll(inputFileLinesList.stream().map(AudioAnalysisHelper::getTimestampFromLine).collect(Collectors.toList()));

		// 2. Get values from the input file
		inputFileValuesList.addAll(inputFileLinesList.stream().map(AudioAnalysisHelper::getFloatFromLine).collect(Collectors.toList()));

		// 3. Iterate over timestamps and values, creating time series values
		List<Float> outputTimestampList = new ArrayList<>();
		List<Float> outputValuesList = new ArrayList<>();
		float previousTimestamp, previousValue, timestamp;
		previousTimestamp = inputFileTimestampList.get(0);
		previousValue = inputFileValuesList.get(0);
		float sampleLength = 1 / samplingRate;
		int index = 0;
		for (Float value : inputFileValuesList) {
			if (index == 0) {
				index++;
				continue;
			}
			timestamp = inputFileTimestampList.get(index);

			// Find out difference between timestamps and values
			float timestampDifference = timestamp - previousTimestamp;
			float valueDifference = value - previousValue;
			verboseLog("timestampDifference: " + timestampDifference);
			verboseLog("valueDifference: " + valueDifference);
			if (timestampDifference > sampleLength) {