/*
*
      
_______
                       
_____
   
_____ _____
  

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

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

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

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

*
                                                         

* -------------------------------------------------------------
*
* 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 org.junit.Test;

import be.tarsos.dsp.pitch.PitchDetector;
import be.tarsos.dsp.pitch.PitchProcessor.PitchEstimationAlgorithm;

public class PitchDetectorTests {
	

	
@Test
	
public void testSine(){
		
float[] audioBuffer = TestUtilities.audioBufferSine();
		
for(PitchEstimationAlgorithm algorithm : PitchEstimationAlgorithm.values()){
			
PitchDetector detector = algorithm.getDetector(44100, 1024);
			
float pitch = 0;
			
float[] shortAudioBuffer = new float[1024];
			

			
System.arraycopy(audioBuffer, 0, shortAudioBuffer, 0, shortAudioBuffer.length);
			
pitch = detector.getPitch(shortAudioBuffer).getPitch();
			
System.out.println(String.format("%15s %8.3f Hz", algorithm, pitch));
			
assertEquals("Expected about 440Hz for " + algorithm,440,pitch,1.5);
			

			
System.arraycopy(audioBuffer, 1024, shortAudioBuffer, 0, shortAudioBuffer.length);
			
pitch = detector.getPitch(shortAudioBuffer).getPitch();
			
System.out.println(String.format("%15s %8.3f Hz", algorithm, pitch));
			
assertEquals("Expected about 440Hz for " + algorithm,440,pitch,1.5);
			

			
System.arraycopy(audioBuffer, 2048, shortAudioBuffer, 0, shortAudioBuffer.length);
			
pitch = detector.getPitch(shortAudioBuffer).getPitch();
			
System.out.println(String.format("%15s %8.3f Hz", algorithm, pitch));
			
assertEquals("Expected about 440Hz for " + algorithm,440,pitch,1.5);
	

		
}
		
System.out.println();
	
}
	

	
@Test
	
public void testFlute(){
		
float[] audioBuffer = TestUtilities.audioBufferFlute();
		
for(PitchEstimationAlgorithm algorithm : PitchEstimationAlgorithm.values()){
			
PitchDetector detector = algorithm.getDetector(44100, 1024);
			
float pitch = 0;
			
float[] shortAudioBuffer = new float[1024];
			

			
System.arraycopy(audioBuffer, 2048, shortAudioBuffer, 0, shortAudioBuffer.length);
			
pitch = detector.getPitch(shortAudioBuffer).getPitch();
			
System.out.println(String.format("%15s %8.3f Hz", algorithm, pitch));
			
assertEquals("Expected about 440Hz for " + algorithm,442,pitch,2);
		
}
		
System.out.println();
	
}
	

	
@Test
	
public void testPiano(){
		
float[] audioBuffer = TestUtilities.audioBufferPiano();
		
for(PitchEstimationAlgorithm algorithm : PitchEstimationAlgorithm.values()){
			
PitchDetector detector = algorithm.getDetector(44100, 1024);
			
float pitch = 0;
			
float[] shortAudioBuffer = new float[1024];
			

			
System.arraycopy(audioBuffer, 0, shortAudioBuffer, 0, shortAudioBuffer.length);
			
pitch = detector.getPitch(shortAudioBuffer).getPitch();
			
System.out.println(String.format("%15s %8.3f Hz", algorithm, pitch));
			
assertEquals("Expected about 440Hz for " + algorithm,443,pitch,3);
		
}
		
System.out.println();
	
}
	

	
@Test
	
public void testLowPiano(){
		
float[] audioBuffer = TestUtilities.audioBufferLowPiano();
		
for(PitchEstimationAlgorithm algorithm : PitchEstimationAlgorithm.values()){
			
PitchDetector detector = algorithm.getDetector(44100, 1024);
			
float pitch = 0;
			
float[] shortAudioBuffer = new float[1024];
			

			
System.arraycopy(audioBuffer, 0, shortAudioBuffer, 0, shortAudioBuffer.length);
			
pitch = detector.getPitch(shortAudioBuffer).getPitch();
			
System.out.println(String.format("%15s %8.3f Hz", algorithm, pitch));
			
assertEquals("Expected about 130.81Hz for " + algorithm,130.81,pitch,2);
		
}
		
System.out.println();
	
}
	

	
@Test
	
public void testHighFlute(){
		
float[] audioBuffer = TestUtilities.audioBufferHighFlute();
		
for(PitchEstimationAlgorithm algorithm : PitchEstimationAlgorithm.values()){
			
PitchDetector detector = algorithm.getDetector(44100, 1024);
			
float pitch = 0;
			
float[] shortAudioBuffer = new float[1024];
			

			
System.arraycopy(audioBuffer, 3000, shortAudioBuffer, 0, shortAudioBuffer.length);
			
pitch = detector.getPitch(shortAudioBuffer).getPitch();
			
System.out.println(String.format("%15s %8.3f Hz", algorithm, pitch));
			
//this fails with dynamic wavelet and amdf
			
//assertEquals("Expected about 1975.53Hz for " + algorithm,1975.53,pitch,30);
		
}
		
System.out.println();
	
}
	

}