yonge 3 years ago
parent
commit
b83728d3b2

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

@@ -87,12 +87,22 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	public int getFrequencyThreshold() {
 		return frequencyThreshold;
 	}
-
-	public int getTempoEffectiveRange(int denominator) {
+	
+	public int getTempoEffectiveRange(int denominator, double duration) {
 		
 		int tempoEffectiveRange = 0;
 		
-		switch (denominator) {
+		if(duration >= 1000){
+			tempoEffectiveRange = 10;
+		}else if(duration >= 500){
+			tempoEffectiveRange = 15;
+		}else if(duration >= 200){
+			tempoEffectiveRange = 20;
+		}else{
+			tempoEffectiveRange = 25;
+		}
+		
+		/*switch (denominator) {
 		case 1:
 			tempoEffectiveRange = tempoEffectiveRangeOf1;
 			break;
@@ -114,7 +124,7 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 
 		default:
 			break;
-		}
+		}*/
 		return tempoEffectiveRange;
 	}
 

+ 14 - 10
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -365,8 +365,6 @@ public class UserChannelContext {
 		
 		if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
 			
-			LOGGER.debug("user:{}  startProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, startProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
-			
 			ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
 			
 			if(totalChunkAnalysisList.size() > 0){
@@ -395,6 +393,8 @@ public class UserChannelContext {
 				}
 			}
 			
+			LOGGER.debug("user:{}  startProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, startProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
+			
 			if (playTime >= (musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset)) {
 
 				if (musicXmlNote.getDontEvaluating()) {
@@ -532,7 +532,7 @@ public class UserChannelContext {
 
 	public void evaluateForNote(MusicXmlNote musicXmlNote, NoteAnalysis noteAnalysis) {
 		
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
@@ -665,18 +665,22 @@ public class UserChannelContext {
 
 	private int computeFrequency(MusicXmlNote musicXmlNote) {
 		
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
-		LOGGER.debug("------Pitch------standard start time:{}  floatingRange:{}  modified [ {} - {} ]------------", musicXmlNote.getTimeStamp(), floatingRange, startTime, endTime);
+		LOGGER.debug("------Pitch------standard start time:{}  floatingRange:{}  modified [ {} - {} ]------------", musicXmlNote.getTimeStamp() + dynamicOffset, floatingRange, startTime, endTime);
 		
 		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();
 		
+		//重新计算延迟
+		dynamicOffset = correctedStartTime - musicXmlNote.getTimeStamp();
+		dynamicOffset = dynamicOffset < 0 ? 0 : dynamicOffset;
+		
 		chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
 
 		//根据完整度取部分有效信号
@@ -713,7 +717,7 @@ public class UserChannelContext {
 	 */
 	private int computeTempoWithFrequency(MusicXmlNote musicXmlNote){
 		
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
@@ -861,7 +865,7 @@ public class UserChannelContext {
 		
 		if (tempo == 0) {
 			// 判断进入时间点
-			if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())){
+			if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){
 				// 节奏慢
 				tempo = 2;
 				LOGGER.debug("节奏错误原因:进入时间点太晚");
@@ -881,7 +885,7 @@ public class UserChannelContext {
 	
 	private int computeTempoWithAmplitude2(MusicXmlNote musicXmlNote) {
 
-		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
+		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
 		
 		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
 		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
@@ -896,7 +900,7 @@ public class UserChannelContext {
 		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;
+		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 		List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(0, elementSize);
 		
 		if(chunkList == null || chunkList.size() == 0){
@@ -967,7 +971,7 @@ public class UserChannelContext {
 		
 		if (tempo == 0) {
 			// 判断进入时间点
-			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) * 2){
+			if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) * 2){
 				LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
 				tempo = 1;
 			}

+ 3 - 3
audio-analysis/src/test/java/com/yonge/netty/client/NettyClient.java

@@ -84,17 +84,17 @@ public class NettyClient {
 	        handler.handshakeFuture().sync();
 	        
 			//step1发送xml
-			String step1 = FileUtils.readFileToString(FileUtils.toFile(WebSocketClientHandler.class.getResource("/悬崖上的金鱼姬1 速度160.json")));
+			String step1 = FileUtils.readFileToString(FileUtils.toFile(WebSocketClientHandler.class.getResource("/扬基歌88.json")));
 			channel.writeAndFlush(new TextWebSocketFrame(step1));
 			
 			String step2 = "{\"header\":{\"commond\":\"recordStart\",\"type\":\"SOUND_COMPARE\",\"status\":200}}";
 			channel.writeAndFlush(new TextWebSocketFrame(step2));
 			
-			String step3 = "{\"body\":{\"offsetTime\":1320},\"uuid\":\"1657779786620650261\",\"header\":{\"commond\":\"audioPlayStart\",\"type\":\"SOUND_COMPARE\"}}";
+			String step3 = "{\"body\":{\"offsetTime\":89},\"uuid\":\"1657779786620650261\",\"header\":{\"commond\":\"audioPlayStart\",\"type\":\"SOUND_COMPARE\"}}";
 			channel.writeAndFlush(new TextWebSocketFrame(step3));
 			
 			//step4 发送wav
-			String fileName = "/悬崖上的金鱼姬1 速度160.wav";
+			String fileName = "/扬基歌_速度88.wav";
 			AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(FileUtils.toFile(WebSocketClientHandler.class.getResource(fileName)));
 			
 			AudioFormat baseFormat = audioInputStream.getFormat();

File diff suppressed because it is too large
+ 0 - 0
audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json


File diff suppressed because it is too large
+ 0 - 0
audio-analysis/src/test/resources/扬基歌88.json


BIN
audio-analysis/src/test/resources/扬基歌_速度88.wav


Some files were not shown because too many files changed in this diff