| 
					
				 | 
			
			
				@@ -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()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 
			 |