/*
*
      
_______
                       
_____
   
_____ _____
  

*
     
|__
   
__|
                     
|
  
__ \ / ____|__ \
 

*
        
| | __ _ _ __ ___
  
______| || | (___ | |__) |
*
        
| |/ _` | '__/ __|/ _ \/ __| |
  
| |\___ \|___/
 

*
        
| | (_| | |
  
\__ \ (_) \__ \ |__| |____) | |
     

*
        
|_|\__,_|_|
  
|___/\___/|___/_____/|_____/|_|
     

*
                                                         

* -------------------------------------------------------------
*
* TarsosDSP is developed by Joren Six at IPEM, University Ghent
*
  

* -------------------------------------------------------------
*
*
  
Info:
 
http://0110.be/tag/TarsosDSP
*
  
Github:
 
https://github.com/JorenSix/TarsosDSP
*
  
Releases:
 
http://0110.be/releases/TarsosDSP/
*
  

*
  
TarsosDSP includes modified source code by various authors,
*
  
for credits and info, see README.
*
 

*/


package be.tarsos.dsp.test;

import static org.junit.Assert.assertEquals;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;

import org.junit.Test;

import be.tarsos.dsp.io.TarsosDSPAudioFloatConverter;
import be.tarsos.dsp.io.jvm.JVMAudioInputStream;



