|
@@ -238,7 +238,6 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
|
|
|
public void handle1(float[] samples, AudioFormat audioFormat){
|
|
|
|
|
|
- //FrequencyDetector frequencyDetector = new FrequencyDetector(samples, audioFormat.getSampleRate(), true);
|
|
|
YINPitchDetector frequencyDetector = new YINPitchDetector(samples.length , audioFormat.getSampleRate());
|
|
|
|
|
|
double playFrequency = frequencyDetector.getFrequency(samples);
|
|
@@ -266,7 +265,7 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
//取出当前处理中的音符信息
|
|
|
NoteAnalysis noteAnalysis = getProcessingNote();
|
|
|
if(noteAnalysis == null || noteAnalysis.getDurationTime() == 0) {
|
|
|
- noteAnalysis = new NoteAnalysis(musicXmlNote.getMusicalNotesIndex(), musicXmlNote.getMeasureIndex(), musicXmlNote.getFrequency(), noteAnalysis.getDurationTime());
|
|
|
+ noteAnalysis = new NoteAnalysis(musicXmlNote.getMusicalNotesIndex(), musicXmlNote.getMeasureIndex(), musicXmlNote.getFrequency(), musicXmlNote.getDuration());
|
|
|
}
|
|
|
|
|
|
evaluatingSectionIndex.set(noteAnalysis.getSectionIndex());
|
|
@@ -280,7 +279,6 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
}
|
|
|
|
|
|
if(noteAnalysis.getChunkFrequencyList().size() > 0){
|
|
|
- //noteAnalysis.setPlayFrequency(noteAnalysis.getChunkFrequencyList().stream().mapToDouble(t -> t).sum()/noteAnalysis.getChunkFrequencyList().size());
|
|
|
noteAnalysis.setPlayFrequency(computeFrequency(noteAnalysis.getChunkFrequencyList(), 10));
|
|
|
}
|
|
|
|
|
@@ -307,13 +305,36 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (tempo) {
|
|
|
+ // 获取上一个音符信息
|
|
|
+ if (doneNoteAnalysisList.size() > 0) {
|
|
|
+ NoteAnalysis lastNoteAnalysis = doneNoteAnalysisList.get(doneNoteAnalysisList.size() - 1);
|
|
|
+ if (lastNoteAnalysis != null) {
|
|
|
+ double pf = lastNoteAnalysis.getPlayFrequency();
|
|
|
+ int continueSize = 0;
|
|
|
+ for (int i = 0; i < chunkAnalysisList.size(); i++) {
|
|
|
+ chunkAnalysis = chunkAnalysisList.get(i);
|
|
|
+ if (chunkAnalysis != null) {
|
|
|
+ if (Math.abs(chunkAnalysis.getFrequency() - pf) > 10) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ continueSize++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(continueSize * 100 / chunkAnalysisList.size() > 40){
|
|
|
+ tempo = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
noteAnalysis.setTempo(tempo);
|
|
|
|
|
|
- long wrongChunkSize = chunkAnalysisList.stream().filter(t -> Math.abs(t.getFrequency() - avgFrequency) > 10).count();
|
|
|
+ /*long wrongChunkSize = chunkAnalysisList.stream().filter(t -> Math.abs(t.getFrequency() - avgFrequency) > 10).count();
|
|
|
if(wrongChunkSize * 100 /chunkAnalysisList.size() > 40){
|
|
|
noteAnalysis.setTempo(false);
|
|
|
}
|
|
|
-
|
|
|
+ */
|
|
|
evaluateForNote(noteAnalysis);
|
|
|
|
|
|
LOGGER.info("当前音符下标[{}] 预计频率:{} 实际频率:{} 持续时间:{}", noteAnalysis.getMusicalNotesIndex(), musicXmlNote.getFrequency(), noteAnalysis.getPlayFrequency(),
|
|
@@ -334,10 +355,10 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
}
|
|
|
|
|
|
NoteAnalysis nextNoteAnalysis = new NoteAnalysis(nextNoteIndex, getMusicSectionIndex(null, nextNoteIndex), nextNoteFrequence, standDuration);
|
|
|
- if (noteAnalysis.isTempo() == true && wrongChunkSize == 0) {
|
|
|
+ /*if (noteAnalysis.isTempo() == true && wrongChunkSize == 0) {
|
|
|
nextNoteAnalysis.setTempo(false);
|
|
|
LOGGER.info("节奏错误:频率没变");
|
|
|
- }
|
|
|
+ }*/
|
|
|
|
|
|
noteAnalysis = nextNoteAnalysis;
|
|
|
|
|
@@ -363,7 +384,7 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
noteAnalysis.setPlayDurationTime(noteAnalysis.getPlayDurationTime() + durationTime);
|
|
|
}
|
|
|
|
|
|
- chunkAnalysisList.add(new ChunkAnalysis(playFrequency, splDb, power));
|
|
|
+ chunkAnalysisList.add(new ChunkAnalysis(receivedTime - durationTime, receivedTime, playFrequency, splDb, power));
|
|
|
|
|
|
}
|
|
|
|
|
@@ -612,18 +633,18 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
// 排序
|
|
|
chunkFrequencyList = chunkFrequencyList.stream().sorted().collect(Collectors.toList());
|
|
|
|
|
|
- double tempFrequency = 0, totalFrequency = 0;
|
|
|
+ double tempFrequency = chunkFrequencyList.get(0), totalFrequency = chunkFrequencyList.get(0);
|
|
|
|
|
|
int maxChunkSize = 0;
|
|
|
- double frequency = 0;
|
|
|
+ double frequency = chunkFrequencyList.get(0);
|
|
|
int chunkSize = 1;
|
|
|
double avgFrequency = chunkFrequencyList.get(0);
|
|
|
for (int i = 1; i < chunkFrequencyList.size(); i++) {
|
|
|
tempFrequency = chunkFrequencyList.get(i);
|
|
|
|
|
|
- totalFrequency += tempFrequency;
|
|
|
-
|
|
|
if (Math.abs(avgFrequency - tempFrequency) > offsetRange) {
|
|
|
+
|
|
|
+ avgFrequency = totalFrequency / chunkSize;
|
|
|
|
|
|
if (maxChunkSize < chunkSize) {
|
|
|
maxChunkSize = chunkSize;
|
|
@@ -632,13 +653,14 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
|
|
|
chunkSize = 1;
|
|
|
avgFrequency = tempFrequency;
|
|
|
+ totalFrequency = tempFrequency;
|
|
|
} else {
|
|
|
chunkSize++;
|
|
|
- avgFrequency = (tempFrequency + avgFrequency) / 2;
|
|
|
+ totalFrequency += tempFrequency;
|
|
|
}
|
|
|
|
|
|
if(i == chunkFrequencyList.size() - 1){
|
|
|
- if (maxChunkSize < chunkSize) {
|
|
|
+ if (maxChunkSize <= chunkSize) {
|
|
|
maxChunkSize = chunkSize;
|
|
|
frequency = avgFrequency;
|
|
|
}
|
|
@@ -646,7 +668,7 @@ public class UserChannelContext implements PitchDetectionHandler {
|
|
|
}
|
|
|
|
|
|
if (maxChunkSize * 100 / chunkFrequencyList.size() < 40) {
|
|
|
- return totalFrequency / chunkFrequencyList.size();
|
|
|
+ return chunkFrequencyList.stream().collect(Collectors.summingDouble(t -> t)) / chunkFrequencyList.size();
|
|
|
}
|
|
|
|
|
|
return frequency;
|