Это немного длинная история, как я написал свой первый гуанокод.
Меня долго агитировал начать потихоньку познавать программирование мой старый однокашник, который в итоге стал меня менторить(направлять) и уверенно склонять меня к python. За пару месяцев до карантина я всё-таки сдался и начал активно учиться на различных ресурсах, по итогу даже что-то начало получаться.
Листая пикабушечку, я натолкнулся на пост https://pikabu.ru/story/besplatno_obuchaem_pikabushnikov_pro... , в котором ребята помогали получать первичные знания по python. Несмотря на огромное количество ресурсов для изучения, они составили курс абсолютно так же, как учился я сам. Во время общения с ТС он начал убеждать меня, что этих знаний достаточно для «свободного плавания» фриланса, с чем я был в корне не согласен, ибо понимал, на каком дне сам нахожусь). И в этой переписке неожиданно появляется товарищ @dbrtbr и предлагает мне заказ. Исключительно из спортивного интереса я решил узнать подробности, даже не питая надежды, что я за это возьмусь.
Описание задачи от @dbrtbr
Я играю в Osu! иногда, это ритм игра такая, нужно нажимать кружочки под музыку. В игре есть карты, карта состоит из звуковой дорожки (отдельным мп3 файлом) и txt файла с координатами кружочков на плоскости и временными метками. В картах иногда попадаются сложные места, которые нужно тренировать отдельно, играть снова и снова чтобы научиться проходить. Всю карту из-за этого переигрывать слишком долго. В клиенте игры есть встроенный редактор карт, в нем сложное место можно вырезать, получиться новая коротенькая (скажем 10 секунд) карта. Но ее тоже нужно переигрывать снова и снова, каждый раз нажимать кнопку “Играть еще”
Мне нужна программа, которая автоматизирует процесс. Чтобы можно было указать время начала и конца нужного момента, и программа создаст новую карту, где этот элемент повторен 10-20 раз.
Создать новый txt файл легко, проблема с музыкой, из мп3 файла тоже нужно вырезать и повторить нужный момент нужное количество раз.
Тут я так понимаю нужно искать библиотеку для обработки музыки и париться с ней.
Звучит легко? Легко, вот я и взялся. На практике почти так и оказалось, за исключением, что у меня есть любимая работка, дорога на которую каждый день сжирает у меня 4 часа, да и стоимость программы я озвучил в треть от предложенной, ибо я прекрасно понимал, что получится гуанокостыль, работа над которым растянулась в итоге на месяц и то я считаю, что править надо еще многое.
И так погнали:
С osu! Я никогда не сталкивался, пришлось качать и пробовать поиграть «ЪУЪ!» я даже не понял как в ЭТО нормально играть. Пришлось лезть в их комьюнити, где аллилуйя, оказалась огромная русскоязычная ветка. Обрезку и зацикливание mp3 я сделал за один вечер сразу как вообще открыл PyCharm(IDE python).
Ну и всё))))). Потом я полез в текстовый файл конфигурации *.osu и вот там начались проблемы.
1. Как определять отрезок, который надо зациклить? Не по цифрам ведь в конфиге или таймеру?
2. Так как это РИТМ игра, то важно чтобы все игровые объекты (кружочки для тапа и тд), шли вовремя.
3. Вырезать и повторять строки, в которых указан отрезок можно, но в игре есть отдельные настройки ритма с метрономом для каждого участка песни. И как быть в этом случае.
4. Позже стало понятно, что отрезок нужно увеличивать в начале и конце, так как резкая смена на повторение не дает поймать ритм и играть невозможно.
5. Как запустить это чудо на стороннем компе. Да и вообще, как указывать и применять настройки и обеспечить юзабельность программы.
Как я всё это решал:
1) Посидев на форуме игры я понял как игроки сами создают вырезанные участки для одного повтора. Сам обрезал одну песню и начал сравнивать конфиги. И именно тут я узнал про проблему с ритмами.
2) В файле обрезался всего один параметр с игровыми объектами [HitObjects], в этом параметре указывается время в миллисекундах и другие настройки объекта. Но не изменился параметр с таймингом [TimingPoints]. Пришло понимание, что его нужно будет обрезать и зацикливать необходимый участок. Время начала и конца отрезка решил определять по минимальному и максимальному времени в параметре [HitObjects]
3) Определив точки среза, я мог понять, где и какой участок в параметре [TimingPoints], нужно оставлять, а какой зацикливать.
4) Нарезку делал с помощью pydub, на удачу в нем оказались методы для уменьшения и увеличения громкости. Но отрезок делается точно по первой и последней точке, поэтому, расширив отрезок, можно добавить интервал и на него же положить затухание и подъем громкости.
5) Т.к. создавать тренировочную карту пользователь будет сам, я сделал так что, программа делает поиск по подпапкам находит файлы расширения .osu c пометкой [train] в названии и на основе этого конфига высчитывает точки срезов и остальные параметры, а так же создает mp3 с зацикленными срезами. С помощью pyinstaller получилось подтянуть все зависимости и создать один .exe файл, запустив который выполняется программа без необходимости наличия интерфейса.
ВЫВОДЫ:
1) Выполнить поставленную задачу у меня получилось, но из-за работы это сильно растянулось.
2) Пришлось потратить много времени не на код, а на изучение игры и на продумывание реализации.
3) Это было относительно не сложно, но результат далек от идеала.
4) Я получил БЕСЦЕННЫЙ опыт и удовольствие от выполненной работы, немного набил руку в программировании и написал свой первый гуанокод.
5) появился огромный простор для апгрейда написанной программы.
6) Хочется больше времени уделять программированию, даже пытался искать место куда возьмут стажером, но пока безуспешно. Скорее всего пока займусь реализацией своей задумки на железе OrangePi.
Ссылка на GitHub