Wavenote: Как я разработал музыкальное приложение и полюбил Android

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет! Меня зовут Седов Фёдор, я ученик 11 класса и выпускник «IT Школы Samsung» 2020 года. Мне предложили рассказать о своём опыте разработки мобильного приложения, моего первого большого проекта - блокнота для музыкантов (и поэтов). С этим проектом я одержал победу в нескольких конкурсах, а сейчас мечтаю, что у приложения появится много пользователей, которым оно будет помогать каждый день.

Совсем чуть-чуть про меня

На самом деле, Java, по настоянию одного мудрого джедая, стал моим первым языком программирования (ещё лет в 13). Однажды я даже пробовал Android, но страшные сообщения студии об ошибках и задыхающийся даже на Arch Linux ноутбук оттолкнули меня. Так оно и лежало, не вызывая никакого интереса, а потом в сентябре прошлого года я поступил в «IT Школу Samsung» на базе технопарка РТУ МИРЭА «Альтаир». За несколько лет до того у меня сложилось крайне негативное отношение к курсам, не ждал ничего хорошего и сейчас, но! Я оказался совсем не прав: и материал был хороший, и темп обучения высокий, и преподаватель Степанов Павел Валерьевич замечательный! А самое интересное, в завершение годового обучения — выпускная работа. Всё это позволило подступиться, понять и полюбить разработку под Android: это оказалось очень интересным — можно сделать всё, что захочется, и оно всегда будет под рукой. Теперь я планирую заниматься этим и в будущем, и я безумно благодарен всем-всем людям, которые дали мне эту возможность!

Идея проекта

Итак, к проекту! Моя идея была проста — взять много-много полезных для музыкантов, в том числе начинающих и любителей, инструментов, что раскиданы по разным приложениям и сайтам, и объединить в один. Очевидно, не один я до этого дошёл, но, проверив Play Market, обнаружил, что не так всё хорошо с существующими приложениями: некачественная реализация, неполный функционал, платные ограничения и реклама. В тоже время, судя по отзывам и своему опыту написания музыки, подобное приложение оказалось бы полезным, потому в январе начал двигаться в этом направлении. Я решил не изобретать велосипед и взял за основу Open Source-проект Simplenote, это позволило сэкономить время на разработке базового функционала, да и полученный результат, очевидно, был бы уже проверенного качества.

Приложение “Wavenote” - блокнот для музыкантов

Теперь, наконец, про то, что у меня получилось. Начну с описания того, что умеет приложение и как это было реализовано. Мне кажется, это всегда любопытно, даже если это не PiperNet.

Wavenote - это приложение заметок для музыкантов. Основная цель — сделать удобным процесс написания и исполнения песен (чего позволяют добиться такие функции, как "поиск слов", "студия" и другие), но также оно будет полезно всем, кто занимается музыкой, поскольку содержит набор универсальных утилит. К примеру, если вы только начинаете играть на музыкальном инструменте или вам нужно исполнить незнакомую песню — в приложении есть специальный режим отображения, который упростит эту задачу и подскажет табулатуры при необходимости. А если вы преподаватель, то Wavenote поможет вам организовать учебный процесс: составьте заметку с теорией или заданиями — и с помощью функций экспорта и импорта, ученик сможет легко получить материалы в исходном виде (сохранив форматирование и медиа).

Редактор

Начнём с самого главного. В редакторе есть подсветка аккордов и ключевых слов. Это позволяет легче ориентироваться по форме (напоминает сайты с песнями). Здесь всё довольно просто: получаем слова из базы данных, ищем их в тексте, проверяем, отмечены ли они, если нет, применяем новый стиль с помощью Span. Если всё сделать правильно, получится такая красота:

Стилизация текста

Она нужна, чтобы пользователь мог оформить заметку, что позволит легко по ней ориентироваться, и, к тому же, просто красиво.

Тут не сильно сложней, за основу диалога взята библиотека ColorSheet, но впоследствии она была сильно изменена и переписана на Java. Сам же стиль применяется к тексту с помощью Spannable. Однако пришлось модифицировать html-парсер из библиотеки Android, поскольку он добавлял лишние строки, игнорировал шрифты, а на API 21 работал совсем иначе и не поддерживал множество тегов, например, совсем отказывался работать с “<font>”.

Поиск

Эта функция позволяет искать определения к слову, рифмы, синонимы, ассоциации и многое другое. Это очень помогает в сочинении слов для песни. В реализации всё просто и эффектно — формируем http-запрос к Datamuse API на основе заполненных полей, далее выполняем его, используя библиотеку okhttp, получаем json-ответ и генерируем из него результат.

Слоги

С этим интересней. Во-первых, сам подсчёт: если для русского языка нужна всего одна строчка кода, то с английским всё сложней. Основная идея алгоритма для английского получилась такая: проверяем слово по пяти основным правилам (в случае, если обнаружено соответствие, добавляем в счётчик), а после вычитаем из общего количества гласных. Это обеспечивает высокую точность, однако существует множество исключений из правил, поэтому алгоритм порой выдает ошибочный результат. Для устранения этого был создан специальный список в ресурсах. Возможно, в будущем следует сделать его модифицируемым (наподобие словаря ключевых слов), чтобы пользователи могли его корректировать, обнаружив ошибку.

Реализовать эту функцию можно было также через вышеупомянутый сервис Datamuse. Однако в таком случае для её работы будет необходим интернет, а скорость выдачи результата значительно снизится.

Главной сложностью здесь оказалось отображение количества слогов. Проблема в том, что цифры вводятся в отдельное поле, соответственно нужно как-то учесть отступы из текста заметки. С пустыми строками всё понятно — вместо 0 выводим пробел, а вот для строк, которые на экране занимают несколько, пришлось написать еще один алгоритм, добавляющий переносы в случае, если ширина строки больше ширины поля заметки. Для расчёта ширины строки был использован следующий метод:

