startingPitchEntries();
178 | }
179 | }
180 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/fragments/WelcomeFragment.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.fragments;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import androidx.fragment.app.Fragment;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 |
10 | import de.lilithwittmann.voicepitchanalyzer.R;
11 |
12 |
13 | /**
14 | * A simple {@link Fragment} subclass.
15 | * Activities that contain this fragment must implement the
16 | * {@link WelcomeFragment.OnFragmentInteractionListener} interface
17 | * to handle interaction events.
18 | */
19 | public class WelcomeFragment extends Fragment
20 | {
21 |
22 | // private OnFragmentInteractionListener mListener;
23 |
24 | public WelcomeFragment()
25 | {
26 | // Required empty public constructor
27 | }
28 |
29 |
30 | @Override
31 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
32 | Bundle savedInstanceState)
33 | {
34 | // Inflate the layout for this fragment
35 | return inflater.inflate(R.layout.fragment_welcome, container, false);
36 | }
37 |
38 | // TODO: Rename method, update argument and hook method into UI event
39 | // public void onButtonPressed(Uri uri)
40 | // {
41 | // if (mListener != null)
42 | // {
43 | // mListener.onFragmentInteraction(uri);
44 | // }
45 | // }
46 |
47 | @Override
48 | public void onAttach(Activity activity)
49 | {
50 | super.onAttach(activity);
51 | // try
52 | // {
53 | // mListener = (OnFragmentInteractionListener) activity;
54 | // } catch (ClassCastException e)
55 | // {
56 | // throw new ClassCastException(activity.toString()
57 | // + " must implement OnFragmentInteractionListener");
58 | // }
59 | }
60 |
61 | @Override
62 | public void onDetach()
63 | {
64 | super.onDetach();
65 | // mListener = null;
66 | }
67 |
68 | /**
69 | * This interface must be implemented by activities that contain this
70 | * fragment to allow an interaction in this fragment to be communicated
71 | * to the activity and potentially other fragments contained in that
72 | * activity.
73 | *
74 | * See the Android Training lesson Communicating with Other Fragments for more information.
77 | */
78 | // public interface OnFragmentInteractionListener
79 | // {
80 | // // TODO: Update argument type and name
81 | // public void onFragmentInteraction(Uri uri);
82 | // }
83 |
84 | }
85 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/listeners/RecyclerItemClickListener.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.listeners;
2 |
3 | import android.content.Context;
4 | import androidx.recyclerview.widget.RecyclerView;
5 | import android.view.GestureDetector;
6 | import android.view.MotionEvent;
7 | import android.view.View;
8 |
9 | /**
10 | * Created by Yuri on 22-09-15
11 | */
12 | public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener
13 | {
14 | private OnItemClickListener mListener;
15 |
16 | public interface OnItemClickListener
17 | {
18 | public void onItemClick(View view, int position);
19 | }
20 |
21 | GestureDetector mGestureDetector;
22 |
23 | public RecyclerItemClickListener(Context context, OnItemClickListener listener)
24 | {
25 | mListener = listener;
26 | mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener()
27 | {
28 | @Override
29 | public boolean onSingleTapUp(MotionEvent e)
30 | {
31 | return true;
32 | }
33 | });
34 | }
35 |
36 | @Override
37 | public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e)
38 | {
39 | View childView = view.findChildViewUnder(e.getX(), e.getY());
40 | if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e))
41 | {
42 | mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
43 | }
44 | return false;
45 | }
46 |
47 | @Override
48 | public void onTouchEvent(RecyclerView view, MotionEvent motionEvent)
49 | {
50 | }
51 |
52 | @Override
53 | public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept)
54 | {
55 |
56 | }
57 | }
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/models/PitchRange.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.models;
2 |
3 | import android.os.Parcel;
4 | import android.os.Parcelable;
5 |
6 | import com.github.mikephil.charting.data.Entry;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | /**
12 | * Created by Yuri on 04/07/15.
13 | */
14 | public class PitchRange implements Parcelable {
15 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
16 | public PitchRange createFromParcel(Parcel in) {
17 | return new PitchRange(in);
18 | }
19 |
20 | public PitchRange[] newArray(int size) {
21 | return new PitchRange[size];
22 | }
23 | };
24 | private double avg;
25 | private double min;
26 | private double max;
27 | private List pitches = new ArrayList();
28 |
29 | public PitchRange() {
30 | }
31 |
32 | protected PitchRange(Parcel src) {
33 | this.setAvg(src.readDouble());
34 | this.setMin(src.readDouble());
35 | this.setMax(src.readDouble());
36 | this.setPitches(src.readArrayList(Double.class.getClassLoader()));
37 | }
38 |
39 | public double getMin() {
40 | return min;
41 | }
42 |
43 | public void setMin(double min) {
44 | this.min = min;
45 | }
46 |
47 | public double getMax() {
48 | return max;
49 | }
50 |
51 | public void setMax(double max) {
52 | this.max = max;
53 | }
54 |
55 | public double getAvg() {
56 | return avg;
57 | }
58 |
59 | public void setAvg(double avg) {
60 | this.avg = avg;
61 | }
62 |
63 | public List getPitches() {
64 | return pitches;
65 | }
66 |
67 | public void setPitches(List pitches) {
68 | this.pitches = pitches;
69 | }
70 |
71 | public List getGraphEntries() {
72 | List list = new ArrayList();
73 |
74 | for (int i = 0; i < this.getPitches().size(); i++) {
75 | list.add(new Entry(i, this.getPitches().get(i).floatValue()));
76 | }
77 |
78 | return list;
79 | }
80 |
81 | @Override
82 | public int describeContents() {
83 | return 0;
84 | }
85 |
86 | @Override
87 | public void writeToParcel(Parcel dest, int flags) {
88 | dest.writeDouble(this.getAvg());
89 | dest.writeDouble(this.getMin());
90 | dest.writeDouble(this.getMax());
91 | dest.writeList(this.getPitches());
92 | }
93 | }
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/models/Recording.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.models;
2 |
3 | import android.content.Context;
4 | import android.os.Parcel;
5 | import android.os.Parcelable;
6 | import android.text.format.DateFormat;
7 |
8 | import com.github.mikephil.charting.data.Entry;
9 |
10 | import java.util.Date;
11 |
12 | /**
13 | * Created by Yuri on 04/07/15.
14 | */
15 | public class Recording implements Parcelable {
16 | public static final String KEY = Recording.class.getSimpleName();
17 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
18 | public Recording createFromParcel(Parcel in) {
19 | return new Recording(in);
20 | }
21 |
22 | public Recording[] newArray(int size) {
23 | return new Recording[size];
24 | }
25 | };
26 | private String recording;
27 | private long recordingFileSize;
28 | private long id = -1;
29 | private Date date;
30 | private PitchRange range;
31 | private String name;
32 |
33 | public Recording(Date date) {
34 | setDate(date);
35 | }
36 |
37 | public Recording() {
38 |
39 | }
40 |
41 | protected Recording(Parcel src) {
42 | this.setDate(new Date(src.readLong()));
43 | this.setName(src.readString());
44 | this.setRange((PitchRange) src.readParcelable(PitchRange.class.getClassLoader()));
45 | }
46 |
47 | /**
48 | * formats recording's date & time to display anywhere in app
49 | *
50 | * @param context calling activity's context [to retrieve locale]
51 | * @return recording's date/time formatted according to device's locale
52 | */
53 | public String getDisplayDate(Context context) {
54 | return String.format("%s – %s", DateFormat.getDateFormat(context).format(this.getDate()), DateFormat.getTimeFormat(context).format(this.getDate()));
55 | }
56 |
57 | public long getId() {
58 | return id;
59 | }
60 |
61 | public void setId(long id) {
62 | this.id = id;
63 | }
64 |
65 | public Date getDate() {
66 | return date;
67 | }
68 |
69 | public void setDate(Date date) {
70 | this.date = date;
71 | }
72 |
73 | public PitchRange getRange() {
74 | return range;
75 | }
76 |
77 | public void setRange(PitchRange range) {
78 | this.range = range;
79 | }
80 |
81 | public String getName() {
82 | return name;
83 | }
84 |
85 | public void setName(String name) {
86 | this.name = name;
87 | }
88 |
89 | public String getRecording() {
90 | return recording;
91 | }
92 |
93 | public void setRecording(String recording) {
94 | this.recording = recording;
95 | }
96 |
97 | public long getRecordingFileSize() {
98 | return recordingFileSize;
99 | }
100 |
101 | public void setRecordingFileSize(long recordingFileSize) {
102 | this.recordingFileSize = recordingFileSize;
103 | }
104 |
105 | public Entry getGraphEntry()
106 | {
107 | return new Entry((float) this.getDate().getTime(), (float) this.getRange().getAvg());
108 | }
109 |
110 | @Override
111 | public int describeContents() {
112 | return 0;
113 | }
114 |
115 | @Override
116 | public void writeToParcel(Parcel dest, int flags) {
117 | dest.writeLong(this.getDate().getTime());
118 | dest.writeString(this.getName());
119 | dest.writeParcelable(this.range, flags);
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/models/RecordingList.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.models;
2 |
3 | import android.content.Context;
4 | import android.util.Log;
5 |
6 | import com.github.mikephil.charting.data.Entry;
7 |
8 | import org.joda.time.DateTime;
9 | import org.joda.time.Duration;
10 |
11 | import java.text.DateFormat;
12 | import java.util.ArrayList;
13 | import java.util.Date;
14 | import java.util.Hashtable;
15 | import java.util.List;
16 | import java.util.TreeMap;
17 |
18 | import de.lilithwittmann.voicepitchanalyzer.models.database.RecordingDB;
19 |
20 | /**
21 | * Created by Yuri on 30.01.16.
22 | */
23 | public class RecordingList
24 | {
25 | private Hashtable recordings = new Hashtable<>();
26 | private double avg = -1;
27 | private double min = -1;
28 | private double max = -1;
29 | // initialise to 'now' so that checking works correctly in constructor
30 | private long beginning = new Date().getTime();
31 | private long end = 0;
32 |
33 | public RecordingList(Context context)
34 | {
35 | List list = new RecordingDB(context).getRecordings();
36 |
37 | for (Recording recording : list)
38 | {
39 | // set beginning & end correctly
40 | if (recording.getDate().getTime() < this.getBeginning())
41 | {
42 | this.setBeginning(recording.getDate().getTime());
43 | }
44 |
45 | if (recording.getDate().getTime() > this.getEnd())
46 | {
47 | this.setEnd(recording.getDate().getTime());
48 | }
49 |
50 | this.getRecordings().put(new DateTime(recording.getDate()), recording);
51 | }
52 | }
53 |
54 | /***
55 | * get the graph entries for progress fragment
56 | * only one entry per day
57 | * if there are more than one recordings per day,
58 | * only use the first entry of that day
59 | * for future: calculate average as this day's value
60 | *
61 | * @return
62 | */
63 | public List getGraphEntries()
64 | {
65 | TreeMap result = new TreeMap<>();
66 |
67 | Log.i("test", String.format("duration: %s", (int) new Duration(new DateTime(this.getBeginning()), new DateTime(this.getEnd())).getStandardDays()));
68 |
69 | for (Hashtable.Entry record : this.getRecordings().entrySet())
70 | {
71 | // reset time of day so .getDuration() will always calculate a duration of one day between two different dates
72 | DateTime recordTime = new DateTime(record.getKey().getYear(), record.getKey().getMonthOfYear(), record.getKey().getDayOfMonth(), 0, 0, 0, 0);
73 |
74 | // list index as duration in days since first recording
75 | int index = (int) new Duration(this.getBeginningAsDate(), recordTime).getStandardDays();
76 |
77 | // check if there are multiple entries for this date
78 | // and only add date if recording contains any pitch data
79 | if (!result.containsKey(index) && record.getValue().getRange().getAvg() > 0)
80 | {
81 | Log.i("RecordingList", String.format("beginning: %s", new DateTime(this.getBeginning()).toDateTime()));
82 | result.put(index, new Entry(index, (float) record.getValue().getRange().getAvg()));
83 | }
84 | }
85 |
86 | for (TreeMap.Entry entry : result.entrySet())
87 | {
88 | Log.i("result", String.format("%s: %s", entry.getKey(), entry.getValue().getY()));
89 | }
90 |
91 | return new ArrayList<>(result.values());
92 | }
93 |
94 | public Hashtable getRecordings()
95 | {
96 | return this.recordings;
97 | }
98 |
99 | public void setRecordings(Hashtable recordings)
100 | {
101 | this.recordings = recordings;
102 | }
103 |
104 | public double getAvg()
105 | {
106 | return avg;
107 | }
108 |
109 | public void setAvg(double avg)
110 | {
111 | this.avg = avg;
112 | }
113 |
114 | public double getMin()
115 | {
116 | if (this.min < 0)
117 | {
118 | double min = 10000;
119 |
120 | for (Hashtable.Entry recording : this.getRecordings().entrySet())
121 | {
122 | double current = recording.getValue().getRange().getAvg();
123 |
124 | if (min > current)
125 | {
126 | min = current;
127 | }
128 | }
129 |
130 | this.setMin(min);
131 | }
132 |
133 | return this.min;
134 | }
135 |
136 | public void setMin(double min)
137 | {
138 | this.min = min;
139 | }
140 |
141 | public double getMax()
142 | {
143 | if (this.max < 0)
144 | {
145 | double max = 0;
146 |
147 | for (Hashtable.Entry recording : this.getRecordings().entrySet())
148 | {
149 | double current = recording.getValue().getRange().getAvg();
150 |
151 | if (max < current)
152 | {
153 | max = current;
154 | }
155 | }
156 |
157 | this.setMax(max);
158 | }
159 |
160 | return this.max;
161 | }
162 |
163 | public void setMax(double max)
164 | {
165 | this.max = max;
166 | }
167 |
168 | public long getBeginning()
169 | {
170 | return this.beginning;
171 | }
172 |
173 | /**
174 | * get beginning as date time with time set to 00:00:00:00
175 | *
176 | * @return
177 | */
178 | public DateTime getBeginningAsDate()
179 | {
180 | DateTime beginning = new DateTime(this.beginning);
181 | return new DateTime(beginning.getYear(), beginning.getMonthOfYear(), beginning.getDayOfMonth(), 0, 0, 0, 0);
182 | }
183 |
184 | public long getEnd()
185 | {
186 | return this.end;
187 | }
188 |
189 | private void setEnd(long end)
190 | {
191 | this.end = end;
192 | }
193 |
194 | public void setBeginning(long beginning)
195 | {
196 | this.beginning = beginning;
197 | }
198 | }
199 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/models/Texts.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.models;
2 |
3 |
4 | import com.google.gson.JsonArray;
5 | import com.google.gson.JsonElement;
6 | import com.google.gson.JsonObject;
7 | import com.google.gson.JsonParser;
8 |
9 | import java.io.BufferedReader;
10 | import java.io.IOException;
11 | import java.io.InputStream;
12 | import java.io.InputStreamReader;
13 | import java.io.Reader;
14 | import java.io.StringWriter;
15 | import java.io.UnsupportedEncodingException;
16 | import java.io.Writer;
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * Created by lilith on 7/5/15.
22 | */
23 | public class Texts {
24 |
25 | public Texts() {
26 |
27 | }
28 |
29 | public String getText(String lang, Integer id) {
30 | JsonElement jelement = new JsonParser().parse(getJsonData(lang));
31 | JsonObject jobject = jelement.getAsJsonObject();
32 | JsonObject langs = jobject.getAsJsonObject("texts");
33 | JsonArray texts = langs.getAsJsonArray(lang);
34 | return texts.get(id - 1).getAsString();
35 | }
36 |
37 | public Integer countTexts(String lang) {
38 | JsonElement jelement = new JsonParser().parse(getJsonData(lang));
39 | JsonObject jobject = jelement.getAsJsonObject();
40 | JsonObject langs = jobject.getAsJsonObject("texts");
41 | JsonArray texts = langs.getAsJsonArray(lang);
42 | return texts.getAsJsonArray().size();
43 | }
44 |
45 | private String jsonFolder = "res/raw/";
46 | private String jsonData = null;
47 |
48 | private List supportedLanguages = new ArrayList() {{add("de"); add("en"); add("it"); add("pt");}};
49 |
50 | String getJsonData(String country) {
51 | if (this.jsonData != null) {
52 | return jsonData;
53 | } else {
54 | try {
55 | this.jsonData = this.readJsonNFile(this.jsonFolder+country+".json");
56 | } catch (IOException e) {
57 | e.printStackTrace();
58 | }
59 | return this.jsonData;
60 |
61 | }
62 | }
63 |
64 | private String readJsonNFile(String jsonFile) throws IOException {
65 | InputStream is = this.getClass().getClassLoader().getResourceAsStream(jsonFile);
66 | Writer writer = new StringWriter();
67 | char[] buffer = new char[1024];
68 | try {
69 | Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
70 | int n;
71 | while ((n = reader.read(buffer)) != -1) {
72 | writer.write(buffer, 0, n);
73 | }
74 | } catch (UnsupportedEncodingException e) {
75 | e.printStackTrace();
76 | } catch (IOException e) {
77 | e.printStackTrace();
78 | } finally {
79 | is.close();
80 | }
81 |
82 | String jsonString = writer.toString();
83 |
84 | return jsonString;
85 | }
86 |
87 | public boolean supportsLocale(String language) {
88 | if(this.supportedLanguages.contains(language))
89 | {
90 | return Boolean.TRUE;
91 | }
92 | return Boolean.FALSE;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/CountingWriterProcessor.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import java.io.RandomAccessFile;
4 | import java.util.concurrent.atomic.AtomicLong;
5 |
6 | import be.tarsos.dsp.AudioEvent;
7 | import be.tarsos.dsp.io.TarsosDSPAudioFormat;
8 | import be.tarsos.dsp.writer.WriterProcessor;
9 |
10 | public class CountingWriterProcessor extends WriterProcessor {
11 | private static final long HEADER_LENGTH = 44;
12 |
13 | private final TarsosDSPAudioFormat format;
14 | private final AtomicLong fileSize = new AtomicLong(HEADER_LENGTH);
15 |
16 | public CountingWriterProcessor(TarsosDSPAudioFormat format, RandomAccessFile file) {
17 | super(format, file);
18 | this.format = format;
19 | }
20 |
21 | @Override
22 | public boolean process(AudioEvent audioEvent) {
23 | fileSize.getAndAdd(audioEvent.getBufferSize() * format.getFrameSize());
24 | return super.process(audioEvent);
25 | }
26 |
27 | public long getFileSize() {
28 | return fileSize.get();
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/DateValueFormatter.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import com.github.mikephil.charting.components.AxisBase;
4 | import com.github.mikephil.charting.formatter.ValueFormatter;
5 |
6 | import org.joda.time.DateTime;
7 |
8 | import java.text.DateFormat;
9 | import java.util.HashMap;
10 |
11 | public class DateValueFormatter extends ValueFormatter
12 | {
13 | private final DateTime beginningDate;
14 | private final HashMap formattedCache = new HashMap<>();
15 |
16 | public DateValueFormatter(DateTime beginningDate)
17 | {
18 | this.beginningDate = beginningDate;
19 | }
20 |
21 | @Override
22 | public String getFormattedValue(float value)
23 | {
24 | int days = (int) value;
25 |
26 | String cachedFormatted = this.formattedCache.get(days);
27 | if (cachedFormatted != null)
28 | {
29 | return cachedFormatted;
30 | }
31 |
32 | String formatted = DateFormat.getDateInstance().format(beginningDate.plusDays(days).toDate());
33 | this.formattedCache.put(days, formatted);
34 | return formatted;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/ExecutorUtils.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import java.util.concurrent.ExecutorService;
4 | import java.util.concurrent.Executors;
5 |
6 | public class ExecutorUtils {
7 | private static final ExecutorService BOUNDED = Executors.newFixedThreadPool(
8 | Runtime.getRuntime().availableProcessors(),
9 | r -> new Thread(r, "bounded-executor")
10 | );
11 |
12 | public static ExecutorService getBoundedExecutor() {
13 | return BOUNDED;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/GraphLayout.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import android.content.Context;
4 |
5 | import com.github.mikephil.charting.charts.BarLineChartBase;
6 | import com.github.mikephil.charting.components.Description;
7 | import com.github.mikephil.charting.components.Legend;
8 | import com.github.mikephil.charting.data.BarDataSet;
9 | import com.github.mikephil.charting.data.BarEntry;
10 |
11 | import java.util.ArrayList;
12 | import java.util.List;
13 |
14 | import de.lilithwittmann.voicepitchanalyzer.R;
15 |
16 | /**
17 | * Created by Yuri on 30.01.16 n. Chr.
18 | */
19 | public class GraphLayout
20 | {
21 | /**
22 | * style a basic chart in app style
23 | *
24 | * @param chart chart object to be styled
25 | * @return styled chart object
26 | */
27 | public static BarLineChartBase FormatChart(BarLineChartBase chart)
28 | {
29 | chart.getAxisLeft().resetAxisMinimum();
30 | chart.getAxisRight().resetAxisMinimum();
31 |
32 | // hide grid lines & borders
33 | chart.getAxisLeft().setDrawGridLines(false);
34 | chart.getAxisRight().setDrawGridLines(false);
35 | chart.getXAxis().setDrawGridLines(false);
36 | chart.getAxisLeft().setValueFormatter(new GraphValueFormatter());
37 | chart.getAxisRight().setValueFormatter(new GraphValueFormatter());
38 | chart.setDrawBorders(false);
39 |
40 | Description emptyDescription = new Description();
41 | emptyDescription.setText("");
42 | chart.setDescription(emptyDescription);
43 |
44 | // disable all interactions except highlighting selection
45 | chart.setTouchEnabled(false);
46 | chart.setScaleEnabled(false);
47 | chart.setPinchZoom(false);
48 | chart.setDoubleTapToZoomEnabled(false);
49 | chart.setDrawGridBackground(false);
50 |
51 | chart.getData().setHighlightEnabled(true);
52 |
53 | chart.getAxisLeft().setAxisMaximum(PitchCalculator.maxPitch.floatValue());
54 | chart.getAxisRight().setAxisMaximum(PitchCalculator.maxPitch.floatValue());
55 | chart.getAxisRight().setAxisMinimum(PitchCalculator.minPitch.floatValue());
56 | chart.getAxisLeft().setAxisMinimum(PitchCalculator.minPitch.floatValue());
57 |
58 | chart.getAxisLeft().setValueFormatter(new GraphValueFormatter());
59 | chart.getAxisRight().setValueFormatter(new GraphValueFormatter());
60 | chart.setDrawBorders(false);
61 |
62 | // set min/max values etc. for axes
63 | chart.getAxisLeft().setAxisMinimum(PitchCalculator.minMalePitch.floatValue());
64 | chart.getAxisRight().setAxisMinimum(PitchCalculator.minMalePitch.floatValue());
65 | // chart.getAxisRight().setStartAtZero(false);
66 |
67 | chart.setHardwareAccelerationEnabled(true);
68 | // chart.getLegend().setEnabled(false);
69 |
70 | Legend legend = chart.getLegend();
71 | legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
72 | legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
73 | legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
74 |
75 | return chart;
76 | }
77 |
78 | /**
79 | * get bar chart data for male/female vocal ranges
80 | * to display them as bars beneath other chart data
81 | *
82 | * @param amount amount of entries needed
83 | * @return bar data to add to chart
84 | */
85 | public static BarDataSet getOverallRange(Context context, int amount)
86 | {
87 | BarDataSet set = new BarDataSet(GraphLayout.getRangeEntries(amount), "");
88 | set.setDrawValues(false);
89 | set.setColors(new int[]{context.getResources().getColor(R.color.male_range),
90 | context.getResources().getColor(R.color.androgynous_range),
91 | context.getResources().getColor(R.color.female_range)});
92 | set.setStackLabels(new String[]{context.getResources().getString(R.string.male_range),
93 | context.getResources().getString(R.string.androgynous_range),
94 | context.getResources().getString(R.string.female_range)
95 | });
96 |
97 | // List setList = new ArrayList();
98 | // setList.add(set);
99 | //
100 | // return setList;
101 |
102 | return set;
103 | }
104 |
105 | /***
106 | * @param amount
107 | * @return
108 | */
109 | private static List getRangeEntries(int amount)
110 | {
111 | List result = new ArrayList();
112 |
113 | for (int i = 0; i < amount; i++)
114 | {
115 | result.add(new BarEntry(i, new float[]{
116 | PitchCalculator.minMalePitch.floatValue()*2,
117 | PitchCalculator.maxMalePitch.floatValue() - PitchCalculator.minFemalePitch.floatValue(),
118 | PitchCalculator.maxFemalePitch.floatValue() - PitchCalculator.maxMalePitch.floatValue(),
119 | }));
120 | }
121 |
122 | return result;
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/GraphValueFormatter.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import com.github.mikephil.charting.formatter.ValueFormatter;
4 |
5 | import java.text.DecimalFormat;
6 |
7 | /**
8 | * Created by Yuri on 06/07/15.
9 | */
10 | public class GraphValueFormatter extends ValueFormatter {
11 | private DecimalFormat format = new DecimalFormat("###,###,##0.0");
12 |
13 | public GraphValueFormatter() {
14 | }
15 |
16 | @Override
17 | public String getFormattedValue(float value) {
18 | return String.format("%sHz", format.format(value));
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/PitchCalculator.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import java.util.ArrayList;
4 | import java.util.Collections;
5 | import java.util.List;
6 |
7 | /**
8 | * Created by Lilith on 04/07/15.
9 | */
10 | public class PitchCalculator {
11 | // Yes the range is very large - test it and maybe change to something like 85-255
12 | public static Double minPitch = 65.0;
13 | public static Double maxPitch = 300.0;
14 | public static Double minFemalePitch = 165.0;
15 | public static Double maxFemalePitch = 255.0;
16 | public static Double minMalePitch = 85.0;
17 | public static Double maxMalePitch = 180.0;
18 |
19 | private static final Double HIGHER_VOICE_CUT_OFF = 145.0;
20 | private static final Double LOWER_VOICE_CUT_OFF = 110.0;
21 |
22 | private List pitches = new ArrayList();
23 |
24 | public static List copyList(List source) {
25 | List dest = new ArrayList();
26 | for (T item : source) {
27 | dest.add(item);
28 | }
29 | return dest;
30 | }
31 |
32 | public Boolean addPitch(Double pitch) {
33 | // if voice is a 'high' voice we can confidently bump up the minPitch a little to remove
34 | // annoying extraneous pitch result points and same for low voices
35 | Double minPitchCutoff = getMinPitchCutoff();
36 | Double maxPitchCutoff = getMaxPitchCutoff();
37 |
38 | if (pitch > minPitchCutoff && pitch < maxPitchCutoff) {
39 | this.pitches.add(pitch);
40 | return Boolean.TRUE;
41 | }
42 |
43 | return Boolean.FALSE;
44 | }
45 |
46 | public List getPitches() {
47 | return this.pitches;
48 | }
49 |
50 | public void setPitches(List pitches) {
51 | this.pitches = pitches;
52 | }
53 |
54 | public Double calculatePitchAverage() {
55 | return this.calculateAverage(this.pitches);
56 | }
57 |
58 | public Double calculateMaxAverage() {
59 | List maxSorted = PitchCalculator.copyList(this.pitches);
60 | Collections.sort(maxSorted);
61 | Collections.reverse(maxSorted);
62 | Integer elements = maxSorted.size() / 3;
63 | return this.calculateAverage(maxSorted.subList(0, elements));
64 | }
65 |
66 | public Double calculateMinAverage() {
67 | List minSorted = PitchCalculator.copyList(this.pitches);
68 | Collections.sort(minSorted);
69 | Integer elements = minSorted.size() / 3;
70 | return this.calculateAverage(minSorted.subList(0, elements));
71 | }
72 |
73 | public Double getMax() {
74 | Double max_pitch = null;
75 | for (Double pitch: this.pitches) {
76 | if(max_pitch == null || max_pitch < pitch) {
77 | max_pitch = pitch;
78 | }
79 | }
80 |
81 | return max_pitch;
82 | }
83 |
84 | public Double getMin() {
85 | Double min_pitch = null;
86 | for (Double pitch: this.pitches) {
87 | if(min_pitch == null || min_pitch > pitch) {
88 | min_pitch = pitch;
89 | }
90 | }
91 |
92 | return min_pitch;
93 | }
94 |
95 | private Double calculateAverage(List pitches) {
96 | Double sum = 0.0;
97 | if (!pitches.isEmpty()) {
98 | for (Double pitch : pitches) {
99 | sum += pitch;
100 | }
101 | return sum.doubleValue() / pitches.size();
102 | }
103 | return sum;
104 | }
105 |
106 | private Double getMinPitchCutoff() {
107 | Double minPitchCutoff = minPitch;
108 | if (calculatePitchAverage() > HIGHER_VOICE_CUT_OFF)
109 | minPitchCutoff = 85.0;
110 |
111 | return minPitchCutoff;
112 | }
113 |
114 | private Double getMaxPitchCutoff() {
115 | Double maxPitchCutoff = maxPitch;
116 | if (calculatePitchAverage() < LOWER_VOICE_CUT_OFF)
117 | maxPitchCutoff = 255.0;
118 |
119 | return maxPitchCutoff;
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/RecordingCleaner.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import android.content.Context;
4 | import android.util.Log;
5 |
6 | import java.io.IOException;
7 | import java.nio.file.DirectoryStream;
8 | import java.nio.file.Files;
9 | import java.nio.file.NoSuchFileException;
10 | import java.nio.file.Path;
11 | import java.time.Duration;
12 | import java.time.Instant;
13 | import java.util.Date;
14 | import java.util.HashSet;
15 | import java.util.Optional;
16 | import java.util.stream.Collectors;
17 |
18 | import de.lilithwittmann.voicepitchanalyzer.models.Recording;
19 | import de.lilithwittmann.voicepitchanalyzer.models.database.RecordingDB;
20 |
21 | public class RecordingCleaner implements Runnable {
22 | private static final String LOG_TAG = RecordingCleaner.class.getSimpleName();
23 |
24 | private final Context context;
25 |
26 | private static final long MAX_RECORDINGS_SIZE = 1024 * 1024 * 100;
27 | private static final int MIN_RECORDING_DAYS = 1;
28 |
29 | public RecordingCleaner(Context context) {
30 | this.context = context;
31 | }
32 |
33 | @Override
34 | public void run() {
35 | cleanUnfinishedRecordings(this.context);
36 | cleanRecordings(this.context);
37 | }
38 |
39 | public static void cleanUnfinishedRecordings(Context context) {
40 | Path directory = RecordingPaths.getUnfinishedRecordingsDirectoryPath(context);
41 | if (directory == null || !Files.isDirectory(directory)) {
42 | return;
43 | }
44 | DirectoryStream directoryStream;
45 | try {
46 | directoryStream = Files.newDirectoryStream(directory);
47 | } catch (IOException ex) {
48 | Log.w(LOG_TAG, "error opening recording directory " + directory + ": " + ex);
49 | return;
50 | }
51 |
52 | long deleteCount = 0;
53 | for (Path filePath : directoryStream) {
54 | try {
55 | Files.deleteIfExists(filePath);
56 | deleteCount += 1;
57 | } catch (IOException ex) {
58 | Log.w(LOG_TAG, "error deleting unfinished recording " + filePath + ": " + ex);
59 | }
60 | }
61 |
62 | Log.i(LOG_TAG, "deleted " + deleteCount + " unfinished recording files");
63 | }
64 |
65 | public static void cleanRecordings(Context context) {
66 | HashSet remainingFiles;
67 | try {
68 | remainingFiles = getRecordingFiles(context);
69 | } catch (IOException ex) {
70 | Log.w(LOG_TAG, "error listing recordings directory: " + ex);
71 | remainingFiles = null;
72 | }
73 |
74 | RecordingDB db = new RecordingDB(context);
75 |
76 | Date newestDeleteDate = Date.from(Instant.now().minus(Duration.ofDays(MIN_RECORDING_DAYS)));
77 | long runningSize = 0;
78 | long deletedSize = 0;
79 | long runningCount = 0;
80 | long deleteCount = 0;
81 | long oldCount = 0;
82 | for (Recording recording : db.getRecordingsWithFiles()) {
83 | runningCount += 1;
84 | runningSize += recording.getRecordingFileSize();
85 | if (remainingFiles != null && recording.getRecording() != null) {
86 | remainingFiles.remove(recording.getRecording());
87 | }
88 | if (recording.getDate().before(newestDeleteDate)) {
89 | oldCount += 1;
90 | if (runningSize > MAX_RECORDINGS_SIZE) {
91 | DeleteResult deleteResult = deleteRecording(context, db, recording);
92 | if (deleteResult == DeleteResult.OK || deleteResult == DeleteResult.MISSING) {
93 | deleteCount += 1;
94 | }
95 | if (deleteResult == DeleteResult.OK) {
96 | deletedSize += recording.getRecordingFileSize();
97 | }
98 | }
99 | }
100 | }
101 |
102 | Log.i(LOG_TAG, "deleted " + deleteCount + " of " + oldCount + " old recording files (of " + runningCount + " total) freeing " + deletedSize
103 | + " of " + runningSize + " bytes");
104 |
105 | long deletedOrphanCount = 0;
106 | for (String file : Optional.ofNullable(remainingFiles).orElseGet(HashSet::new)) {
107 | Path path = RecordingPaths.getRecordingPath(context, file);
108 | if (path != null) {
109 | try {
110 | Files.delete(path);
111 | deletedOrphanCount += 1;
112 | } catch (IOException ex) {
113 | Log.w(LOG_TAG, "failed to delete orphaned recording file " + path + ": " + ex);
114 | }
115 | } else {
116 | Log.w(LOG_TAG, "could not determine path for orphaned recording file " + file);
117 | }
118 | }
119 |
120 | Log.i(LOG_TAG, "deleted " + deletedOrphanCount + " orphaned recording files");
121 | }
122 |
123 | private static HashSet getRecordingFiles(Context context) throws IOException {
124 | Path path = RecordingPaths.getRecordingsDirectoryPath(context);
125 | if (path == null) {
126 | Log.w(LOG_TAG, "could not determine recordings path");
127 | return null;
128 | }
129 | return Files.list(path)
130 | .map(filePath -> filePath.getFileName().toString())
131 | .collect(Collectors.toCollection(HashSet::new));
132 | }
133 |
134 | private static DeleteResult deleteRecording(Context context, RecordingDB db, Recording recording) {
135 | Optional path = Optional.ofNullable(recording.getRecording())
136 | .map(name -> RecordingPaths.getRecordingPath(context, name));
137 | if (!path.isPresent()) {
138 | Log.w(LOG_TAG, "could not determine path for recording file " + recording.getRecording());
139 | return DeleteResult.ERROR;
140 | }
141 | DeleteResult result;
142 | try {
143 | Files.delete(path.get());
144 | result = DeleteResult.OK;
145 | } catch (NoSuchFileException ex) {
146 | Log.w(LOG_TAG, "recording file " + path.get() + " missing");
147 | result = DeleteResult.MISSING;
148 | } catch (IOException ex) {
149 | Log.w(LOG_TAG, "error deleting recording file " + path.get() + ": ", ex);
150 | return DeleteResult.ERROR;
151 | }
152 | db.updateRecordingFilename(recording.getId(), null);
153 | return result;
154 | }
155 |
156 | private enum DeleteResult {
157 | OK,
158 | ERROR,
159 | MISSING,
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/RecordingPaths.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import android.content.Context;
4 |
5 | import java.nio.file.Path;
6 | import java.util.Optional;
7 |
8 | public class RecordingPaths {
9 | private static String RECORDING_DIR = "recordings";
10 | private static String UNFINISHED_RECORDING_DIR = "unfinished_recordings";
11 |
12 | public static Path getUnfinishedRecordingsDirectoryPath(Context context) {
13 | return Optional.ofNullable(context.getFilesDir())
14 | .map(dir -> dir.toPath().resolve(UNFINISHED_RECORDING_DIR))
15 | .orElse(null);
16 | }
17 |
18 | public static Path getUnfinishedRecordingPath(Context context, String name) {
19 | return Optional.ofNullable(getUnfinishedRecordingsDirectoryPath(context))
20 | .map(dir -> dir.resolve(name))
21 | .orElse(null);
22 | }
23 |
24 | public static Path getRecordingsDirectoryPath(Context context) {
25 | return Optional.ofNullable(context.getFilesDir())
26 | .map(dir -> dir.toPath().resolve(RECORDING_DIR))
27 | .orElse(null);
28 | }
29 |
30 | public static Path getRecordingPath(Context context, String name) {
31 | return Optional.ofNullable(getRecordingsDirectoryPath(context))
32 | .map(dir -> dir.resolve(name))
33 | .orElse(null);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/app/src/main/java/de/lilithwittmann/voicepitchanalyzer/utils/SampleRateCalculator.java:
--------------------------------------------------------------------------------
1 | package de.lilithwittmann.voicepitchanalyzer.utils;
2 |
3 | import android.media.AudioRecord;
4 |
5 | import java.util.ArrayList;
6 |
7 | /**
8 | * Created by lilith on 7/6/15.
9 | */
10 | public class SampleRateCalculator {
11 |
12 | public static int getMaxSupportedSampleRate() {
13 | /*
14 | * Valid Audio Sample rates
15 | *
16 | * @see Wikipedia
19 | */
20 | final int validSampleRates[] = new int[]{
21 | 47250, 44100, 44056, 37800, 32000, 22050, 16000, 11025, 4800, 8000,};
22 | /*
23 | * Selecting default audio input source for recording since
24 | * AudioFormat.CHANNEL_CONFIGURATION_DEFAULT is deprecated and selecting
25 | * default encoding format.
26 | */
27 | for (int i = 0; i < validSampleRates.length; i++) {
28 | int result = AudioRecord.getMinBufferSize(validSampleRates[i],
29 | android.media.AudioFormat.CHANNEL_IN_MONO,
30 | android.media.AudioFormat.ENCODING_PCM_16BIT);
31 | if (result != AudioRecord.ERROR
32 | && result != AudioRecord.ERROR_BAD_VALUE && result > 0) {
33 | // return the mininum supported audio sample rate
34 | return validSampleRates[i];
35 | }
36 | }
37 | // If none of the sample rates are supported return -1 handle it in
38 | // calling method
39 | return -1;
40 | }
41 |
42 |
43 | public static ArrayList getAllSupportedSampleRates() {
44 | /*
45 | *get all supported sample rates
46 | *
47 | * @see Wikipedia
50 | */
51 | final int validSampleRates[] = new int[]{ 5644800, 2822400, 352800, 192000, 176400, 96000,
52 | 88200, 50400, 50000, 4800, 47250, 44100, 44056, 37800, 32000, 22050, 16000, 11025, 8000, };
53 | /*
54 | * Selecting default audio input source for recording since
55 | * AudioFormat.CHANNEL_CONFIGURATION_DEFAULT is deprecated and selecting
56 | * default encoding format.
57 | */
58 |
59 | ArrayList supportedSampleRates = new ArrayList();
60 | for (int i = 0; i < validSampleRates.length; i++) {
61 | int result = AudioRecord.getMinBufferSize(validSampleRates[i],
62 | android.media.AudioFormat.CHANNEL_IN_MONO,
63 | android.media.AudioFormat.ENCODING_PCM_16BIT);
64 | if (result != AudioRecord.ERROR
65 | && result != AudioRecord.ERROR_BAD_VALUE && result > 0) {
66 | // return the mininum supported audio sample rate
67 | supportedSampleRates.add(validSampleRates[i]);
68 | }
69 | }
70 | // If none of the sample rates are supported return -1 handle it in
71 | // calling method
72 | return supportedSampleRates;
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/app/src/main/res/color/button_text_color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ab_bottom_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ab_bottom_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ab_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ab_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ab_stacked_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ab_stacked_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ab_texture_tile_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ab_texture_tile_example.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ab_transparent_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ab_transparent_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/app_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/btn_cab_done_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/btn_cab_done_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/btn_cab_done_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/btn_cab_done_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/btn_cab_done_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/btn_cab_done_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/cab_background_bottom_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/cab_background_bottom_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/cab_background_top_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/cab_background_top_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_assessment_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_assessment_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_delete_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_delete_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_info_outline_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_info_outline_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_info_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_info_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_play_circle_filled_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_play_circle_filled_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_settings_voice_black_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_settings_voice_black_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_settings_voice_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/ic_settings_voice_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/list_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/list_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/list_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/list_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/menu_dropdown_panel_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/menu_dropdown_panel_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/progress_bg_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/progress_bg_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/progress_primary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/progress_primary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/progress_secondary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/progress_secondary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/spinner_ab_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/spinner_ab_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/spinner_ab_disabled_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/spinner_ab_disabled_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/spinner_ab_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/spinner_ab_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/spinner_ab_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/spinner_ab_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/tab_selected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/tab_selected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/tab_selected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/tab_selected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/tab_selected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/tab_selected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/tab_unselected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/tab_unselected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/tab_unselected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/tab_unselected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/tab_unselected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-hdpi/tab_unselected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ab_bottom_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ab_bottom_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ab_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ab_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ab_stacked_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ab_stacked_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ab_texture_tile_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ab_texture_tile_example.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ab_transparent_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ab_transparent_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/app_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/btn_cab_done_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/btn_cab_done_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/btn_cab_done_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/btn_cab_done_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/btn_cab_done_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/btn_cab_done_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/cab_background_bottom_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/cab_background_bottom_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/cab_background_top_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/cab_background_top_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_assessment_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_assessment_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_delete_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_delete_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_info_outline_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_info_outline_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_info_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_info_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_play_circle_filled_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_play_circle_filled_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_settings_voice_black_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_settings_voice_black_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/ic_settings_voice_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/ic_settings_voice_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/list_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/list_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/list_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/list_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/menu_dropdown_panel_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/menu_dropdown_panel_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/progress_bg_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/progress_bg_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/progress_primary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/progress_primary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/progress_secondary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/progress_secondary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/spinner_ab_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/spinner_ab_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/spinner_ab_disabled_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/spinner_ab_disabled_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/spinner_ab_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/spinner_ab_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/spinner_ab_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/spinner_ab_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/tab_selected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/tab_selected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/tab_selected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/tab_selected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/tab_selected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/tab_selected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/tab_unselected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/tab_unselected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/tab_unselected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/tab_unselected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-mdpi/tab_unselected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-mdpi/tab_unselected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ab_bottom_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ab_bottom_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ab_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ab_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ab_stacked_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ab_stacked_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ab_texture_tile_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ab_texture_tile_example.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ab_transparent_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ab_transparent_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/app_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/btn_cab_done_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/btn_cab_done_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/btn_cab_done_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/btn_cab_done_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/btn_cab_done_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/btn_cab_done_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/cab_background_bottom_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/cab_background_bottom_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/cab_background_top_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/cab_background_top_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_assessment_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_assessment_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_delete_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_delete_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_info_outline_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_info_outline_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_info_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_info_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_play_circle_filled_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_play_circle_filled_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_settings_voice_black_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_settings_voice_black_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_settings_voice_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/ic_settings_voice_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/list_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/list_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/list_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/list_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/menu_dropdown_panel_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/menu_dropdown_panel_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/progress_bg_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/progress_bg_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/progress_primary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/progress_primary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/progress_secondary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/progress_secondary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/spinner_ab_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/spinner_ab_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/spinner_ab_disabled_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/spinner_ab_disabled_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/spinner_ab_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/spinner_ab_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/spinner_ab_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/spinner_ab_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/tab_selected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/tab_selected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/tab_selected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/tab_selected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/tab_selected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/tab_selected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/tab_unselected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/tab_unselected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/tab_unselected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/tab_unselected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/tab_unselected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xhdpi/tab_unselected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ab_bottom_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ab_bottom_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ab_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ab_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ab_stacked_solid_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ab_stacked_solid_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ab_texture_tile_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ab_texture_tile_example.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ab_transparent_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ab_transparent_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/app_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/btn_cab_done_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/btn_cab_done_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/btn_cab_done_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/btn_cab_done_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/btn_cab_done_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/btn_cab_done_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/cab_background_bottom_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/cab_background_bottom_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/cab_background_top_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/cab_background_top_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_delete_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/drawable-xxhdpi/ic_delete_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_assessment_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ic_assessment_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_info_outline_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ic_info_outline_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_info_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ic_info_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_play_circle_filled_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ic_play_circle_filled_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_settings_voice_black_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ic_settings_voice_black_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_settings_voice_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/ic_settings_voice_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/list_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/list_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/list_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/list_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/menu_dropdown_panel_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/menu_dropdown_panel_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/progress_bg_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/progress_bg_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/progress_primary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/progress_primary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/progress_secondary_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/progress_secondary_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/spinner_ab_default_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/spinner_ab_default_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/spinner_ab_disabled_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/spinner_ab_disabled_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/spinner_ab_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/spinner_ab_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/spinner_ab_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/spinner_ab_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/tab_selected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/tab_selected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/tab_selected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/tab_selected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/tab_selected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/tab_selected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/tab_unselected_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/tab_unselected_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/tab_unselected_focused_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/tab_unselected_focused_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/tab_unselected_pressed_example.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxhdpi/tab_unselected_pressed_example.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxxhdpi/app_icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_assessment_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxxhdpi/ic_assessment_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_info_outline_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxxhdpi/ic_info_outline_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_info_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxxhdpi/ic_info_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_play_circle_filled_black_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxxhdpi/ic_play_circle_filled_black_24dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_settings_voice_white_48dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/app/src/main/res/drawable-xxxhdpi/ic_settings_voice_white_48dp.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ab_background_textured_example.xml:
--------------------------------------------------------------------------------
1 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/btn_cab_done_example.xml:
--------------------------------------------------------------------------------
1 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/progress_horizontal_example.xml:
--------------------------------------------------------------------------------
1 |
18 |
19 |
20 |
21 |
24 |
25 | -
26 |
29 |
30 |
31 | -
32 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ripple.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/selectable_background_example.xml:
--------------------------------------------------------------------------------
1 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/spinner_background_ab_example.xml:
--------------------------------------------------------------------------------
1 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/tab_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/tab_indicator.xml:
--------------------------------------------------------------------------------
1 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/tab_text_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_about.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_record_view.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_recording.xml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
15 |
16 |
20 |
21 |
28 |
29 |
34 |
35 |
40 |
41 |
42 |
43 |
44 |
48 |
49 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_recording_list.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_progress.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_reading.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_record_graph.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
11 |
12 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_record_view.xml:
--------------------------------------------------------------------------------
1 |
10 |
11 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_recording.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
10 |
11 |
20 |
21 |
22 |
26 |
27 |
34 |
35 |
46 |
47 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_recording_grid.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_recording_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_recording_overview.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_recording_play.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
12 |
13 |
14 |
15 |
19 |
20 |
25 |
26 |
27 |
28 |
29 |
33 |
34 |
39 |
40 |
41 |
42 |
43 |
47 |
48 |
53 |
54 |
55 |
56 |
57 |
58 |
62 |
63 |
68 |
69 |
70 |
71 |
72 |
76 |
77 |
82 |
83 |
84 |
85 |
86 |
90 |
91 |
97 |
98 |
99 |
100 |
101 |
105 |
106 |
110 |
111 |
117 |
118 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_welcome.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
32 |
33 |
39 |
40 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/listview.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
20 |
21 |
29 |
30 |
31 |
41 |
42 |
43 |
47 |
48 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/row_swipe_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/tabs_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu.xml:
--------------------------------------------------------------------------------
1 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_about.xml:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values-de/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Aufnahme
4 | Aufnehmen
5 | Anhalten
6 | Neue Aufnahme
7 | Übersicht
8 | Einzelne Tonhöhen
9 | Details
10 | Min. Durchschn.: %1$sHz, Max. Durchschn.: %2$sHz, Durchschnitt: %3$sHz
11 | Gesamtdurchschnitt
12 | Durchschnittliches Maximum
13 | Durchschnittliches Minimum
14 | Weibliche Stimmlage
15 | Männliche Stimmlage
16 | Deine Stimmlage
17 | weiblich
18 | im Mittelfeld
19 | männlich
20 | Deine Stimmlage klingt überwiegend
21 | Über
22 | Verwendete Libraries:
23 | Programmierung
24 | unbekannt
25 | Über Voice Pitch Analyzer
26 | Hallo!
27 | Um ein aussagekräftiges Ergebnis zu erhalten, ist es am besten, für die Aufnahme ein Headseit oder externes Mikrophon zu benutzen.
28 | Weiter
29 | Wenn Du fertig bist, drücke »stop« um Deine Ergebnisse zu sehen. Der Graph zeigt Dir (in Lila) die typischen ›männlichen‹ und ›weiblichen‹ Stimmlagenbereiche sowie Deinen eigenen (in Grau) an. Der Teil, der sich überlagert, kann sowohl als ›männlich‹ als auch als ›weiblich‹ wahrgenommen werden.
30 | Um Deine Stimme zu analysieren, wird eine ca. einminütige Aufnahme benötigt. Du kannst dafür den angezeigten Text vorlesen, die Analyse funktioniert aber mit mit allem, sofern Du es in Deiner natürlichen Stimmlage eingesprochen hast.
31 | Stimmanalyse
32 | Leider wird Dein Mikrofon momentan noch nicht unterstützt. Die Entwickelnden wurden über dieses Problem informiert.
33 | Mikrofon wird nicht unterstützt
34 | Maximum
35 | Durchschnittliches Maximum
36 | Minimum
37 | Durchschnittliches Minimum
38 | Bitte füge eine Aufzeichnung hinzu, indem Du auf das Aufnahmesymbol oben rechts klickst.
39 | Neutraler Bereich
40 | Übersetzung
41 | Englisch
42 | Deutsch
43 | Portugiesisch
44 | Italienisch
45 | Aufnahme gelöscht
46 | Rückgängig
47 | Alle Texte stammen aus »Das Bildnis des Dorian Gray« von Oscar Wilde
48 | Um Deine Stimme aufnehmen zu können, braucht Voice Pitch Analyzer Zugriff auf das Mikrofon.
49 | Mikrofonzugriff benötigt
50 | Einstellungen
51 | Tonlage
52 | Text
53 | Stimmverlauf
54 | Echtzeitverlauf
55 | Mitwirkende
56 |
57 |
--------------------------------------------------------------------------------
/app/src/main/res/values-it/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Analizzatore del tono della voce
4 |
5 |
6 | Nuova registrazione
7 | Registrazione
8 | Registrazione
9 | Stop
10 |
11 | Visione generale
12 | Tono lungo il tempo
13 | Dettagli
14 |
15 | Min media: %1$sHz, Max media: %2$sHz, Media: %3$sHz
16 |
17 | Media generale
18 | Media minima
19 | Media massima
20 | Intervallo maschile
21 | Intervallo femminile
22 | Il tuo intervallo
23 | Il tuo intervallo suona piuttosto
24 | maschile
25 | femminile
26 | tra
27 | sconosciuto
28 | Massimo
29 | Minimo
30 | Media massima
31 | Media minima
32 |
33 | Su
34 | Su Analizzatore del tone di voce
35 | Programmando
36 |
37 | L\'Analizzatore del tono di voce utilizza le seguenti biblioteche:
38 |
39 |
40 | Ciao!
41 |
42 | Per fare un\'analisi corretta dobbiamo avere un minuto della registrazione della tua voce. In questo senso, ti daremo un testo con una durata pari al tempo di cui ne abbiamo bisogno. Certamente tu sei libero/a di dire qualsiasi altra cosa, anche, purché sia detto nel tuo tono naturale di voce.
43 |
44 |
45 | Al fine di produrre risultati che si possano analizzare, si consiglia di usare un headset oppure un microfono esterno.
46 |
47 |
48 | Nel momento in cui avrai finito, basta premere il tasto \'stop\' per vedere i tuoi risultati. Sul foglio dei risultati troverai un grafico su cui risulteranno gli intervalli tipici del tono di voce (in viola) sia maschili che femminili, insieme al tuo intervallo (in grigio). Noterai che gli intervalli \'maschili\' e \'femminili\' si sovrappongono leggermente, che vuol dire che il tono può essere presente nei due generi.
49 |
50 | Vai alla prossima
51 |
52 | Microfono non supportato ancora. Gli sviluppatori già sono stati informati.
53 |
54 | Microfono non supportato
55 |
56 | Sei pregato di registrare qualcosa premendo l\'icona del microfono sull\'angolo superiore destro.
57 |
58 | Italiano
59 | Portoghese
60 | Tedesco
61 | Traduzione
62 | Annullare
63 | Inglese
64 | Intervallo neutro
65 | Testo: Oscar Wilde - Il Ritratto di Dorian Gray
66 | Registrazione cancellato
67 | Impostazioni
68 | L\'autorizzazione per accedere al microfono è necessaria per registrare la tua voce.
69 | L\'accesso al microfono richiesto
70 | Tono
71 | Progresso complessivo
72 | Testo
73 | Contribuzione
74 |
75 |
--------------------------------------------------------------------------------
/app/src/main/res/values-large/refs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 | - @layout/fragment_recording_grid
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values-pt/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Analisador do tom de voz
4 |
5 |
6 | Nova gravação
7 | Gravação
8 | Gravação
9 | Parar
10 |
11 | Visão geral
12 | Tom ao longo do Tempo
13 | Detalhes
14 |
15 | Média Mínima: %1$sHz, Média Máxima: %2$sHz, Média: %3$sHz
16 |
17 | Média Geral
18 | Média mínima
19 | Média máxima
20 | Extensão masculina
21 | Extensão feminina
22 | Sua Extensão
23 | Sua extensão é principalmente
24 | masculina
25 | feminina
26 | no meio
27 | desconhecida
28 | Máximo
29 | Mínimo
30 | Média máxima
31 | Média mínima
32 |
33 | Sobre
34 | Sobre o Analisador de Tom de Voz
35 | Programando
36 |
37 | Analisador de Tom de Voz usa as seguintes bibliotecas:
38 |
39 |
40 | Ei, você aí!
41 |
42 | Para analisar propriamente, nós precisamos de cerca de um minuto de áudio de sua voz. Por esta razão, nós vamos te dar um texto com uma duração aproximada do tempo que precisamos. Obviamente você é livre para dizer qualquer outra coisa, também, desde que seja com sua voz natural.
43 |
44 |
45 | Para produzir bom resultados para analisarmos, é recomendado o uso de um headset ou outro microfone externo.
46 |
47 |
48 | Quando você acabar, aperte »parar« para ver seus resultados. Na página de resultados você encontrará um gráfico mostrando as extensões de tom (em violeta) típicas \'masculinas\' e \'femininas\', junto com a sua própria extensão (em cinza).
49 |
50 | Próximo
51 |
52 | Microfone não é suportado ainda. Os desenvolvedores foram informados.
53 |
54 | Microfone não suportado
55 |
56 | Por favor grave algo pressionando o ícone de microfone no canto superior direito.
57 |
58 | Português
59 | Italiano
60 | Alemão
61 | Tradução
62 | Desfazer
63 | Inglês
64 | Extensão andrógina
65 | Texto: Oscar Wilde - O Retrato de Dorian Gray
66 | Definições
67 | In order to record your voice, you need to give Voice Pitch Analyzer permission to access this device\'s microphone.
68 | Gravação excluído
69 | Acesso ao microfone necessário
70 | Tom
71 | Progresso total
72 | Texto
73 | Colaboração
74 |
75 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/refs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 | - @layout/fragment_recording_grid
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 | >
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #e6e3f7
5 |
6 | #b5aad6
7 |
8 | #948ec5
9 |
10 | #D1C4E9
11 |
12 | #B39DDB
13 |
14 | #907eb0
15 |
16 | #7E57C2
17 |
18 | #673ab7
19 |
20 | #311B92
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 | 16sp
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/refs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 | - @layout/fragment_recording_list
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Voice Pitch Analyzer
6 |
7 |
8 | preferences.conf
9 | text-number
10 | first-start
11 |
12 |
13 | Undo
14 | Record deleted
15 | Please record something by pressing the microphone icon in the upper right corner.
16 |
17 |
18 | New Recording
19 | Record
20 | Record
21 | Stop
22 | Text
23 | Real-Time Graph
24 | recording_tab_index
25 |
26 |
27 | Overview
28 | Pitch over Time
29 | Details
30 | Min Avg: %1$sHz, Max Avg: %2$sHz, Average: %3$sHz
31 | General Average
32 | Minimum Average
33 | Maximum Average
34 | Male Range
35 | Female Range
36 | Androgynous Range
37 | Your Range
38 | Your range sounds mostly
39 | male
40 | female
41 | in between
42 | unknown
43 | Maximum
44 | Minimum
45 | Maximum Average
46 | Minimum Average
47 |
48 |
49 | About
50 | About Voice Pitch Analyzer
51 | Purr Programming
52 | Programming
53 | Design
54 | Lilith Wittmann & Yuri Ichijō
55 | Yuri Ichijō
56 | Voice Pitch Analyzer uses the following libraries:
57 | MPAndroidChart
58 | Apache 2.0
59 | TarsosDSP
60 | GPL 3.0
61 | Joda Time
62 | Contributors
63 | Maddie Abboud
64 | Translation
65 | English
66 | German
67 | Portuguese
68 | Italian
69 | Aurora Viana
70 | All texts from »The Picture of Dorian Gray« by Oscar Wilde
71 | GitHub
72 |
73 |
74 | Hey there!
75 | To properly analyse it, we need about one minute of audio recording of your voice. For this purpose, we’ll provide you with a text of a length approximate to this time frame. Of course you’re free to say anything else, too, as long as it’s in your natural voice.
76 | To produce meaningful analysing results, it’s best to use a headset or other external microphone.
77 | When you’re finished, press »stop« to see your results. On the result page you’ll find a graph showing the typical ›male‹ and ›female‹ pitch ranges (in violet), along with your own (in grey). You’ll notice the ›male‹ and ›female‹ ranges are overlapping each other a bit, denoting a range that can be perceived as either gender.
78 | Next
79 |
80 |
81 | Microphone not supported yet. The developers have been informed.
82 | Microphone not supported
83 |
84 |
85 | In order to record your voice, you need to give Voice Pitch Analyzer permission to access this device\'s microphone.
86 | Settings
87 | Microphone access required
88 |
89 |
90 | Pitch
91 | Overall Progress
92 | Recording
93 | None
94 |
95 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
29 |
30 |
36 |
37 |
38 |
47 |
48 |
49 |
53 |
54 |
58 |
59 |
62 |
63 |
66 |
67 |
71 |
72 |
77 |
78 |
81 |
82 |
85 |
86 |
91 |
92 |
93 |
97 |
98 |
99 |
100 |
101 |
102 |
105 |
106 |
110 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | google()
6 | jcenter()
7 | }
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:4.2.0'
10 |
11 | // NOTE: Do not place your application dependencies here; they belong
12 | // in the individual module build.gradle files
13 | }
14 | }
15 |
16 | allprojects {
17 | repositories {
18 | google()
19 | jcenter()
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 | android.enableJetifier=true
20 | android.useAndroidX=true
21 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/purrprogramming/voice-pitch-analyzer/ac0c62ea8f08d1c7f58e8b21e5bc45d7527e3099/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Thu Apr 29 13:21:49 PDT 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/privacy_policy.md:
--------------------------------------------------------------------------------
1 | Datenschutzerklärung für die App Voice Pitch Analyer
2 |
3 | Alle in der Applikation erfassten Daten werden nur lokal auf dem Gerät gespeichert. Eine Ausnahme bilden hierbei Statistische Daten sowie etwaige auftretende Probleme mit der Applikation. Diese Daten werden pseudonymisiert an den Dienstleister fabric übermittelt und nur zur Behebung von Bugs in der App verwendet.
4 |
5 | Falls weitere Fragen zur Erfassung, Verarbeitung oder etwaiger Löschung von Daten bestehen sollten, wende Dich bitte an Lilith Wittmann (mail@lilithwittmann.de).
6 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':TarsosDSP-Android-2.2'
2 |
--------------------------------------------------------------------------------