|
@@ -32,6 +32,8 @@ public class UserChannelContext {
|
|
|
|
|
|
private final static Logger LOGGER = LoggerFactory.getLogger(UserChannelContext3.class);
|
|
|
|
|
|
+ private String user;
|
|
|
+
|
|
|
private double standardFrequecy = 442;
|
|
|
|
|
|
private int offsetMS;
|
|
@@ -73,6 +75,8 @@ public class UserChannelContext {
|
|
|
|
|
|
private HardLevelEnum hardLevel = HardLevelEnum.ADVANCED;
|
|
|
|
|
|
+ private boolean handlerSwitch;
|
|
|
+
|
|
|
private NotePlayResult queryNoteFrequency(MusicXmlNote xmlNote, double playFrequency) {
|
|
|
|
|
|
NotePlayResult result = new NotePlayResult();
|
|
@@ -131,6 +135,10 @@ public class UserChannelContext {
|
|
|
return datas;
|
|
|
}
|
|
|
|
|
|
+ public void setUser(String user) {
|
|
|
+ this.user = user;
|
|
|
+ }
|
|
|
+
|
|
|
public Long getRecordId() {
|
|
|
return recordId;
|
|
|
}
|
|
@@ -139,6 +147,14 @@ public class UserChannelContext {
|
|
|
this.recordId = recordId;
|
|
|
}
|
|
|
|
|
|
+ public boolean getHandlerSwitch() {
|
|
|
+ return handlerSwitch;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setHandlerSwitch(boolean handlerSwitch) {
|
|
|
+ this.handlerSwitch = handlerSwitch;
|
|
|
+ }
|
|
|
+
|
|
|
public int getOffsetMS() {
|
|
|
return offsetMS;
|
|
|
}
|
|
@@ -193,6 +209,7 @@ public class UserChannelContext {
|
|
|
receivedTime = 0;
|
|
|
delayProcessed = false;
|
|
|
dynamicOffset = 0;
|
|
|
+ handlerSwitch = false;
|
|
|
}
|
|
|
|
|
|
public MusicXmlBasicInfo getMusicXmlBasicInfo(Integer songId){
|
|
@@ -220,7 +237,8 @@ public class UserChannelContext {
|
|
|
final int index = noteIndex;
|
|
|
MusicXmlBasicInfo musicXmlBasicInfo = getMusicXmlBasicInfo(songId);
|
|
|
|
|
|
- if (musicXmlBasicInfo != null && index <= getTotalMusicNoteIndex(null)) {
|
|
|
+ int totalNoteIndex = getTotalMusicNoteIndex(null);
|
|
|
+ if (musicXmlBasicInfo != null && index <= totalNoteIndex) {
|
|
|
return musicXmlBasicInfo.getMusicXmlInfos().stream().filter(t -> t.getMusicalNotesIndex() == index).findFirst().get();
|
|
|
}
|
|
|
|
|
@@ -338,7 +356,7 @@ public class UserChannelContext {
|
|
|
|
|
|
if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
|
|
|
|
|
|
- LOGGER.info("delayPrcessed:{} dynamicOffset:{} Frequency:{} splDb:{} Power:{} amplitude:{} rms:{} time:{}", delayProcessed, dynamicOffset, playFrequency, splDb, power, amplitude, rms, playTime);
|
|
|
+ LOGGER.info("user:{} dynamicOffset:{} Frequency:{} splDb:{} Power:{} amplitude:{} rms:{} time:{}", user, dynamicOffset, playFrequency, splDb, power, amplitude, rms, playTime);
|
|
|
|
|
|
ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
|
|
|
|
|
@@ -655,14 +673,14 @@ public class UserChannelContext {
|
|
|
|
|
|
//根据完整度取部分有效信号
|
|
|
int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
|
|
|
- chunkAnalysisList = chunkAnalysisList.subList(0, elementSize);
|
|
|
+ List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(0, elementSize);
|
|
|
|
|
|
- if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
|
|
|
+ if(chunkList == null || chunkList.size() == 0){
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (musicXmlNote.getFrequency() == -1) {// 休止符
|
|
|
- return chunkAnalysisList.stream().filter(t -> t.getFrequency() > 100).count() <= 1;
|
|
|
+ return chunkList.stream().filter(t -> t.getFrequency() > 100).count() <= 1;
|
|
|
}
|
|
|
|
|
|
ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
|
|
@@ -678,11 +696,11 @@ public class UserChannelContext {
|
|
|
lastChunkAnalysis = new ChunkAnalysis(0, 0, -1, 0, 0, 0);
|
|
|
}
|
|
|
|
|
|
- List<ChunkAnalysis> chunkList = new ArrayList<ChunkAnalysis>(chunkAnalysisList);
|
|
|
+ /*List<ChunkAnalysis> chunkList = new ArrayList<ChunkAnalysis>(chunkAnalysisList);
|
|
|
|
|
|
if(chunkList.size() == 0){
|
|
|
return false;
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
NoteFrequencyRange noteFrequencyRange = null;
|
|
|
ChunkAnalysis chunkAnalysis = null;
|
|
@@ -733,7 +751,9 @@ public class UserChannelContext {
|
|
|
//判断是否与上一个音延续下来的
|
|
|
if(firstChunkAnalysis.getFrequency() > 100 && lastChunkAnalysis.getFrequency() > 100){
|
|
|
tempo = new NoteFrequencyRange(standardFrequecy, firstChunkAnalysis.getFrequency()).equals(new NoteFrequencyRange(standardFrequecy, lastChunkAnalysis.getFrequency())) == false;
|
|
|
- LOGGER.info("节奏错误原因:上一个音延续下来导致的");
|
|
|
+ if(tempo == false){
|
|
|
+ LOGGER.info("节奏错误原因:上一个音延续下来导致的");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -750,11 +770,11 @@ 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);
|
|
|
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());
|
|
|
-
|
|
|
+ */
|
|
|
if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
|
|
|
return false;
|
|
|
}
|
|
@@ -827,6 +847,19 @@ public class UserChannelContext {
|
|
|
if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
|
|
|
return musicXmlNote.getTimeStamp() + dynamicOffset;
|
|
|
}
|
|
|
+
|
|
|
+ //判断是否与上一个音是同一个音符
|
|
|
+ if(musicXmlNote.getMusicalNotesIndex() > 0){
|
|
|
+ MusicXmlNote preMusicXmlNote = getCurrentMusicNote(null, musicXmlNote.getMusicalNotesIndex() - 1);
|
|
|
+ if((int)preMusicXmlNote.getFrequency() == (int)musicXmlNote.getFrequency()){
|
|
|
+ Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getFrequency() <= 100).findFirst();
|
|
|
+ if(optional.isPresent()){
|
|
|
+ return optional.get().getEndTime();
|
|
|
+ }else{
|
|
|
+ return musicXmlNote.getTimeStamp() + dynamicOffset;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
NoteFrequencyRange standardNote = new NoteFrequencyRange(standardFrequecy, musicXmlNote.getFrequency());
|
|
|
|