public class TestUtilities {

	
/**
	 
* Constructs and returns a buffer of a two seconds long pure sine of 440Hz
	 
* sampled at 44.1kHz.
	 
*
 

	 
* @return A buffer of a two seconds long pure sine (440Hz) sampled at
	 
*
         
44.1kHz.
	 
*/

	
public static float[] audioBufferSine() {
		
final double sampleRate = 44100.0;
		
final double f0 = 440.0;
		
final double amplitudeF0 = 0.5;
		
final double seconds = 4.0;
		
final float[] buffer = new float[(int) (seconds * sampleRate)];
		
for (int sample = 0; sample < buffer.length; sample++) {
			
final double time = sample / sampleRate;
			
buffer[sample] = (float) (amplitudeF0 * Math.sin(2 * Math.PI * f0 * time));
		
}
		
return buffer;
	
}
	

	
public static float[] audioBufferSine(int numberOfSamples) {
		
final double sampleRate = 44100.0;
		
final double f0 = 440.0;
		
final double amplitudeF0 = 0.5;
		
final float[] buffer = new float[numberOfSamples];
		
for (int sample = 0; sample < buffer.length; sample++) {
			
final double time = sample / sampleRate;
			
buffer[sample] = (float) (amplitudeF0 * Math.sin(2 * Math.PI * f0 * time));
		
}
		
return buffer;
	
}
	

	
/**
	 
* @return a 4096 samples long 44.1kHz sampled float buffer with the sound
	 
*
         
of a flute played double forte at A6 (theoretically 440Hz) without vibrato
	 
*/

	
public static float[] audioBufferFlute() {
		
int lengthInSamples = 4096;
		
String file = "/be/tarsos/dsp/test/resources/flute.novib.ff.A4.wav";
		
return audioBufferFile(file,lengthInSamples);
	
}
	

	
public static File fluteFile(){
		
String file = "/be/tarsos/dsp/test/resources/flute.novib.ff.A4.wav";
		
final URL url = TestUtilities.class.getResource(file);
		
try {
			
return new File(new URI(url.toString()));
		
} catch (URISyntaxException e) {
			
return null;
		
}
	
}
	

	
public static File ccirFile(){
		
String file = "/be/tarsos/dsp/test/resources/CCIR_04221.ogg";
		
final URL url = TestUtilities.class.getResource(file);
		
try {
			
return new File(new URI(url.toString()));
		
} catch (URISyntaxException e) {
			
return null;
		
}
	
}
	

	
public static File onsetsAudioFile(){
		
String file = "/be/tarsos/dsp/test/resources/NR45.wav";
		
final URL url = TestUtilities.class.getResource(file);
		
try {
			
return new File(new URI(url.toString()));
		
} catch (URISyntaxException e) {
			
return null;
		
}
	
}
	

	
public static File sineOf4000Samples(){
		
String file = "/be/tarsos/dsp/test/resources/4000_samples_of_440Hz_at_44.1kHz.wav";
		
final URL url = TestUtilities.class.getResource(file);
		
try {
			
return new File(new URI(url.toString()));
		
} catch (URISyntaxException e) {
			
return null;
		
}
	
}
	

	
/**
	 
* @return a 4096 samples long 44.1kHz sampled float buffer with the sound
	 
*
         
of a flute played double forte at B6 (theoretically 1975.53Hz) without vibrato
	 
*/

	
public static float[] audioBufferHighFlute() {
		
int lengthInSamples = 4096;
		
String file = "/be/tarsos/dsp/test/resources/flute.novib.ff.B6.wav";
		
return audioBufferFile(file,lengthInSamples);
	
}
	

	
/**
	 
* Reads the contents of a file.
	 
*
 

	 
* @param name
	 
*
            
the name of the file to read
	 
* @return the contents of the file if successful, an empty string
	 
*
         
otherwise.
	 
*/

	
public static String readFile(final String name) {
		
FileReader fileReader = null;
		
final StringBuilder contents = new StringBuilder();
		
try {
			
final File file = new File(name);
			
if (!file.exists()) {
				
throw new IllegalArgumentException("File " + name + " does not exist");
			
}
			
fileReader = new FileReader(file);
			
final BufferedReader reader = new BufferedReader(fileReader);
			
String inputLine = reader.readLine();
			
while (inputLine != null) {
				
contents.append(inputLine).append("\n");
				
inputLine = reader.readLine();
			
}
			
reader.close();
		
} catch (final IOException i1) {
			
throw new RuntimeException(i1);
		
}
		
return contents.toString();
	
}
	

	
/**
	 
* Reads the contents of a file in a jar.
	 
*
 

	 
* @param path
	 
*
            
the path to read e.g. /package/name/here/help.html
	 
* @return the contents of the file when successful, an empty string
	 
*
         
otherwise.
	 
*/

	
public static String readFileFromJar(final String path) {
		
final StringBuilder contents = new StringBuilder();
		
final URL url = TestUtilities.class.getResource(path);
		
URLConnection connection;
		
try {
			
connection = url.openConnection();
			
final InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream());
			
final BufferedReader reader = new BufferedReader(inputStreamReader);
			
String inputLine;
			
inputLine = reader.readLine();
			
while (inputLine != null) {
				
contents.append(new String(inputLine.getBytes(), "UTF-8")).append("\n");
				
inputLine = reader.readLine();
			
}
			
reader.close();
		
} catch (final IOException e) {
			
throw new RuntimeException(e);
		
} catch (final NullPointerException e) {
			
throw new RuntimeException(e);
		
}
		
return contents.toString();
	
}
	

	
/**
	 
* @return a 4096 samples long 44.1kHz sampled float buffer with the sound
	 
*
         
of a piano played double forte at A4 (theoretically 440Hz)
	 
*/

	
public static float[] audioBufferPiano() {
		
int lengthInSamples = 4096;
		
String file = "/be/tarsos/dsp/test/resources/piano.ff.A4.wav";
		
return audioBufferFile(file,lengthInSamples);
	
}
	

	
/**
	 	 
* @return a 4096 samples long 44.1kHz sampled float buffer with the sound
	 
*
         
of a piano played double forte at C3 (theoretically 130.81Hz)
	 
*/

	
public static float[] audioBufferLowPiano() {
		
int lengthInSamples = 4096;
		
String file = "/be/tarsos/dsp/test/resources/piano.ff.C3.wav";
		
return audioBufferFile(file,lengthInSamples);
	
}
	

	
private static float[] audioBufferFile(String file,int lengthInSamples){
		
float[] buffer = new float[lengthInSamples];
		
try {
			
final URL url = TestUtilities.class.getResource(file);
			
AudioInputStream audioStream = AudioSystem.getAudioInputStream(url);
			
AudioFormat format = audioStream.getFormat();
			
TarsosDSPAudioFloatConverter converter = TarsosDSPAudioFloatConverter.getConverter(JVMAudioInputStream.toTarsosDSPFormat(format));
			
byte[] bytes = new byte[lengthInSamples * format.getSampleSizeInBits()];
			
audioStream.read(bytes);
		

			
converter.toFloatArray(bytes, buffer);
		
} catch (IOException e) {
			
throw new Error("Test audio file should be present.");
		
} catch (UnsupportedAudioFileException e) {
			
throw new Error("Test audio file format should be supported.");
		
}
		

		
return buffer;
	
}

	
/**
	 
*
 

	 
* @return a half a second long silent buffer (all zeros), at 44.1kHz.
	 
*/

	
public static float[] audioBufferSilence() {
		
final double sampleRate = 44100.0;
		
final double seconds = 0.5;
		
final float[] buffer = new float[(int) (seconds * sampleRate)];
		
return buffer;
	
}

	
@Test
	
public void testNothing(){
		
//a test to please maven
		
assertEquals(true,true);
	
}
}