Привет! Меня зовут Седов Фёдор, я ученик 11 класса и выпускник «IT Школы Samsung» 2020 года. Мне предложили рассказать о своём опыте разработки мобильного приложения, моего первого большого проекта - блокнота для музыкантов (и поэтов). С этим проектом я одержал победу в нескольких конкурсах, а сейчас мечтаю, что у приложения появится много пользователей, которым оно будет помогать каждый день. На самом деле, Java, по настоянию одного мудрого джедая, стал моим первым языком программирования (ещё лет в 13). Однажды я даже пробовал Android, но страшные сообщения студии об ошибках и задыхающийся даже на Arch Linux ноутбук оттолкнули меня. Так оно и лежало, не вызывая никакого интереса, а потом в сентябре прошлого года я поступил в «IT Школу Samsung» на базе технопарка РТУ МИРЭА «Альтаир». За несколько лет до того у меня сложилось крайне негативное отношение к курсам, не ждал ничего хорошего и сейчас, но! Я оказался совсем не прав: и материал был хороший, и темп обучения высокий, и преподаватель Степанов Павел Валерьевич замечательный! А самое интересное, в завершение годового обучения — выпускная работа. Всё это позволило подступиться, понять и полюбить разработку под Android: это оказалось очень интересным — можно сделать всё, что захочется, и оно всегда будет под рукой. Теперь я планирую заниматься этим и в будущем, и я безумно благодарен всем-всем людям, которые дали мне эту возможность! Итак, к проекту! Моя идея была проста — взять много-много полезных для музыкантов, в том числе начинающих и любителей, инструментов, что раскиданы по разным приложениям и сайтам, и объединить в один. Очевидно, не один я до этого дошёл, но, проверив Play Market, обнаружил, что не так всё хорошо с существующими приложениями: некачественная реализация, неполный функционал, платные ограничения и реклама. В тоже время, судя по отзывам и своему опыту написания музыки, подобное приложение оказалось бы полезным, потому в январе начал двигаться в этом направлении. Я решил не изобретать велосипед и взял за основу Open Source-проект Simplenote, это позволило сэкономить время на разработке базового функционала, да и полученный результат, очевидно, был бы уже проверенного качества. Теперь, наконец, про то, что у меня получилось. Начну с описания того, что умеет приложение и как это было реализовано. Мне кажется, это всегда любопытно, даже если это не PiperNet. Wavenote - это приложение заметок для музыкантов. Основная цель — сделать удобным процесс написания и исполнения песен (чего позволяют добиться такие функции, как "поиск слов", "студия" и другие), но также оно будет полезно всем, кто занимается музыкой, поскольку содержит набор универсальных утилит. К примеру, если вы только начинаете играть на музыкальном инструменте или вам нужно исполнить незнакомую песню — в приложении есть специальный режим отображения, который упростит эту задачу и подскажет табулатуры при необходимости. А если вы преподаватель, то Wavenote поможет вам организовать учебный процесс: составьте заметку с теорией или заданиями — и с помощью функций экспорта и импорта, ученик сможет легко получить материалы в исходном виде (сохранив форматирование и медиа). Начнём с самого главного. В редакторе есть подсветка аккордов и ключевых слов. Это позволяет легче ориентироваться по форме (напоминает сайты с песнями). Здесь всё довольно просто: получаем слова из базы данных, ищем их в тексте, проверяем, отмечены ли они, если нет, применяем новый стиль с помощью Span. Если всё сделать правильно, получится такая красота: Она нужна, чтобы пользователь мог оформить заметку, что позволит легко по ней ориентироваться, и, к тому же, просто красиво. Тут не сильно сложней, за основу диалога взята библиотека ColorSheet, но впоследствии она была сильно изменена и переписана на Java. Сам же стиль применяется к тексту с помощью Spannable. Однако пришлось модифицировать html-парсер из библиотеки Android, поскольку он добавлял лишние строки, игнорировал шрифты, а на API 21 работал совсем иначе и не поддерживал множество тегов, например, совсем отказывался работать с “<font>”. Эта функция позволяет искать определения к слову, рифмы, синонимы, ассоциации и многое другое. Это очень помогает в сочинении слов для песни. В реализации всё просто и эффектно — формируем http-запрос к Datamuse API на основе заполненных полей, далее выполняем его, используя библиотеку okhttp, получаем json-ответ и генерируем из него результат. С этим интересней. Во-первых, сам подсчёт: если для русского языка нужна всего одна строчка кода, то с английским всё сложней. Основная идея алгоритма для английского получилась такая: проверяем слово по пяти основным правилам (в случае, если обнаружено соответствие, добавляем в счётчик), а после вычитаем из общего количества гласных. Это обеспечивает высокую точность, однако существует множество исключений из правил, поэтому алгоритм порой выдает ошибочный результат. Для устранения этого был создан специальный список в ресурсах. Возможно, в будущем следует сделать его модифицируемым (наподобие словаря ключевых слов), чтобы пользователи могли его корректировать, обнаружив ошибку. Реализовать эту функцию можно было также через вышеупомянутый сервис Datamuse. Однако в таком случае для её работы будет необходим интернет, а скорость выдачи результата значительно снизится. Главной сложностью здесь оказалось отображение количества слогов. Проблема в том, что цифры вводятся в отдельное поле, соответственно нужно как-то учесть отступы из текста заметки. С пустыми строками всё понятно — вместо 0 выводим пробел, а вот для строк, которые на экране занимают несколько, пришлось написать еще один алгоритм, добавляющий переносы в случае, если ширина строки больше ширины поля заметки. Для расчёта ширины строки был использован следующий метод: Первое — работа парсера. Сначала строка форматируется (убираются переносы и лишние пробелы), потом выполняются поиск и корректировка индексов аккордов, после текст разбивается на строки по этим индексам, таким образом мы получаем массив слов заметки без аккордов. Важно также считать порядок, в котором расположены слова и аккорды. Второе — интерфейс. В моём решении все элементы заносятся в 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: Ритм-игра DrumHero VR-игра AirAttack! Обзор лучших конкурсных проектов  Android Developer, Tinkoff Business