|  | @@ -30,7 +30,7 @@ import com.yonge.netty.server.processor.WaveformWriter;
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  public class UserChannelContext3 {
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  | -	private final static Logger LOGGER = LoggerFactory.getLogger(UserChannelContext3.class);
 | 
	
		
			
				|  |  | +	private final static Logger LOGGER = LoggerFactory.getLogger(UserChannelContext.class);
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	private double standardFrequecy = 442;
 | 
	
		
			
				|  |  |  	
 | 
	
	
		
			
				|  | @@ -355,9 +355,9 @@ public class UserChannelContext3 {
 | 
	
		
			
				|  |  |  				//计算延迟偏移值
 | 
	
		
			
				|  |  |  				//playTime = musicXmlNote.getTimeStamp() + durationTime;
 | 
	
		
			
				|  |  |  				dynamicOffset = chunkAnalysis.getStartTime() - musicXmlNote.getTimeStamp();
 | 
	
		
			
				|  |  | -				if(100 * dynamicOffset / musicXmlNote.getDuration() > (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()))){
 | 
	
		
			
				|  |  | +				/*if(100 * dynamicOffset / musicXmlNote.getDuration() > (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()))){
 | 
	
		
			
				|  |  |  					dynamicOffset = 0;
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | +				}*/
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  			
 | 
	
		
			
				|  |  |  			if (playTime >= (musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset)) {
 | 
	
	
		
			
				|  | @@ -489,16 +489,14 @@ public class UserChannelContext3 {
 | 
	
		
			
				|  |  |  	public void evaluateForNote(MusicXmlNote musicXmlNote, NoteAnalysis noteAnalysis) {
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 | 
	
		
			
				|  |  | -		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 | 
	
		
			
				|  |  | +		double endTime = musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset;
 | 
	
		
			
				|  |  | +		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset;
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		double correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote);
 | 
	
		
			
				|  |  | -		double correctedEndTime = correctedStartTime + musicXmlNote.getDuration();
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		//根据完整度取部分有效信号
 | 
	
		
			
				|  |  | +		int elementSize = chunkAnalysisList.size() * (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())) / 100;
 | 
	
		
			
				|  |  | +		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		double playDurationTime = 0;
 | 
	
		
			
				|  |  |  		
 | 
	
	
		
			
				|  | @@ -596,20 +594,15 @@ public class UserChannelContext3 {
 | 
	
		
			
				|  |  |  	private int computeFrequency(MusicXmlNote musicXmlNote) {
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 | 
	
		
			
				|  |  | -		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 | 
	
		
			
				|  |  | +		double endTime = musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 | 
	
		
			
				|  |  | +		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset;
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  | -		double correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote);
 | 
	
		
			
				|  |  | -		double correctedEndTime = correctedStartTime + musicXmlNote.getDuration();
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  		//根据完整度取部分有效信号
 | 
	
		
			
				|  |  | -		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 | 
	
		
			
				|  |  | +		int elementSize = chunkAnalysisList.size() * (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())) / 100;
 | 
	
		
			
				|  |  |  		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
 | 
	
		
			
				|  |  | +		
 | 
	
		
			
				|  |  |  		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 | 
	
		
			
				|  |  |  			return -1;
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -642,19 +635,13 @@ public class UserChannelContext3 {
 | 
	
		
			
				|  |  |  	private boolean computeTempoWithFrequency(MusicXmlNote musicXmlNote){
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 | 
	
		
			
				|  |  | -		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 | 
	
		
			
				|  |  | +		double endTime = musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 | 
	
		
			
				|  |  | +		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset;
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		double correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote);
 | 
	
		
			
				|  |  | -		double correctedEndTime = correctedStartTime + musicXmlNote.getDuration();
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		//根据完整度取部分有效信号
 | 
	
		
			
				|  |  | -		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 | 
	
		
			
				|  |  | +		int elementSize = chunkAnalysisList.size() * (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())) / 100;
 | 
	
		
			
				|  |  |  		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 | 
	
	
		
			
				|  | @@ -729,7 +716,8 @@ public class UserChannelContext3 {
 | 
	
		
			
				|  |  |  			if(firstPeakIndex * 100 /chunkAnalysisList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())){
 | 
	
		
			
				|  |  |  				tempo = false;
 | 
	
		
			
				|  |  |  				LOGGER.info("节奏错误原因:进入时间点太晚");
 | 
	
		
			
				|  |  | -			}else{
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			if(tempo){
 | 
	
		
			
				|  |  |  				//判断是否与上一个音延续下来的
 | 
	
		
			
				|  |  |  				if(firstChunkAnalysis.getFrequency() > 100 && lastChunkAnalysis.getFrequency() > 100){
 | 
	
		
			
				|  |  |  					tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false;
 | 
	
	
		
			
				|  | @@ -839,18 +827,14 @@ public class UserChannelContext3 {
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
 | 
	
		
			
				|  |  | -		return musicXmlNote.getTimeStamp() + dynamicOffset;
 | 
	
		
			
				|  |  | +		return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	public static void main(String[] args) {
 | 
	
		
			
				|  |  | -		double[] midi = new double[128];;
 | 
	
		
			
				|  |  | -		int standardPitch = 440; // a is 440 hz...
 | 
	
		
			
				|  |  | -		for (int x = 0; x < midi.length; ++x)
 | 
	
		
			
				|  |  | -		{
 | 
	
		
			
				|  |  | -		   midi[x] = new BigDecimal(standardPitch).multiply(new BigDecimal(Math.pow(2, new BigDecimal(x-69).divide(new BigDecimal(12),6,BigDecimal.ROUND_HALF_UP).doubleValue()))).doubleValue();
 | 
	
		
			
				|  |  | -		   System.out.println("x=" + x +"  "+ midi[x]);
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +		
 | 
	
		
			
				|  |  | +		NoteFrequencyRange range = new NoteFrequencyRange(440, 466);
 | 
	
		
			
				|  |  | +		
 | 
	
		
			
				|  |  | +		System.out.println("Min:" + range.getMinFrequency() + "  Max:" + range.getMaxFrequency());
 | 
	
		
			
				|  |  |  		
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	
 |