plectrum

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 268eee3e35fd397b6a590ccf06edede73acdfe7a
parent 7923745301c1d78a22fdc34b6bcc6cb3633c8294
Author: gstraube <gstraube@mailbox.org>
Date:   Mon, 17 Jul 2017 18:47:43 +0200

Calculate average pitch difference

Diffstat:
Mapp/src/main/java/com/github/cythara/MainActivity.java | 25+++++++++++++++++++------
Aapp/src/main/java/com/github/cythara/Sampler.java | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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; + } +}