Найти тему
ZDG

Музыкальный ретро-плеер на Rust

Начало здесь:

и здесь:

В общем, я дописал парсер музыки. Всё это делается полукустарным способом, так как нужно пока только для игры GMO Apple, а сама музыка достаточно простенькая.

Итак, я беру ноты из музыкального редактора:

И просто руками переношу их в текстовый файл:

-2

Это довольно легко и просто. Затем с помощью написанного на PHP парсера преобразую данное текстовое представление в статически инициализированные структуры на Rust:

-3

Здесь вместо названий нот уже подставлены конкретные звуковые частоты. Числа такие большие, потому что умножаются на 10000, чтобы привести дробные числа к целым (мне больше нравится работать с целыми).

В каждом паттерне по три дорожки, это два голоса и ударные.

Далее я просто усовершенствовал программу из прошлой части, а именно её функцию callback():

-4

Если раньше она генерировала однотонный звук, то теперь во-первых воспроизводит конкретные частоты нот, а во-вторых делает это сразу в 3-х каналах. А также осуществляет чтение следующих нот по мере воспроизведения.

Чтобы свести вместе каналы воспроизведения, их значения сэмплов просто складываются, а затем делятся на количество каналов. Получается типа среднее. Но здесь я испытал некоторое затруднение.

По идее, выбранный формат данных подразумевает значения сэмплов от -1 до 1, но похоже, что это не совсем работает и допускаются значения и больше. В то же время если использовать 0.5 вместо 1, то мы не получим звук в 2 раза тише – на слух он вообще никак не меняется. Чтобы он стал тише, делить надо аж на 10 и больше. Поэтому я делю суммарный семпл не на количество каналов, а на 12. Что там за механизм работает, пока не знаю. Может там шкала в децибелах или типа того.

Далее, для дорожки ударных применён хак: я считаю, что это дорожка с индексом 2, и для неё сэмплы считаются не исходя из частоты ноты, а просто рандомно. В результате получается резкий шум, напоминающий удар барабана. Это как раз вот тут:

-5

По-хорошему нужно каждой дорожке назначать свой тип генератора. Это может быть и шум, и квадратная волна, и треугольная, и синусоидальная, и готовые сэмплы, которые берутся из WAV-файла. Но пока просто хак.

Музыка в принципе звучит весьма годно, без каких-либо огрех. Послушать, что получилось, можно, если скачать и скомпилировать файлы проекта. Я положил их на github:

rust-music-tracker/src at main · nandakoryaaa/rust-music-tracker

Ну или можете послушать/посмотреть видео:

Впоследствии сделаю уже нормальный модуль и внедрю его в игру.