Browse Source

feat:云教练音准与节奏计算逻辑调整

Joburgess 3 years ago
parent
commit
6892983795

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/config/SoundCompareConfig.java

@@ -35,7 +35,7 @@ public class SoundCompareConfig {
     /**
      * @describe 有效分贝大小
      */
-    public int validDb = -70;
+    public int validDb = -65;
     /**
      * @describe 有效频率
      */

+ 12 - 8
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCompareHelper.java

@@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
 import com.ym.mec.biz.dal.enums.HeardLevelEnum;
 import com.ym.mec.biz.service.impl.SoundCompareHandler;
 import io.swagger.annotations.ApiModelProperty;
+import org.springframework.util.CollectionUtils;
 
 import java.io.File;
 import java.io.RandomAccessFile;
@@ -308,14 +309,17 @@ public class SoundCompareHelper implements PitchDetectionHandler {
             }
         }
 
+        SoundCompareHandler.LOGGER.info("时间:{}, 频率:{}, 分贝:{}", timeStamp, pitch, decibel);
+
         if(decibel < SoundCompareHandler.soundCompareConfig.validDb){
             decibel = SoundCompareHandler.soundCompareConfig.validDb;
             pitch = -1;
+        }else{
+            decibel = 0;
         }
-        if(pitch==-1){
-            decibel = SoundCompareHandler.soundCompareConfig.validDb;
-        }
-//        SoundCompareHandler.LOGGER.info("时间:{}, 频率:{}, 分贝:{}", timeStamp, pitch, decibel);
+//        if(pitch==-1){
+//            decibel = SoundCompareHandler.soundCompareConfig.validDb;
+//        }
 //        recordMeasurePithInfo.add(new MusicPitchDetailDto(timeStamp, pitch, silenceDetector.currentSPL()));
 
         Double avgPitch = currPitchInfos.stream().skip(1).collect(Collectors.averagingDouble(MusicPitchDetailDto::getFrequency));
@@ -332,11 +336,11 @@ public class SoundCompareHelper implements PitchDetectionHandler {
         }
 
         if(obviousChangeNum>1){
-//            SoundCompareHandler.LOGGER.info("----------------------------{}----{}", avgPitch, recordMeasurePitchInfos.size());
-//            SoundCompareHandler.LOGGER.info("----------------------------{}", JSON.toJSONString(currPitchInfos.stream().map(MusicPitchDetailDto::getFrequency).collect(Collectors.toList())));
-//            SoundCompareHandler.LOGGER.info("----------------------------{}", JSON.toJSONString(currTmpPitchInfos.stream().map(MusicPitchDetailDto::getFrequency).collect(Collectors.toList())));
+            SoundCompareHandler.LOGGER.info("----------------------------{}---{}----{}", avgPitch, avgDb, recordMeasurePitchInfos.size());
+            SoundCompareHandler.LOGGER.info("----------------------------{}", JSON.toJSONString(currPitchInfos.stream().map(MusicPitchDetailDto::getFrequency).collect(Collectors.toList())));
+            SoundCompareHandler.LOGGER.info("----------------------------{}", JSON.toJSONString(currTmpPitchInfos.stream().map(MusicPitchDetailDto::getFrequency).collect(Collectors.toList())));
 
-            if(avgPitch>0&&currPitchInfos.size()>2){
+            if(!CollectionUtils.isEmpty(currPitchInfos)&&(avgPitch>0||avgDb>SoundCompareHandler.soundCompareConfig.validDb)){
                 MusicPitchDetailDto measureDetail = new MusicPitchDetailDto(currPitchInfos.get(0).getTimeStamp(), avgPitch.floatValue(), avgDb);
                 measureDetail.setEndTimeStamp(currTmpPitchInfos.get(0).getTimeStamp());
                 measureDetail.setDuration(measureDetail.getEndTimeStamp()-measureDetail.getTimeStamp());

+ 16 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -341,15 +341,25 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
             int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
 
+            MusicPitchDetailDto min = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).stream().min(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
+            MusicPitchDetailDto max = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).stream().max(Comparator.comparing(MusicPitchDetailDto::getTimeStamp)).get();
+
+            int recordNoteSize = (int) userSoundInfoMap.get(phone).getRecordMeasurePitchInfos().stream().filter(e -> e.getTimeStamp() >= min.getTimeStamp() && e.getTimeStamp() < (max.getTimeStamp() + max.getDuration())).count();
+
+            boolean cd = recordNoteSize<=totalCompareNum;
+
             for (int i = 0; i < userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size(); i++) {
                 MusicPitchDetailDto musicXmlInfo = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).get(i);
 
                 int startTimeStamp = musicXmlInfo.getTimeStamp();
                 int endTimeStamp = musicXmlInfo.getTimeStamp() + musicXmlInfo.getDuration();
 
-                int ot5 = (int) (musicXmlInfo.getDuration()*0.1);
+                int ot5 = (int) (musicXmlInfo.getDuration()*0.3);
 
-                List<MusicPitchDetailDto> recordPitchs = userSoundInfoMap.get(phone).getRecordMeasurePitchInfos().stream().filter(m -> Math.abs(startTimeStamp-m.getTimeStamp())<ot5 || (m.getTimeStamp() >= startTimeStamp && m.getTimeStamp() <= endTimeStamp)).collect(Collectors.toList());
+                List<MusicPitchDetailDto> recordPitchs = new ArrayList<>();
+                if(cd){
+                    recordPitchs = userSoundInfoMap.get(phone).getRecordMeasurePitchInfos().stream().filter(m -> Math.abs(startTimeStamp-m.getTimeStamp())<ot5 && m.getTimeStamp() < endTimeStamp).collect(Collectors.toList());
+                }
 
                 boolean cadenceRight = false;
                 boolean intonationRight = false;
@@ -361,10 +371,13 @@ public class SoundCompareHandler implements WebSocketEventHandler {
                 }
                 integrityDuty = scoreMapping(integrityDuty, userSoundInfoMap.get(phone).getHeardLevel().getIntegrityRange(), 1);
                 //节奏
-                if(recordPitchs.size()==1||integrityDuty>userSoundInfoMap.get(phone).getHeardLevel().getCadenceRange()){
+                if(recordPitchs.size()>0&&(Math.abs(recordPitchs.get(0).getTimeStamp()-startTimeStamp)<ot5)&&(recordPitchs.size()<2)){
                     cadenceNum++;
                     cadenceRight = true;
                 }
+                if (musicXmlInfo.getFrequency()<0&&recordPitchs.size()<=0){
+                    cadenceNum++;
+                }
                 //音准、完成度
                 if (cadenceRight){
                     //音准