Приветствую, Пикабу! В своём первом посте хочу поделиться каверами на саундтреки из визуальной новеллы Бесконечное Лето для системной пищалки.
Несмотря на тематику сообществ программистов и БЛ, думаю, послушать интересно будет всем.
Расскажу немного о процессе создания (без технических подробностей - всё-таки, статья не о том, а исходные коды вы всегда сможете посмотреть по ссылке внизу).
Написал их далёким летом 2015го под впечатлением от визуальной новеллы Бесконечное Лето.
В качестве языка и среды разработки выбрал Delphi - на тот момент мой основной инструмент.
Управление пищалкой осуществляется через порты ввода-вывода, доступ к которым для простых приложений закрыт - нужен драйвер. Выбор пал на подписанный и свободный WinRing0 с готовым функционалом для чтения\записи портов ввод-вывода. Итог - простенький синтезатор-клавиатура:
Извлечение звука - процесс нехитрый: направить вывод тактового генератора на пищалку, задать генератору делитель базовой частоты и включить звук - за это отвечают три порта с номерами 0x61, 0x42 и 0x43. Но как передать нотный текст, не тратя часы на подгонку таймингов и частот? Было решено написать синтезатор, переводящий понятные человеку текстовые нотные обозначения в частоты и паузы.
В итоге получился синтезатор, позволяющий играть стаккато, легато и нон-легато, играть триоли и квинтоли, а также эмулировать форшлаги и морденты - в простой и удобной текстовой записи в формате "AA:BB", где AA - модификатор (длительность и стиль), BB - нота.
Пример: "!E:D3 E:0 E3:C1 E3:D1 E3:C1" - стаккато Ми третьей октавы, восьмая пауза и триоль из восьмых До-Ми-До первой октавы.
Одноголосный синтезатор - хорошо, но можно ли на монофонической пищалке играть аккорды? Можно. Для этого сделаем интересный трюк: если очень-очень быстро переключать ноты - для слушателя это будет очень похоже на аккорд, и чем выше частота переключения - тем "однороднее" звук. На этом этапе столкнулся с необходимостью жёстко выдерживать тайминги, засекать время и выдерживать паузы с точностью до наносекунд. Так как системный Sleep начинает плыть уже на единицах миллисекунд (спасибо планировщику), пришлось писать свою реализацию задержек на ассемблере. Собрав всё вместе, получил многоканальный синтезатор, где в каждом канале идёт своя линейка нот, и синтезатор очень быстро переключается между ними.
Синтезатор готов. Осталось "всего ничего" - перевести саундтрек в ноты. Часть треков удалось найти нотами для Guitar Pro (часть из них пришлось переписать), часть подбирал на слух, и вот результат:
То, что получилось, предлагаю оценить и вам.
Оригинальные треки:
Between August and December - Blow With The Fires
Between August and December - Lightness
Between August and December - Sayonara Cruel World
Sergey Eybog - A Promise From Distant Days
Sergey Eybog - Everlasting Summer
Sergey Eybog - Forest Maiden
Sergey Eybog - I Don't Blame You
Sergey Eybog - Let's Be Friends (Lena Theme)
Sergey Eybog - Memories
Sergey Eybog - Mystery Girl
Sergey Eybog - Trapped In Dreams
Ссылки:
Готовые бинарники ([1ch] - одноканальные версии, [2ch] - двухканальные): https://www.dropbox.com/s/1y8zx7ug7jv7u2v/%5BBeeSynth%5D%20E...
Исходники: https://www.dropbox.com/s/dlr3862gfdmcd2o/%5BBeeSynth%5D%20S...
Синтезатор-клавиатура и его исходники: https://www.dropbox.com/s/2bje6sd49ennzif/Beeper%20Synthesiz...
Исходники WinRing0: https://www.dropbox.com/s/t9z7u6ovm3v9yj7/WinRing0.zip?dl=0
Если кого-то заинтересует техническая сторона - рад буду обсудить в комментариях или в вк: https://vk.com/id23507301
И, если пост и тема понравятся, в следующий раз напишу про воспроизведение на пищалке настоящей музыки - WAV-файлов.