|
@@ -15,6 +15,7 @@ import java.util.stream.Collectors;
|
|
|
|
|
|
import javax.sound.sampled.AudioFormat;
|
|
|
|
|
|
+import com.yonge.cooleshow.common.enums.HardLevelEnum;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
@@ -539,7 +540,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 +675,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 +698,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 +725,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 +895,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 +981,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 +1004,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;
|
|
|
}
|