|
@@ -2,6 +2,7 @@ package com.yonge.netty.dto;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
|
+import java.util.Arrays;
|
|
import java.util.Comparator;
|
|
import java.util.Comparator;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
@@ -50,6 +51,8 @@ public class UserChannelContext {
|
|
|
|
|
|
private float offsetMS;
|
|
private float offsetMS;
|
|
|
|
|
|
|
|
+ private float micDelayMS;
|
|
|
|
+
|
|
private double dynamicOffset;
|
|
private double dynamicOffset;
|
|
|
|
|
|
private String platform;
|
|
private String platform;
|
|
@@ -161,6 +164,14 @@ public class UserChannelContext {
|
|
this.offsetMS = offsetMS;
|
|
this.offsetMS = offsetMS;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public float getMicDelayMS() {
|
|
|
|
+ return micDelayMS;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void setMicDelayMS(float micDelayMS) {
|
|
|
|
+ this.micDelayMS = micDelayMS;
|
|
|
|
+ }
|
|
|
|
+
|
|
public float getBeatDuration() {
|
|
public float getBeatDuration() {
|
|
return beatDuration;
|
|
return beatDuration;
|
|
}
|
|
}
|
|
@@ -377,16 +388,14 @@ public class UserChannelContext {
|
|
}
|
|
}
|
|
totalChunkAnalysisList.add(chunkAnalysis);
|
|
totalChunkAnalysisList.add(chunkAnalysis);
|
|
|
|
|
|
- boolean flag = false; //是否收到有效信号
|
|
|
|
- if(!StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.FREQUENCY.getCode())){
|
|
|
|
- flag = chunkAnalysis.getAmplitude() > hardLevel.getAmplitudeThreshold();
|
|
|
|
|
|
+ //是否收到有效信号
|
|
|
|
+ /*if(!StringUtils.equalsIgnoreCase(evaluationCriteria, EvaluationCriteriaEnum.FREQUENCY.getCode())){
|
|
|
|
+ delayProcessed = chunkAnalysis.getAmplitude() > hardLevel.getAmplitudeThreshold();
|
|
}else{
|
|
}else{
|
|
- flag = chunkAnalysis.getFrequency() > MIN_FREQUECY && chunkAnalysis.getFrequency() < MAX_FREQUECY;
|
|
|
|
|
|
+ delayProcessed = chunkAnalysis.getFrequency() > MIN_FREQUECY && chunkAnalysis.getFrequency() < MAX_FREQUECY;
|
|
}
|
|
}
|
|
|
|
|
|
- if(delayProcessed == false && flag){
|
|
|
|
-
|
|
|
|
- delayProcessed = true;
|
|
|
|
|
|
+ if(delayProcessed){
|
|
|
|
|
|
//计算延迟偏移值
|
|
//计算延迟偏移值
|
|
//playTime = musicXmlNote.getTimeStamp() + durationTime;
|
|
//playTime = musicXmlNote.getTimeStamp() + durationTime;
|
|
@@ -394,9 +403,11 @@ public class UserChannelContext {
|
|
if(100 * dynamicOffset / musicXmlNote.getDuration() > (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()))){
|
|
if(100 * dynamicOffset / musicXmlNote.getDuration() > (100 - hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()))){
|
|
dynamicOffset = 0;
|
|
dynamicOffset = 0;
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
|
|
|
|
- if (playTime >= (musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset)) {
|
|
|
|
|
|
+ if (playTime >= (musicXmlNote.getDuration() + micDelayMS + musicXmlNote.getTimeStamp() + dynamicOffset)) {
|
|
|
|
+
|
|
|
|
+ musicXmlNote.setTimeStamp(musicXmlNote.getTimeStamp() + micDelayMS);
|
|
|
|
|
|
if (musicXmlNote.getDontEvaluating()) {
|
|
if (musicXmlNote.getDontEvaluating()) {
|
|
noteAnalysis.setIgnore(true);
|
|
noteAnalysis.setIgnore(true);
|
|
@@ -732,7 +743,7 @@ public class UserChannelContext {
|
|
|
|
|
|
double firstChunkStartTime = firstChunkAnalysis.getStartTime();
|
|
double firstChunkStartTime = firstChunkAnalysis.getStartTime();
|
|
|
|
|
|
- Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkStartTime)).findFirst();
|
|
|
|
|
|
+ Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkStartTime)).reduce((first, second) -> second);
|
|
|
|
|
|
ChunkAnalysis lastChunkAnalysis = null;
|
|
ChunkAnalysis lastChunkAnalysis = null;
|
|
if (chunkAnalysisOptional.isPresent()) {
|
|
if (chunkAnalysisOptional.isPresent()) {
|
|
@@ -879,6 +890,8 @@ public class UserChannelContext {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ reduceNoise(chunkList, EvaluationCriteriaEnum.AMPLITUDE);
|
|
|
|
+
|
|
ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
|
|
ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
|
|
|
|
|
|
LOGGER.debug("-------startTime:{} endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
|
|
LOGGER.debug("-------startTime:{} endTime:{}------", firstChunkAnalysis.getStartTime(), chunkList.get(chunkList.size() - 1)
|
|
@@ -890,18 +903,15 @@ public class UserChannelContext {
|
|
return chunkList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0;
|
|
return chunkList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0;
|
|
}
|
|
}
|
|
|
|
|
|
- //Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).findFirst();
|
|
|
|
Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).reduce((first, second) -> second);
|
|
Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) < Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).reduce((first, second) -> second);
|
|
|
|
|
|
- ChunkAnalysis lastChunkAnalysis = null;
|
|
|
|
|
|
+ ChunkAnalysis lastChunkAnalysis = new ChunkAnalysis(0, 0, -1, 0, 0, 0);;
|
|
if (chunkAnalysisOptional.isPresent()) {
|
|
if (chunkAnalysisOptional.isPresent()) {
|
|
lastChunkAnalysis = chunkAnalysisOptional.get();
|
|
lastChunkAnalysis = chunkAnalysisOptional.get();
|
|
}
|
|
}
|
|
- if(lastChunkAnalysis == null){
|
|
|
|
- lastChunkAnalysis = new ChunkAnalysis(0, 0, -1, 0, 0, 0);
|
|
|
|
- }
|
|
|
|
|
|
|
|
List<Integer> chunkAmplitudeList = chunkList.stream().map(ChunkAnalysis::getAmplitude).collect(Collectors.toList());
|
|
List<Integer> chunkAmplitudeList = chunkList.stream().map(ChunkAnalysis::getAmplitude).collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
|
|
chunkAmplitudeList.add(0, lastChunkAnalysis.getAmplitude());
|
|
chunkAmplitudeList.add(0, lastChunkAnalysis.getAmplitude());
|
|
|
|
|
|
@@ -913,14 +923,17 @@ public class UserChannelContext {
|
|
int firstPeakIndex = -1;
|
|
int firstPeakIndex = -1;
|
|
int firstPeakValue = 0;
|
|
int firstPeakValue = 0;
|
|
int peakSize = 0;
|
|
int peakSize = 0;
|
|
|
|
+
|
|
|
|
+ //int range = hardLevel.getAmplitudeThreshold();
|
|
|
|
+ int range = 10;
|
|
|
|
|
|
for (int i = 1; i < chunkAmplitudeList.size(); i++) {
|
|
for (int i = 1; i < chunkAmplitudeList.size(); i++) {
|
|
- if (chunkAmplitudeList.get(i - 1) + hardLevel.getAmplitudeThreshold() >= chunkAmplitudeList.get(i)) {
|
|
|
|
|
|
+ if (chunkAmplitudeList.get(i - 1) + range >= chunkAmplitudeList.get(i)) {
|
|
isContinue = false;
|
|
isContinue = false;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
- if(isContinue == false && chunkAmplitudeList.get(i - 1) + hardLevel.getAmplitudeThreshold() < chunkAmplitudeList.get(i)){
|
|
|
|
|
|
+ if(isContinue == false && chunkAmplitudeList.get(i - 1) + range < chunkAmplitudeList.get(i)){
|
|
isContinue = true;
|
|
isContinue = true;
|
|
peakSize++;
|
|
peakSize++;
|
|
|
|
|
|
@@ -966,7 +979,7 @@ public class UserChannelContext {
|
|
|
|
|
|
if (tempo) {
|
|
if (tempo) {
|
|
// 判断进入时间点
|
|
// 判断进入时间点
|
|
- if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) * 2){
|
|
|
|
|
|
+ if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){
|
|
LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
|
|
LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
|
|
tempo = false;
|
|
tempo = false;
|
|
}
|
|
}
|
|
@@ -1025,16 +1038,30 @@ public class UserChannelContext {
|
|
//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
|
|
//return chunkAnalysisList.get(chunkAnalysisList.size() - 1).getEndTime();
|
|
return musicXmlNote.getTimeStamp() + dynamicOffset;
|
|
return musicXmlNote.getTimeStamp() + dynamicOffset;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private void reduceNoise(List<ChunkAnalysis> chunkAnalysisList, EvaluationCriteriaEnum criteria) {
|
|
|
|
+
|
|
|
|
+ ChunkAnalysis chunkAnalysis = null;
|
|
|
|
+
|
|
|
|
+ for (int i = 1; i < chunkAnalysisList.size(); i++) {
|
|
|
|
+ if (i < chunkAnalysisList.size() - 1) {
|
|
|
|
+ chunkAnalysis = chunkAnalysisList.get(i);
|
|
|
|
+
|
|
|
|
+ if (EvaluationCriteriaEnum.AMPLITUDE == criteria) {
|
|
|
|
+ if (chunkAnalysisList.get(i - 1).getAmplitude() == 0 && chunkAnalysisList.get(i + 1).getAmplitude() == 0
|
|
|
|
+ && chunkAnalysis.getAmplitude() > 0) {
|
|
|
|
+
|
|
|
|
+ chunkAnalysis.setAmplitude(0);
|
|
|
|
+ //chunkAnalysisList.set(i, chunkAnalysis);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
public static void main(String[] args) {
|
|
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]);
|
|
|
|
- }
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|