Browse Source

bugfix:节奏问题

yonge 6 months ago
parent
commit
b67862b98c

+ 4 - 4
audio-analysis/src/main/java/com/yonge/netty/dto/ChunkAnalysis.java

@@ -12,13 +12,13 @@ public class ChunkAnalysis {
 
 	private int splDb;
 
-	private int power;
+	private float power;
 	
 	private int amplitude;
 	
 	private boolean isPeak;
 
-	public ChunkAnalysis(double startTime, double endTime, int frequency, int splDb, int power, int amplitude) {
+	public ChunkAnalysis(double startTime, double endTime, int frequency, int splDb, float power, int amplitude) {
 		this.startTime = startTime;
 		this.endTime = endTime;
 		this.frequency = frequency;
@@ -74,11 +74,11 @@ public class ChunkAnalysis {
 		this.splDb = splDb;
 	}
 
-	public int getPower() {
+	public float getPower() {
 		return power;
 	}
 
-	public void setPower(int power) {
+	public void setPower(float power) {
 		this.power = power;
 	}
 

+ 1 - 1
audio-analysis/src/main/java/com/yonge/netty/dto/HardLevelEnum.java

@@ -9,7 +9,7 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * 完成度范围, 未演奏的范围
 	 */
 	//BEGINNER("入门级", 3, 5, 5, 5, 10, 10, 13, 15, 60, 10), 
-	BEGINNER("入门级", 3, 5, 10, 10, 15, 15, 22, 22, 75, 25), 
+	BEGINNER("入门级", 3, 5, 10, 10, 15, 15, 22, 22, 75, 10), 
 	/**
 	 * 进阶级, 振幅阈值, 频率阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>

+ 73 - 58
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -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) {

+ 2 - 2
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -238,8 +238,8 @@ public class AudioCompareHandler implements MessageHandler {
 
 			Integer offsetTime = dataObj.getInteger("offsetTime");
 			Integer micDelay = dataObj.getInteger("micDelay");
-			channelContext.setMicDelayMS(micDelay + offsetTime);
-			channelContext.setOffsetMS(0);
+			channelContext.setMicDelayMS(0);
+			channelContext.setOffsetMS(micDelay + offsetTime);
 			channelContext.setHandlerSwitch(true);
 
 			break;