|  | @@ -2,6 +2,7 @@ package com.yonge.netty.dto;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import java.math.BigDecimal;
 |  |  import java.math.BigDecimal;
 | 
											
												
													
														|  |  import java.util.ArrayList;
 |  |  import java.util.ArrayList;
 | 
											
												
													
														|  | 
 |  | +import java.util.Arrays;
 | 
											
												
													
														|  |  import java.util.Comparator;
 |  |  import java.util.Comparator;
 | 
											
												
													
														|  |  import java.util.HashMap;
 |  |  import java.util.HashMap;
 | 
											
												
													
														|  |  import java.util.List;
 |  |  import java.util.List;
 | 
											
										
											
												
													
														|  | @@ -50,6 +51,8 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  	
 |  |  	
 | 
											
												
													
														|  |  	private float offsetMS;
 |  |  	private float offsetMS;
 | 
											
												
													
														|  |  	
 |  |  	
 | 
											
												
													
														|  | 
 |  | +	private float micDelayMS;
 | 
											
												
													
														|  | 
 |  | +	
 | 
											
												
													
														|  |  	private double dynamicOffset;
 |  |  	private double dynamicOffset;
 | 
											
												
													
														|  |  	
 |  |  	
 | 
											
												
													
														|  |  	private String platform;
 |  |  	private String platform;
 | 
											
										
											
												
													
														|  | @@ -161,6 +164,14 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  		this.offsetMS = offsetMS;
 |  |  		this.offsetMS = offsetMS;
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +	public float getMicDelayMS() {
 | 
											
												
													
														|  | 
 |  | +		return micDelayMS;
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	public void setMicDelayMS(float micDelayMS) {
 | 
											
												
													
														|  | 
 |  | +		this.micDelayMS = micDelayMS;
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  	public float getBeatDuration() {
 |  |  	public float getBeatDuration() {
 | 
											
												
													
														|  |  		return beatDuration;
 |  |  		return beatDuration;
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
										
											
												
													
														|  | @@ -377,16 +388,14 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  |  			totalChunkAnalysisList.add(chunkAnalysis);
 |  |  			totalChunkAnalysisList.add(chunkAnalysis);
 | 
											
												
													
														|  |  			
 |  |  			
 | 
											
												
													
														|  | -			boolean flag = false; //是否收到有效信号
 |  | 
 | 
											
												
													
														|  | -			if(!StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.FREQUENCY.getCode())){
 |  | 
 | 
											
												
													
														|  | -				flag = chunkAnalysis.getAmplitude() > hardLevel.getAmplitudeThreshold();
 |  | 
 | 
											
												
													
														|  | 
 |  | +			//是否收到有效信号
 | 
											
												
													
														|  | 
 |  | +			/*if(!StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.FREQUENCY.getCode())){
 | 
											
												
													
														|  | 
 |  | +				delayProcessed = chunkAnalysis.getAmplitude() > hardLevel.getAmplitudeThreshold();
 | 
											
												
													
														|  |  			}else{
 |  |  			}else{
 | 
											
												
													
														|  | -				flag = chunkAnalysis.getFrequency() > MIN_FREQUECY && chunkAnalysis.getFrequency() < MAX_FREQUECY;
 |  | 
 | 
											
												
													
														|  | 
 |  | +				delayProcessed = chunkAnalysis.getFrequency() > MIN_FREQUECY && chunkAnalysis.getFrequency() < MAX_FREQUECY;
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  |  			
 |  |  			
 | 
											
												
													
														|  | -			if(delayProcessed == false && flag){
 |  | 
 | 
											
												
													
														|  | -				
 |  | 
 | 
											
												
													
														|  | -				delayProcessed = true;
 |  | 
 | 
											
												
													
														|  | 
 |  | +			if(delayProcessed){
 | 
											
												
													
														|  |  				
 |  |  				
 | 
											
												
													
														|  |  				//计算延迟偏移值
 |  |  				//计算延迟偏移值
 | 
											
												
													
														|  |  				//playTime = musicXmlNote.getTimeStamp() + durationTime;
 |  |  				//playTime = musicXmlNote.getTimeStamp() + durationTime;
 | 
											
										
											
												
													
														|  | @@ -394,9 +403,11 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  				if(100 * dynamicOffset / musicXmlNote.getDuration() > (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()))){
 |  |  				if(100 * dynamicOffset / musicXmlNote.getDuration() > (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()))){
 | 
											
												
													
														|  |  					dynamicOffset = 0;
 |  |  					dynamicOffset = 0;
 | 
											
												
													
														|  |  				}
 |  |  				}
 | 
											
												
													
														|  | -			}
 |  | 
 | 
											
												
													
														|  | 
 |  | +			}*/
 | 
											
												
													
														|  |  			
 |  |  			
 | 
											
												
													
														|  | -			if (playTime >= (musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset)) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +			if (playTime >= (musicXmlNote.getDuration() + micDelayMS + musicXmlNote.getTimeStamp() + dynamicOffset)) {
 | 
											
												
													
														|  | 
 |  | +				
 | 
											
												
													
														|  | 
 |  | +				musicXmlNote.setTimeStamp(musicXmlNote.getTimeStamp() + micDelayMS);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  				if (musicXmlNote.getDontEvaluating()) {
 |  |  				if (musicXmlNote.getDontEvaluating()) {
 | 
											
												
													
														|  |  					noteAnalysis.setIgnore(true);
 |  |  					noteAnalysis.setIgnore(true);
 | 
											
										
											
												
													
														|  | @@ -732,7 +743,7 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  |  		double firstChunkStartTime = firstChunkAnalysis.getStartTime();
 |  |  		double firstChunkStartTime = firstChunkAnalysis.getStartTime();
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  | -		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkStartTime)).findFirst();
 |  | 
 | 
											
												
													
														|  | 
 |  | +		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkStartTime)).reduce((first, second) -> second);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		ChunkAnalysis lastChunkAnalysis = null;
 |  |  		ChunkAnalysis lastChunkAnalysis = null;
 | 
											
												
													
														|  |  		if (chunkAnalysisOptional.isPresent()) {
 |  |  		if (chunkAnalysisOptional.isPresent()) {
 | 
											
										
											
												
													
														|  | @@ -879,6 +890,8 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  			return false;
 |  |  			return false;
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  | 
 |  | +		reduceNoise(chunkList, EvaluationCriteriaEnum.AMPLITUDE);
 | 
											
												
													
														|  | 
 |  | +		
 | 
											
												
													
														|  |  		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
 |  |  		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  |  		LOGGER.debug("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
 |  |  		LOGGER.debug("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
 | 
											
										
											
												
													
														|  | @@ -890,18 +903,15 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  			return chunkList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0;
 |  |  			return chunkList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0;
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  | -		//Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).findFirst();
 |  | 
 | 
											
												
													
														|  |  		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).reduce((first, second) -> second);
 |  |  		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).reduce((first, second) -> second);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -		ChunkAnalysis lastChunkAnalysis = null;
 |  | 
 | 
											
												
													
														|  | 
 |  | +		ChunkAnalysis lastChunkAnalysis = new ChunkAnalysis(0, 0, -1, 0, 0, 0);;
 | 
											
												
													
														|  |  		if (chunkAnalysisOptional.isPresent()) {
 |  |  		if (chunkAnalysisOptional.isPresent()) {
 | 
											
												
													
														|  |  			lastChunkAnalysis = chunkAnalysisOptional.get();
 |  |  			lastChunkAnalysis = chunkAnalysisOptional.get();
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  | -		if(lastChunkAnalysis == null){
 |  | 
 | 
											
												
													
														|  | -			lastChunkAnalysis = new ChunkAnalysis(0, 0, -1, 0, 0, 0);
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  |  		List<Integer> chunkAmplitudeList = chunkList.stream().map(ChunkAnalysis::getAmplitude).collect(Collectors.toList());
 |  |  		List<Integer> chunkAmplitudeList = chunkList.stream().map(ChunkAnalysis::getAmplitude).collect(Collectors.toList());
 | 
											
												
													
														|  | 
 |  | +		
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		chunkAmplitudeList.add(0, lastChunkAnalysis.getAmplitude());
 |  |  		chunkAmplitudeList.add(0, lastChunkAnalysis.getAmplitude());
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
										
											
												
													
														|  | @@ -913,14 +923,17 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  		int firstPeakIndex = -1;
 |  |  		int firstPeakIndex = -1;
 | 
											
												
													
														|  |  		int firstPeakValue = 0;
 |  |  		int firstPeakValue = 0;
 | 
											
												
													
														|  |  		int peakSize = 0;
 |  |  		int peakSize = 0;
 | 
											
												
													
														|  | 
 |  | +		
 | 
											
												
													
														|  | 
 |  | +		//int range = hardLevel.getAmplitudeThreshold();
 | 
											
												
													
														|  | 
 |  | +		int range = 10;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		for (int i = 1; i < chunkAmplitudeList.size(); i++) {
 |  |  		for (int i = 1; i < chunkAmplitudeList.size(); i++) {
 | 
											
												
													
														|  | -			if (chunkAmplitudeList.get(i - 1) + hardLevel.getAmplitudeThreshold() >= chunkAmplitudeList.get(i)) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +			if (chunkAmplitudeList.get(i - 1) + range >= chunkAmplitudeList.get(i)) {
 | 
											
												
													
														|  |  				isContinue = false;
 |  |  				isContinue = false;
 | 
											
												
													
														|  |  				continue;
 |  |  				continue;
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -			if(isContinue == false && chunkAmplitudeList.get(i - 1) + hardLevel.getAmplitudeThreshold() < chunkAmplitudeList.get(i)){
 |  | 
 | 
											
												
													
														|  | 
 |  | +			if(isContinue == false && chunkAmplitudeList.get(i - 1) + range < chunkAmplitudeList.get(i)){
 | 
											
												
													
														|  |  				isContinue = true;
 |  |  				isContinue = true;
 | 
											
												
													
														|  |  				peakSize++;
 |  |  				peakSize++;
 | 
											
												
													
														|  |  				
 |  |  				
 | 
											
										
											
												
													
														|  | @@ -966,7 +979,7 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  |  		if (tempo) {
 |  |  		if (tempo) {
 | 
											
												
													
														|  |  			// 判断进入时间点
 |  |  			// 判断进入时间点
 | 
											
												
													
														|  | -			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) * 2){
 |  | 
 | 
											
												
													
														|  | 
 |  | +			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){
 | 
											
												
													
														|  |  				LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
 |  |  				LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
 | 
											
												
													
														|  |  				tempo = false;
 |  |  				tempo = false;
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
										
											
												
													
														|  | @@ -1025,16 +1038,30 @@ public class UserChannelContext {
 | 
											
												
													
														|  |  		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
 |  |  		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
 | 
											
												
													
														|  |  		return musicXmlNote.getTimeStamp() + dynamicOffset;
 |  |  		return musicXmlNote.getTimeStamp() + dynamicOffset;
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	private void reduceNoise(List<ChunkAnalysis> chunkAnalysisList, EvaluationCriteriaEnum criteria) {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		ChunkAnalysis chunkAnalysis = null;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +		for (int i = 1; i < chunkAnalysisList.size(); i++) {
 | 
											
												
													
														|  | 
 |  | +			if (i < chunkAnalysisList.size() - 1) {
 | 
											
												
													
														|  | 
 |  | +				chunkAnalysis = chunkAnalysisList.get(i);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +				if (EvaluationCriteriaEnum.AMPLITUDE == criteria) {
 | 
											
												
													
														|  | 
 |  | +					if (chunkAnalysisList.get(i - 1).getAmplitude() == 0 && chunkAnalysisList.get(i + 1).getAmplitude() == 0
 | 
											
												
													
														|  | 
 |  | +							&& chunkAnalysis.getAmplitude() > 0) {
 | 
											
												
													
														|  | 
 |  | +						
 | 
											
												
													
														|  | 
 |  | +						chunkAnalysis.setAmplitude(0);
 | 
											
												
													
														|  | 
 |  | +						//chunkAnalysisList.set(i, chunkAnalysis);
 | 
											
												
													
														|  | 
 |  | +					}
 | 
											
												
													
														|  | 
 |  | +				}
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +		}
 | 
											
												
													
														|  | 
 |  | +		
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	
 | 
											
												
													
														|  |  	
 |  |  	
 | 
											
												
													
														|  |  	public static void main(String[] args) {
 |  |  	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]);
 |  | 
 | 
											
												
													
														|  | -		}
 |  | 
 | 
											
												
													
														|  |  		
 |  |  		
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	
 |  |  	
 |