| 
					
				 | 
			
			
				@@ -346,8 +346,10 @@ public class UserChannelContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		int splDb = (int) Signals.soundPressureLevel(samples); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		int power = (int) Signals.power(samples); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		int amplitude = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		float power = Signals.power(samples); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		int amplitude = (int) Signals.norm(samples); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		int decibels = (int) Signals.decibels(samples); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if(StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.AMPLITUDE.getCode())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			amplitude = (int) Signals.norm(samples); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}else if(StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.DECIBELS.getCode())){ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -377,7 +379,7 @@ public class UserChannelContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			LOGGER.debug("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			LOGGER.debug("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  power:{}  amplitude:{} decibels:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, power, amplitude, decibels, playTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -792,66 +794,56 @@ public class UserChannelContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			totalTimes = chunkList.size(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (maxTimes * 100 / totalTimes < hardLevel.getIntegrityRange()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			tempo = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			LOGGER.debug("节奏错误原因:信号分堆后的最大数量不足指定的完成比例"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for (int i = 0; i < chunkList.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			chunkAnalysis = chunkList.get(i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if (chunkAnalysis != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if (chunkAnalysis.getFrequency() > MIN_FREQUECY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					tempo = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (firstPeakIndex == -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						firstPeakIndex = i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, chunkAnalysis.getFrequency()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} else if (noteFrequencyRange.getMinFrequency() > chunkAnalysis.getFrequency() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							|| chunkAnalysis.getFrequency() > noteFrequencyRange.getMaxFrequency()) {// 判断是否是同一个音 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						//是否是低八度或高八度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						if(!((noteFrequencyRange.getMinFrequency() < chunkAnalysis.getFrequency() * 2 && chunkAnalysis.getFrequency() * 2 < noteFrequencyRange.getMaxFrequency()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								|| (noteFrequencyRange.getMinFrequency() < chunkAnalysis.getFrequency() / 2 && chunkAnalysis.getFrequency() / 2 < noteFrequencyRange.getMaxFrequency()))){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							tempo = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							LOGGER.debug("节奏错误原因:不是同一个音[{}]:{}-{}", chunkAnalysis.getFrequency(), noteFrequencyRange.getMinFrequency(), noteFrequencyRange.getMaxFrequency()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (isContinue == false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						if ((i + 1) / chunkAnalysisList.size() < hardLevel.getIntegrityRange()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							if (unplayedSize > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								tempo = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								LOGGER.debug("节奏错误原因:信号不连续"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (tempo == true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						isContinue = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						unplayedSize++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (tempo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// 判断进入时间点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				tempo = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				LOGGER.debug("节奏错误原因:进入时间点太晚"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				//判断是否与上一个音延续下来的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 判断进入时间点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			LOGGER.debug("节奏错误原因:进入时间点太晚"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//判断是否与上一个音延续下来的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(correctedStartTime == musicXmlNote.getTimeStamp() + dynamicOffset) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if(firstChunkAnalysis.getFrequency() > MIN_FREQUECY && lastChunkAnalysis.getFrequency() > MIN_FREQUECY){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					if(tempo == false){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						LOGGER.debug("节奏错误原因:上一个音[{}]延续下来导致的", lastChunkAnalysis.getFrequency()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		//判断过程中声音是否有起伏 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		float minValue = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		int depth = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for (int i = 1; i < chunkList.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(i == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				minValue = chunkList.get(i - 1).getSplDb(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (Math.abs(minValue - chunkList.get(i).getSplDb()) >= 6) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				LOGGER.debug("范围内查询到音波信号,correctedStartTime:{}", chunkList.get(i).getStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			minValue = Math.min(minValue , chunkList.get(i).getSplDb()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (depth >= 2 && Math.max(chunkList.get(i - 1).getPower(), chunkList.get(i).getPower()) / Math.min(chunkList.get(i - 1).getPower(), chunkList.get(i).getPower()) >= 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tempo = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				depth++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				LOGGER.debug("节奏错误原因:声波不稳定[{}]", chunkList.get(i).getEndTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return tempo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -999,17 +991,38 @@ public class UserChannelContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		double startTime = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		float minValue = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for (int i = 1; i < chunkAnalysisList.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(i == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				minValue = chunkAnalysisList.get(i - 1).getSplDb(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (Math.abs(minValue - chunkAnalysisList.get(i).getSplDb()) >= 6) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				LOGGER.debug("范围内查询到音波信号,correctedStartTime:{}", chunkAnalysisList.get(i).getStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				startTime = chunkAnalysisList.get(i).getStartTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			minValue = Math.min(minValue , chunkAnalysisList.get(i).getSplDb()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (Math.max(chunkAnalysisList.get(i - 1).getPower(), chunkAnalysisList.get(i).getPower()) / Math.min(chunkAnalysisList.get(i - 1).getPower(), chunkAnalysisList.get(i).getPower()) >= 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				LOGGER.debug("范围内查询到音波信号,correctedStartTime:{}", chunkAnalysisList.get(i).getStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				startTime = chunkAnalysisList.get(i).getStartTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		//判断是否与上一个音是同一个音符 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if(musicXmlNote.getMusicalNotesIndex() > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			MusicXmlNote preMusicXmlNote = getCurrentMusicNote(null, musicXmlNote.getMusicalNotesIndex() - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if((int)preMusicXmlNote.getFrequency() == (int)musicXmlNote.getFrequency()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MIN_FREQUECY).findFirst(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if(optional.isPresent()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					LOGGER.debug("与上一个音同音,有断开,correctedStartTime:{}", optional.get().getStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return optional.get().getEndTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					LOGGER.debug("与上一个音同音,未断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					return musicXmlNote.getTimeStamp() + dynamicOffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					LOGGER.debug("与上一个音同音,有断开,correctedStartTime:{}", optional.get().getEndTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return Math.max(optional.get().getEndTime(), startTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1021,15 +1034,17 @@ public class UserChannelContext { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		for (ChunkAnalysis ca : chunkAnalysisList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			noteFrequencyRange = new NoteFrequencyRange(standardFrequecy, ca.getFrequency()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (standardNote.equals(noteFrequencyRange)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				LOGGER.debug("范围内查询到信号,correctedStartTime:{}", ca.getStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return ca.getStartTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				LOGGER.debug("范围内查询到音高信号,correctedStartTime:{}", ca.getStartTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return Math.max(ca.getStartTime(), startTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(startTime  == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			LOGGER.debug("范围内未查询到信号,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return musicXmlNote.getTimeStamp() + dynamicOffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return Math.max(musicXmlNote.getTimeStamp() + dynamicOffset, startTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	private void reduceNoise(List<ChunkAnalysis> chunkAnalysisList, EvaluationCriteriaEnum criteria) { 
			 |