yonge 3 years ago
parent
commit
27ae10370d

+ 40 - 24
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -30,7 +30,7 @@ import com.yonge.netty.server.processor.WaveformWriter;
  */
 public class UserChannelContext {
 	
-	private final static Logger LOGGER = LoggerFactory.getLogger(UserChannelContext.class);
+	private final static Logger LOGGER = LoggerFactory.getLogger(UserChannelContext3.class);
 	
 	private double standardFrequecy = 442;
 	
@@ -355,9 +355,9 @@ public class UserChannelContext {
 				//计算延迟偏移值
 				//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,14 +489,16 @@ public class UserChannelContext {
 	public void evaluateForNote(MusicXmlNote musicXmlNote, NoteAnalysis noteAnalysis) {
 		
 		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
-		double endTime = musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset;
-		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset;
+		
+		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
+		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
 		List<ChunkAnalysis> chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(startTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(endTime)).collect(Collectors.toList());
-
-		//根据完整度取部分有效信号
-		int elementSize = chunkAnalysisList.size() * (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())) / 100;
-		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
+		
+		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());
 		
 		double playDurationTime = 0;
 		
@@ -594,15 +596,20 @@ public class UserChannelContext {
 	private int computeFrequency(MusicXmlNote musicXmlNote) {
 		
 		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
-		double endTime = musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
-		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset;
+		
+		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
+		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
 		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;
+		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
-		
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 			return -1;
 		}
@@ -635,13 +642,19 @@ public class UserChannelContext {
 	private boolean computeTempoWithFrequency(MusicXmlNote musicXmlNote){
 		
 		double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
-		double endTime = musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
-		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset;
+		
+		double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
+		double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
 		
 		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;
+		int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
 		chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
 		
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
@@ -716,8 +729,7 @@ public class UserChannelContext {
 			if(firstPeakIndex * 100 /chunkAnalysisList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())){
 				tempo = false;
 				LOGGER.info("节奏错误原因:进入时间点太晚");
-			}
-			if(tempo){
+			}else{
 				//判断是否与上一个音延续下来的
 				if(firstChunkAnalysis.getFrequency() > 100 && lastChunkAnalysis.getFrequency() > 100){
 					tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false;
@@ -827,14 +839,18 @@ public class UserChannelContext {
 			}
 		}
 
-		return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
+		//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
+		return musicXmlNote.getTimeStamp() + dynamicOffset;
 	}
 	
 	public static void main(String[] args) {
-		
-		NoteFrequencyRange range = new NoteFrequencyRange(440, 466);
-		
-		System.out.println("Min:" + range.getMinFrequency() + "  Max:" + range.getMaxFrequency());
+		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]);
+		}
 		
 	}
 	

+ 24 - 40
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext3.java

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