|
@@ -365,8 +365,6 @@ public class UserChannelContext {
|
|
|
|
|
|
if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
|
|
|
|
|
|
- LOGGER.debug("user:{} startProcessed:{} dynamicOffset:{} Frequency:{} splDb:{} amplitude:{} time:{}", user, startProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
|
|
|
-
|
|
|
ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
|
|
|
|
|
|
if(totalChunkAnalysisList.size() > 0){
|
|
@@ -395,6 +393,8 @@ public class UserChannelContext {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ LOGGER.debug("user:{} startProcessed:{} dynamicOffset:{} Frequency:{} splDb:{} amplitude:{} time:{}", user, startProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
|
|
|
+
|
|
|
if (playTime >= (musicXmlNote.getDuration() + musicXmlNote.getTimeStamp() + dynamicOffset)) {
|
|
|
|
|
|
if (musicXmlNote.getDontEvaluating()) {
|
|
@@ -532,7 +532,7 @@ public class UserChannelContext {
|
|
|
|
|
|
public void evaluateForNote(MusicXmlNote musicXmlNote, NoteAnalysis noteAnalysis) {
|
|
|
|
|
|
- double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
|
|
|
+ double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
|
|
|
|
|
|
double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
|
|
|
double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
|
|
@@ -665,18 +665,22 @@ public class UserChannelContext {
|
|
|
|
|
|
private int computeFrequency(MusicXmlNote musicXmlNote) {
|
|
|
|
|
|
- double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
|
|
|
+ double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
|
|
|
|
|
|
double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
|
|
|
double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
|
|
|
|
|
|
- LOGGER.debug("------Pitch------standard start time:{} floatingRange:{} modified [ {} - {} ]------------", musicXmlNote.getTimeStamp(), floatingRange, startTime, endTime);
|
|
|
+ LOGGER.debug("------Pitch------standard start time:{} floatingRange:{} modified [ {} - {} ]------------", musicXmlNote.getTimeStamp() + dynamicOffset, floatingRange, startTime, endTime);
|
|
|
|
|
|
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();
|
|
|
|
|
|
+ //重新计算延迟
|
|
|
+ dynamicOffset = correctedStartTime - musicXmlNote.getTimeStamp();
|
|
|
+ dynamicOffset = dynamicOffset < 0 ? 0 : dynamicOffset;
|
|
|
+
|
|
|
chunkAnalysisList = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getStartTime()) >= Double.doubleToLongBits(correctedStartTime) && Double.doubleToLongBits(t.getEndTime()) <= Double.doubleToLongBits(correctedEndTime)).collect(Collectors.toList());
|
|
|
|
|
|
//根据完整度取部分有效信号
|
|
@@ -713,7 +717,7 @@ public class UserChannelContext {
|
|
|
*/
|
|
|
private int computeTempoWithFrequency(MusicXmlNote musicXmlNote){
|
|
|
|
|
|
- double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
|
|
|
+ double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
|
|
|
|
|
|
double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
|
|
|
double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
|
|
@@ -861,7 +865,7 @@ public class UserChannelContext {
|
|
|
|
|
|
if (tempo == 0) {
|
|
|
// 判断进入时间点
|
|
|
- if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator())){
|
|
|
+ if(firstPeakIndex * 100 /chunkList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration())){
|
|
|
// 节奏慢
|
|
|
tempo = 2;
|
|
|
LOGGER.debug("节奏错误原因:进入时间点太晚");
|
|
@@ -881,7 +885,7 @@ public class UserChannelContext {
|
|
|
|
|
|
private int computeTempoWithAmplitude2(MusicXmlNote musicXmlNote) {
|
|
|
|
|
|
- double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) / 100;
|
|
|
+ double floatingRange = musicXmlNote.getDuration() * hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) / 100;
|
|
|
|
|
|
double endTime = musicXmlNote.getTimeStamp() + dynamicOffset + floatingRange;
|
|
|
double startTime = musicXmlNote.getTimeStamp() + dynamicOffset - floatingRange;
|
|
@@ -896,7 +900,7 @@ public class UserChannelContext {
|
|
|
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;
|
|
|
+ int elementSize = chunkAnalysisList.size() * hardLevel.getIntegrityRange() / 100;
|
|
|
List<ChunkAnalysis> chunkList = chunkAnalysisList.subList(0, elementSize);
|
|
|
|
|
|
if(chunkList == null || chunkList.size() == 0){
|
|
@@ -967,7 +971,7 @@ public class UserChannelContext {
|
|
|
|
|
|
if (tempo == 0) {
|
|
|
// 判断进入时间点
|
|
|
- if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator()) * 2){
|
|
|
+ if((firstPeakIndex - 1) * 100 /chunkAmplitudeList.size() > hardLevel.getTempoEffectiveRange(musicXmlNote.getDenominator(), musicXmlNote.getDuration()) * 2){
|
|
|
LOGGER.debug("超过范围:{}", (firstPeakIndex - 1) * 100 /chunkAmplitudeList.size());
|
|
|
tempo = 1;
|
|
|
}
|