plectrum

Plectrum: instrument tuner for Android
Log | Files | Refs | README | LICENSE

Sampler.java (2093B)


      1 package com.github.cythara;
      2 
      3 import java.util.ArrayList;
      4 import java.util.HashMap;
      5 import java.util.List;
      6 import java.util.Map;
      7 
      8 class Sampler {
      9 
     10     static PitchDifference calculateAverageDifference(List<PitchDifference> samples) {
     11         Note mostFrequentNote = extractMostFrequentNote(samples);
     12         List<PitchDifference> filteredSamples = filterByNote(samples, mostFrequentNote);
     13 
     14         double deviationSum = 0;
     15         int sameNoteCount = 0;
     16         for (PitchDifference pitchDifference : filteredSamples) {
     17             deviationSum += pitchDifference.deviation;
     18             sameNoteCount++;
     19         }
     20 
     21         if (sameNoteCount > 0) {
     22             double averageDeviation = deviationSum / sameNoteCount;
     23 
     24             return new PitchDifference(mostFrequentNote, averageDeviation);
     25         }
     26 
     27         return null;
     28     }
     29 
     30     static List<PitchDifference> filterByNote(List<PitchDifference> samples, Note note) {
     31         List<PitchDifference> filteredSamples = new ArrayList<>();
     32 
     33         for (PitchDifference sample : samples) {
     34             if (sample.closest == note) {
     35                 filteredSamples.add(sample);
     36             }
     37         }
     38 
     39         return filteredSamples;
     40     }
     41 
     42     static Note extractMostFrequentNote(List<PitchDifference> samples) {
     43         Map<Note, Integer> noteFrequencies = new HashMap<>();
     44 
     45         for (PitchDifference pitchDifference : samples) {
     46             Note closest = pitchDifference.closest;
     47             if (noteFrequencies.containsKey(closest)) {
     48                 Integer count = noteFrequencies.get(closest);
     49                 noteFrequencies.put(closest, count + 1);
     50             } else {
     51                 noteFrequencies.put(closest, 1);
     52             }
     53         }
     54 
     55         Note mostFrequentNote = null;
     56         int mostOccurrences = 0;
     57         for (Note note : noteFrequencies.keySet()) {
     58             Integer occurrences = noteFrequencies.get(note);
     59             if (occurrences > mostOccurrences) {
     60                 mostFrequentNote = note;
     61                 mostOccurrences = occurrences;
     62             }
     63         }
     64 
     65         return mostFrequentNote;
     66     }
     67 }