public float getTextLineWidth(CharSequence line) {
	TextPaint paint = new TextPaint();
	paint.setTextSize(getTextSize());
	StaticLayout tempLayout = StaticLayout.Builder
		.obtain(line, 0, line.length(), paint, 10000)
		.setAlignment(android.text.Layout.Alignment.ALIGN_NORMAL)
		.setIncludePad(false)
		.build();
	Rect rect = new Rect();
	tempLayout.getLineBounds(0, rect);
	float lineWidth = 0;
	for (int i = 0; i < tempLayout.getLineCount(); i++)
		lineWidth += tempLayout.getLineWidth(i);
	return lineWidth;
}

Аккорды

Первое — работа парсера. Сначала строка форматируется (убираются переносы и лишние пробелы), потом выполняются поиск и корректировка индексов аккордов, после текст разбивается на строки по этим индексам, таким образом мы получаем массив слов заметки без аккордов. Важно также считать порядок, в котором расположены слова и аккорды.

Второе — интерфейс. В моём решении все элементы заносятся в RecyclerView, однако объекты с ранее полученными индексами, соответствующими строкам, форматируется иначе (меняется размер и цвет).

Третье — транспонирование. Долго рассказывать про решение не буду — код можно найти на GitHub, главная сложность заключается в правилах теории музыки, например, аккорд "Fb" следует записывать как "E", но в то же время "Eb" вполне может записываться как "D#" в зависимости от контекста.

Четвёртое — табулатуры. На основе названия нажатой кнопки и данных из поля выбора инструмента генерируется имя файла ресурсов, содержащего картинку, а после она загружается в RecyclerView. В будущем планируется добавить несколько аппликатур.

Фотографии

С ними всё тоже просто, но очень много сил и времени ушло на борьбу с ограничениями Android по работе с файлами. Для отображения и кэширования используется библиотека Fresco, для приближения в ленте — Zoomy, а в полноэкранном режиме — PhotoView.

Студия

Многоканальная запись — одна из самых сложных и интересных функций. Но из-за этого описывать весь принцип работы слишком долго. Если кратко — для записи и воспроизведения используются pcm-файлы и объект AudioTrack. Результат также можно вывести в wav-файл и экспортировать.

Метроном

Принцип воспроизведения тот же, что и в студии. Из особенностей — есть возможность импорта и экспорта собственных wav-сэмплов (при этом звуки корректируются по атаке и конвертируются в моно/стерео для правильного воспроизведения в студии и метрономе). Также есть функция определения темпа, работает она так: измеряется время между нажатиями, затем рассчитывается среднее значение и по формуле конвертируется в bpm.

Словарь

И снова, всё просто! Обычный RecyclerView для редактирования пользователем записей базы данных.

Обратная связь

Запросы отправляются через сервис Sentry и приходят почти мгновенно прямо в панель разработчика, что очень удобно, к тому же минимизирует шансы пропустить важное сообщение.

Экспорт и импорт

Самым сложным вновь оказалась борьба с доступом к файловой системе Android. В итоге в приложении реализована поддержка экспорта и импорта всех медиафайлов, а также текста в форматах: plaintext, html, json (для импорта с параметрами). Можно экспортировать зашифрованный zip-архив (реализовано с помощью библиотеки Zip4j).

Заключение

Безусловно, ещё очень много работы впереди: продвижение, новые функции, рефакторинг. Много внимания нужно уделить стандартам качественного кода, что изначально удалось не полностью ввиду нехватки времени и небольшого опыта, но я очень доволен тем, что есть уже сейчас и сколько знаний в результате я приобрёл. А ещё тем, что у меня есть хоть и совсем небольшое, но стабильное число активных пользователей. 

И в завершение немного личных размышлений. Хорошая оценка за курс, перспектива принять участие в конкурсе выпускных проектов «IT Школы Samsung», конечно, мотивировали меня и помогали организовываться. Раньше я нигде не выигрывал, конкурсы и олимпиады проходили как-то мимо, а тут победа в финале конкурса «IT Школа выбирает сильнейших!», а потом еще первое место в Международном конкурсе «Учёные будущего». Всё получилось так, как я и представить себе не мог! 

И всё же не это было главной целью. Прежде всего мне хотелось сделать что-то полезное (пусть и совсем небольшое), для моих друзей, для меня и для всех людей. Мне кажется, что у меня это получилось и, я верю, что именно в этом главная причина успеха. 

Буду очень рад, если после этой статьи, Wavenote заинтересует еще кого-то и поможет в творчестве, которое делает наш мир чуть прекраснее!

Google Play: play.google.com/store/apps/details?id=com.theost.wavenote

GitHub: github.com/theo-jedi/wavenote-android

Источник: https://habr.com/ru/company/samsung/blog/533442/


Интересные статьи

Интересные статьи

Маркетплейс – это сервис от 1С-Битрикс, который позволяет разработчикам делиться своими решениями с широкой аудиторией, состоящей из клиентов и других разработчиков.
Как широко известно, с 1 января 2017 года наступает три важных события в жизни интернет-магазинов.
Возможно, вы уже попробовали наше новое приложение 3CX для Android Beta. Сейчас мы активно работаем над релизом, который будет включать, кроме прочего, поддержку видеосвязи! Если вы еще не видели...
Существуют сотни плагинов для Android Studio, и их число растёт с каждым днём. Это в основном происходит по двум причинам. Во-первых, Android Studio — это официальная интегрированная среда разр...
В далёком 2009 году Еврокомиссия признала, что Microsoft злоупотребляет монопольным положением на рынке операционных систем, поставляя свой браузер Internet Explorer в комплекте с Windows. Америк...