yonge 3 năm trước cách đây
mục cha
commit
5931637d85

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

@@ -8,7 +8,7 @@ public class ChunkAnalysis {
 
 	private double durationTime;
 
-	private int frequency;
+	private double frequency;
 
 	private int splDb;
 
@@ -18,7 +18,7 @@ public class ChunkAnalysis {
 	
 	private boolean isPeak;
 
-	public ChunkAnalysis(double startTime, double endTime, int frequency, int splDb, int power, int amplitude) {
+	public ChunkAnalysis(double startTime, double endTime, double frequency, int splDb, int power, int amplitude) {
 		this.startTime = startTime;
 		this.endTime = endTime;
 		this.frequency = frequency;
@@ -28,7 +28,7 @@ public class ChunkAnalysis {
 		this.durationTime = endTime - startTime;
 	}
 
-	public ChunkAnalysis(int frequency, int splDb, int power) {
+	public ChunkAnalysis(double frequency, int splDb, int power) {
 		this.frequency = frequency;
 		this.splDb = splDb;
 		this.power = power;
@@ -58,11 +58,11 @@ public class ChunkAnalysis {
 		this.durationTime = durationTime;
 	}
 
-	public int getFrequency() {
+	public double getFrequency() {
 		return frequency;
 	}
 
-	public void setFrequency(int frequency) {
+	public void setFrequency(double frequency) {
 		this.frequency = frequency;
 	}
 

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

@@ -4,32 +4,30 @@ import com.yonge.toolset.base.enums.BaseEnum;
 
 public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	/**
-	 * 入门级, 振幅阈值, 频率阈值 <br>
+	 * 入门级, 振幅阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
 	//BEGINNER("入门级", 3, 5, 5, 5, 10, 10, 13, 15, 60, 10), 
-	BEGINNER("入门级", 3, 5, 12, 18, 23, 28, 75, 25), 
+	BEGINNER("入门级", 3, 12, 18, 23, 28, 75, 25), 
 	/**
-	 * 进阶级, 振幅阈值, 频率阈值 <br>
+	 * 进阶级, 振幅阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
-	ADVANCED("进阶级", 3, 5, 10, 15, 20, 25, 85, 15),
+	ADVANCED("进阶级", 3, 10, 15, 20, 25, 85, 15),
 	//ADVANCED("进阶级", 3, 5, 50, 50, 50, 50, 50, 5, 80, 10),
 	/**
-	 * 大师级, 振幅阈值, 频率阈值 <br>
+	 * 大师级, 振幅阈值 <br>
 	 * 节奏有效范围(1分音符), 节奏有效范围(2分音符), 节奏有效范围(4分音符), 节奏有效范围(8分音符), 节奏有效范围(16分音符), 节奏有效范围(32分音符)<br>
 	 * 完成度范围, 未演奏的范围
 	 */
-	PERFORMER("大师级", 3, 3, 5, 10, 13, 15, 95, 10);
+	PERFORMER("大师级", 3, 5, 10, 13, 15, 95, 10);
 
 	private String msg;
 
 	private int amplitudeThreshold;
 
-	private int frequencyThreshold;
-
 	private int tempoEffectiveRangeOf1;
 
 	private int tempoEffectiveRangeOf2;
@@ -47,7 +45,6 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * 
 	 * @param msg
 	 * @param amplitudeThreshold 振幅阈值
-	 * @param frequencyThreshold 频率阈值
 	 * @param tempoEffectiveRangeOf1 节奏偏移量百分比(在当前范围内节奏才算正确)
 	 * @param tempoEffectiveRangeOf2 节奏偏移量百分比(在当前范围内节奏才算正确)
 	 * @param tempoEffectiveRangeOf4 节奏偏移量百分比(在当前范围内节奏才算正确)
@@ -55,12 +52,11 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 	 * @param integrityRange 完成度范围
 	 * @param notPlayRange 未演奏的范围
 	 */
-	HardLevelEnum(String msg, int amplitudeThreshold, int frequencyThreshold, int tempoEffectiveRangeOf1, int tempoEffectiveRangeOf2,
+	HardLevelEnum(String msg, int amplitudeThreshold, int tempoEffectiveRangeOf1, int tempoEffectiveRangeOf2,
 			int tempoEffectiveRangeOf4, int tempoEffectiveRangeOf8, int integrityRange,
 			int notPlayRange) {
 		this.msg = msg;
 		this.amplitudeThreshold = amplitudeThreshold;
-		this.frequencyThreshold = frequencyThreshold;
 		this.tempoEffectiveRangeOf1 = tempoEffectiveRangeOf1;
 		this.tempoEffectiveRangeOf2 = tempoEffectiveRangeOf2;
 		this.tempoEffectiveRangeOf4 = tempoEffectiveRangeOf4;
@@ -77,10 +73,6 @@ public enum HardLevelEnum implements BaseEnum<String, HardLevelEnum> {
 		return amplitudeThreshold;
 	}
 
-	public int getFrequencyThreshold() {
-		return frequencyThreshold;
-	}
-	
 	public int getTempoEffectiveRange(int denominator, double duration) {
 		
 		int tempoEffectiveRange = 0;

+ 30 - 11
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -539,7 +539,7 @@ public class UserChannelContext {
 		
 		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 correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote, floatingRange);
 		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());
@@ -674,7 +674,7 @@ public class UserChannelContext {
 		
 		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 correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote, floatingRange);
 		double correctedEndTime = correctedStartTime + musicXmlNote.getDuration();
 		
 		//重新计算延迟
@@ -697,14 +697,14 @@ public class UserChannelContext {
 		
 		List<ChunkAnalysis> chunkList = new ArrayList<ChunkAnalysis>(chunkAnalysisList);
 		
-		List<Integer> chunkFrequencyList = chunkList.stream().map(t -> t.getFrequency()).filter(t -> t.doubleValue() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch() && t.doubleValue() < MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMaxPitch())
+		List<Double> chunkFrequencyList = chunkList.stream().map(t -> t.getFrequency()).filter(t -> t.doubleValue() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch() && t.doubleValue() < MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMaxPitch())
 				.collect(Collectors.toList());
 		
 		if (chunkFrequencyList.size() == 0) {
 			return -1;
 		}
 
-		int frequency = (int) (chunkFrequencyList.stream().mapToInt(t -> t).sum() / chunkFrequencyList.size());
+		int frequency = (int) (chunkFrequencyList.stream().mapToDouble(t -> t).sum() / chunkFrequencyList.size());
 
 		return frequency;
 	}
@@ -724,7 +724,7 @@ public class UserChannelContext {
 		
 		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 correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote, floatingRange);
 		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());
@@ -894,7 +894,7 @@ public class UserChannelContext {
 		
 		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 correctedStartTime = queryFirstNoteStartTime(chunkAnalysisList, musicXmlNote, floatingRange);
 		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());
@@ -980,7 +980,7 @@ public class UserChannelContext {
 		return tempo;
 	}
 	
-	private double queryFirstNoteStartTime(List<ChunkAnalysis> chunkAnalysisList, MusicXmlNote musicXmlNote) {
+	private double queryFirstNoteStartTime(List<ChunkAnalysis> chunkAnalysisList, MusicXmlNote musicXmlNote, double floatingRange) {
 		
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 			LOGGER.debug("[查询第一个音]找不到数据,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
@@ -1003,10 +1003,29 @@ public class UserChannelContext {
 			MusicXmlNote preMusicXmlNote = getCurrentMusicNote(null, musicXmlNote.getMusicalNotesIndex() - 1);
 			if((int)preMusicXmlNote.getFrequency() == (int)musicXmlNote.getFrequency()){
 				Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch()).findFirst();
-				if(optional.isPresent()){
-					LOGGER.debug("[查询第一个音]与上一个音同音,有断开,correctedStartTime:{}", optional.get().getEndTime());
-					return optional.get().getEndTime();
-				}else{
+				if (optional.isPresent()) {// 与上一个音同音,有断开
+					
+					double restNotes = optional.get().getEndTime();
+
+					optional = chunkAnalysisList
+							.stream()
+							.filter(t -> t.getStartTime() >= restNotes && t.getFrequency() > MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMinPitch()
+									&& t.getFrequency() < MusicalInstrumentsPitchRange.get(subjectId, standardFrequecy).getMaxPitch()).findFirst();
+					if(optional.isPresent()){
+						LOGGER.debug("[查询第一个音]与上一个音同音,有断开,correctedStartTime:{}", optional.get().getStartTime());
+						return optional.get().getStartTime();
+					}else{
+						
+						if((int)musicXmlNote.getFrequency() == -1){
+							LOGGER.debug("[查询第一个音]与上一个音同音,有断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
+							return musicXmlNote.getTimeStamp() + dynamicOffset;
+						}else{
+							LOGGER.debug("[查询第一个音]与上一个音同音,有断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + floatingRange + dynamicOffset);
+							return musicXmlNote.getTimeStamp() + floatingRange + dynamicOffset;
+						}
+					}
+
+				} else {
 					LOGGER.debug("[查询第一个音]与上一个音同音,未断开,correctedStartTime:{}", musicXmlNote.getTimeStamp() + dynamicOffset);
 					return musicXmlNote.getTimeStamp() + dynamicOffset;
 				}

+ 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("/扬基歌88.json")));
+			String step1 = FileUtils.readFileToString(FileUtils.toFile(WebSocketClientHandler.class.getResource("/悬崖上的金鱼姬1 速度160.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\":89},\"uuid\":\"1657779786620650261\",\"header\":{\"commond\":\"audioPlayStart\",\"type\":\"SOUND_COMPARE\"}}";
+			String step3 = "{\"body\":{\"offsetTime\":1302},\"uuid\":\"1657779786620650261\",\"header\":{\"commond\":\"audioPlayStart\",\"type\":\"SOUND_COMPARE\"}}";
 			channel.writeAndFlush(new TextWebSocketFrame(step3));
 			
 			//step4 发送wav
-			String fileName = "/扬基歌_速度88.wav";
+			String fileName = "/悬崖上的金鱼姬1 速度160.wav";
 			AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(FileUtils.toFile(WebSocketClientHandler.class.getResource(fileName)));
 			
 			AudioFormat baseFormat = audioInputStream.getFormat();

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
audio-analysis/src/test/resources/悬崖上的金鱼姬1 速度160.json


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác