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