Pull to refresh
101.12

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

Reading time7 min
Views5.7K

Привет! Меня зовут Седов Фёдор, я ученик 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

От редакции

Другие наши материалы о проектах учеников IT Школы Samsung:

Tags:
Hubs:
Total votes 8: ↑8 and ↓0+8
Comments0

Articles

Information

Website
www.samsung.com
Registered
Founded
1938
Employees
Unknown
Location
Южная Корея