commit 268eee3e35fd397b6a590ccf06edede73acdfe7a
parent 7923745301c1d78a22fdc34b6bcc6cb3633c8294
Author: gstraube <gstraube@mailbox.org>
Date: Mon, 17 Jul 2017 18:47:43 +0200
Calculate average pitch difference
Diffstat:
2 files changed, 77 insertions(+), 6 deletions(-)
diff --git a/app/src/main/java/com/github/cythara/MainActivity.java b/app/src/main/java/com/github/cythara/MainActivity.java
@@ -7,6 +7,8 @@ import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Locale;
import be.tarsos.dsp.AudioDispatcher;
@@ -25,6 +27,8 @@ public class MainActivity extends AppCompatActivity {
private static final int BUFFER_SIZE = FastYin.DEFAULT_BUFFER_SIZE;
private static final int OVERLAP = FastYin.DEFAULT_OVERLAP;
private static final double MAX_DEVIATION = 50;
+ private static final int MIN_ITEMS_COUNT = 5;
+ private static List<PitchDifference> pitchDifferences = new ArrayList<>();
final Handler updateHandler = new UpdateHandler(this);
final PitchListener pitchListener = new PitchListener(this);
@@ -66,14 +70,23 @@ public class MainActivity extends AppCompatActivity {
pitchDifference.closest.name(),
pitchDifference.deviation, pitch);
- Message message = new Message();
- Bundle bundle = new Bundle();
- bundle.putParcelable("pitchDiff", pitchDifference);
- message.setData(bundle);
+ pitchDifferences.add(pitchDifference);
- activity.updateHandler.sendMessage(message);
+ if (pitchDifferences.size() >= MIN_ITEMS_COUNT) {
+ PitchDifference average =
+ Sampler.calculateAverageDifference(pitchDifferences);
- Log.d("com.github.cythara", msg);
+ Message message = new Message();
+ Bundle bundle = new Bundle();
+ bundle.putParcelable("pitchDiff", average);
+ message.setData(bundle);
+
+ activity.updateHandler.sendMessage(message);
+
+ pitchDifferences.clear();
+
+ Log.d("com.github.cythara", msg);
+ }
}
}
}
diff --git a/app/src/main/java/com/github/cythara/Sampler.java b/app/src/main/java/com/github/cythara/Sampler.java
@@ -0,0 +1,58 @@
+package com.github.cythara;
+
+import android.support.annotation.Nullable;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class Sampler {
+
+ static PitchDifference calculateAverageDifference(List<PitchDifference> samples) {
+ Note mostFrequentNote = extractMostFrequentNote(samples);
+
+ double deviationSum = 0;
+ int sameNoteCount = 0;
+ for (PitchDifference pitchDifference : samples) {
+ if (pitchDifference.closest == mostFrequentNote) {
+ deviationSum += pitchDifference.deviation;
+ sameNoteCount++;
+ }
+ }
+
+ if (sameNoteCount > 0) {
+ double averageDeviation = deviationSum / sameNoteCount;
+
+ return new PitchDifference(mostFrequentNote, averageDeviation);
+ }
+
+ return null;
+ }
+
+ @Nullable
+ private static Note extractMostFrequentNote(List<PitchDifference> samples) {
+ Map<Note, Integer> noteFrequencies = new HashMap<>();
+
+ for (PitchDifference pitchDifference : samples) {
+ Note closest = pitchDifference.closest;
+ if (noteFrequencies.containsKey(closest)) {
+ Integer count = noteFrequencies.get(closest);
+ noteFrequencies.put(closest, count + 1);
+ } else {
+ noteFrequencies.put(closest, 1);
+ }
+ }
+
+ Note mostFrequentNote = null;
+ int mostOccurrences = 0;
+ for (Note note : noteFrequencies.keySet()) {
+ Integer occurrences = noteFrequencies.get(note);
+ if (occurrences > mostOccurrences) {
+ mostFrequentNote = note;
+ mostOccurrences = occurrences;
+ }
+ }
+
+ return mostFrequentNote;
+ }
+}