commit b56f8337ef72c9313a2632f9c6626e18ec2d950d
parent 0ae6104e50f0b3cdc09be46ed3e3835fe3a43b10
Author: gstraube <gstraube@mailbox.org>
Date: Sun, 11 Feb 2018 11:11:18 +0100
Enable selection of reference pitch (issue #14)
Diffstat:
7 files changed, 107 insertions(+), 10 deletions(-)
diff --git a/app/src/main/java/com/github/cythara/ListenerFragment.java b/app/src/main/java/com/github/cythara/ListenerFragment.java
@@ -18,6 +18,7 @@ import be.tarsos.dsp.pitch.PitchProcessor;
import static be.tarsos.dsp.io.android.AudioDispatcherFactory.fromDefaultMicrophone;
import static be.tarsos.dsp.pitch.PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
+import static com.github.cythara.PitchComparator.*;
public class ListenerFragment extends Fragment {
@@ -114,8 +115,8 @@ public class ListenerFragment extends Fragment {
float pitch = pitchDetectionResult.getPitch();
if (pitch != -1) {
- PitchDifference pitchDifference = PitchComparator.retrieveNote(pitch);
-
+ float adjustedPitch = MainActivity.adjustPitch(pitch);
+ PitchDifference pitchDifference = retrieveNote(adjustedPitch);
pitchDifferences.add(pitchDifference);
diff --git a/app/src/main/java/com/github/cythara/MainActivity.java b/app/src/main/java/com/github/cythara/MainActivity.java
@@ -20,6 +20,7 @@ import android.view.ContextThemeWrapper;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
+import android.widget.NumberPicker;
import com.jaredrummler.materialspinner.MaterialSpinner;
import com.jaredrummler.materialspinner.MaterialSpinnerAdapter;
@@ -29,7 +30,7 @@ import java.util.Arrays;
import static com.github.cythara.TuningMapper.getTuningFromPosition;
public class MainActivity extends AppCompatActivity implements ListenerFragment.TaskCallbacks,
- MaterialSpinner.OnItemSelectedListener {
+ MaterialSpinner.OnItemSelectedListener, NumberPicker.OnValueChangeListener {
public static final int RECORD_AUDIO_PERMISSION = 0;
public static final String PREFS_FILE = "prefs_file";
@@ -37,8 +38,10 @@ public class MainActivity extends AppCompatActivity implements ListenerFragment.
public static final String CURRENT_TUNING = "current_tuning";
private static final String TAG_LISTENER_FRAGMENT = "listener_fragment";
private static final String USE_DARK_MODE = "use_dark_mode";
+ private static final String REFERENCE_PITCH = "reference_pitch";
private static int tuningPosition = 0;
private static boolean isDarkModeEnabled;
+ private static PitchAdjuster pitchAdjuster;
public static Tuning getCurrentTuning() {
return getTuningFromPosition(tuningPosition);
@@ -48,6 +51,10 @@ public class MainActivity extends AppCompatActivity implements ListenerFragment.
return isDarkModeEnabled;
}
+ public static float adjustPitch(float pitch) {
+ return pitchAdjuster.adjustPitch(pitch);
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
int permissionCheck = ContextCompat.checkSelfPermission(this,
@@ -66,6 +73,7 @@ public class MainActivity extends AppCompatActivity implements ListenerFragment.
setContentView(R.layout.activity_main);
setTuning();
+ setPitchAdjuster();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@@ -127,6 +135,24 @@ public class MainActivity extends AppCompatActivity implements ListenerFragment.
editor.apply();
recreate();
+
+ break;
+ }
+ case R.id.set_reference_pitch: {
+ final SharedPreferences preferences = getSharedPreferences(PREFS_FILE,
+ MODE_PRIVATE);
+ int referencePitch = preferences.getInt(REFERENCE_PITCH, 440);
+
+ NumberPickerDialog dialog = new NumberPickerDialog();
+
+ Bundle bundle = new Bundle();
+ bundle.putInt("current_value", referencePitch);
+ dialog.setArguments(bundle);
+
+ dialog.setValueChangeListener(this);
+ dialog.show(getFragmentManager(), "number_picker");
+
+ break;
}
}
@@ -187,6 +213,18 @@ public class MainActivity extends AppCompatActivity implements ListenerFragment.
tuningPosition = position;
}
+ @Override
+ public void onValueChange(NumberPicker picker, int oldValue, int newValue) {
+ final SharedPreferences preferences = getSharedPreferences(PREFS_FILE,
+ MODE_PRIVATE);
+
+ SharedPreferences.Editor editor = preferences.edit();
+ editor.putInt(REFERENCE_PITCH, newValue);
+ editor.apply();
+
+ setPitchAdjuster();
+ }
+
private void startRecording() {
FragmentManager fragmentManager = getFragmentManager();
ListenerFragment listenerFragment = (ListenerFragment)
@@ -236,4 +274,12 @@ public class MainActivity extends AppCompatActivity implements ListenerFragment.
AppCompatDelegate.setDefaultNightMode(mode);
}
+
+ private void setPitchAdjuster() {
+ final SharedPreferences preferences = getSharedPreferences(PREFS_FILE,
+ MODE_PRIVATE);
+ int referencePitch = preferences.getInt(REFERENCE_PITCH, 440);
+
+ pitchAdjuster = new PitchAdjuster(referencePitch);
+ }
}
diff --git a/app/src/main/java/com/github/cythara/NumberPickerDialog.java b/app/src/main/java/com/github/cythara/NumberPickerDialog.java
@@ -0,0 +1,50 @@
+package com.github.cythara;
+
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.widget.NumberPicker;
+
+public class NumberPickerDialog extends DialogFragment {
+
+ private NumberPicker.OnValueChangeListener valueChangeListener;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final NumberPicker numberPicker = new NumberPicker(getActivity());
+
+ Bundle arguments = getArguments();
+ int currentValue = arguments.getInt("current_value", 440);
+
+ numberPicker.setMinValue(300);
+ numberPicker.setMaxValue(500);
+ numberPicker.setValue(currentValue);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setTitle("Set reference pitch");
+ builder.setMessage("Choose a frequency:");
+
+ builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ valueChangeListener.onValueChange(numberPicker,
+ numberPicker.getValue(), numberPicker.getValue());
+ }
+ });
+
+ builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) { }
+ });
+
+ builder.setView(numberPicker);
+ return builder.create();
+ }
+
+ public void setValueChangeListener(NumberPicker.OnValueChangeListener valueChangeListener) {
+ this.valueChangeListener = valueChangeListener;
+ }
+}
diff --git a/app/src/main/res/layout/set_reference_pitch_dialog.xml b/app/src/main/res/layout/set_reference_pitch_dialog.xml
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
-
-</LinearLayout>
-\ No newline at end of file
diff --git a/app/src/main/res/menu/toolbar_menu.xml b/app/src/main/res/menu/toolbar_menu.xml
@@ -8,6 +8,11 @@
app:showAsAction="never" />
<item
+ android:id="@+id/set_reference_pitch"
+ android:title="@string/set_reference_pitch"
+ app:showAsAction="never" />
+
+ <item
android:id="@+id/show_privacy_policy"
android:title="@string/privacy_policy"
app:showAsAction="never" />
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
@@ -21,4 +21,5 @@
<item name="sol">Solfège</item>
</string-array>
<string name="toggle_dark_mode">Alternar modo escuro</string>
+ <string name="set_reference_pitch">Definir o passo de referência</string>
</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
@@ -5,6 +5,7 @@
<string name="toggle_dark_mode">Toggle dark mode</string>
<string name="choose_notation">Choose notation</string>
<string name="permission_required">Permission required</string>
+ <string name="set_reference_pitch">Set reference pitch</string>
<string-array name="tunings">
<item>Guitar (standard)</item>
<item>Guitar (Drop D)</item>