SoLyP (Song Lyrics Prompter) — VST3/Standalone MIDI-промптер текста песен: прокручивай текст по MIDI-нотам, управляй транспортом, переключай секции. Плагин для DAW или отдельное приложение.
🛠 Создано в рамках освоения vibecoding в оболочке OpenCode ☕ Если проект вам полезен — поддержите автора
SoLyP загружает текст песни (JSON или plain text с секциями [Купет], [Припев]), разбивает на строки по ширине окна и прокручивает его в ритме песни. Управление — MIDI-нотами: Play, Pause, Stop, отсчёт 3-2-1, переключение секций. Работает как VST3-плагин в DAW (Ableton, Reaper и др.) или как Standalone-приложение.
# 1. Клонировать
git clone https://github.com/devZu9/SoLyP.git && cd SoLyP
# 2. Настроить CMake (MSVC)
cmake -B build -DCMAKE_BUILD_TYPE=Debug
# 3. Собрать
cmake --build build --config Debug
# 4. Запустить Standalone
.\build\SoLyP_artefacts\Debug\Standalone\SoLyP.exeТребования: CMake 3.24+, MSVC (Windows) или Clang/Xcode (macOS), JUCE 8.0.6 (скачивается автоматически через FetchContent).
# Собрать тесты (входят в основную сборку)
cmake --build build --config Debug --target SoLyP_Tests
# Запустить через CTest
ctest --test-dir build -C Debug
# Или напрямую
.\build\SoLyP_Tests_artefacts\Debug\SoLyP_Tests.exeТесты покрывают: TransportState-машину (Play/Pause/Stop/Countdown/Section), Song (парсинг JSON/text, сериализация, перенос строк), MidiManager (парсинг MIDI-нот), APVTS save/load, SettingsManager (lineSpacingInt, миграция).
| Фича | Описание |
|---|---|
| VST3 + Standalone | Один таргет — два формата. Плагин для DAW или отдельное окно |
| MIDI-управление | 7 команд: Play, Pause, Stop, Countdown 3-2-1, NextSection, Hybrid, Landmark |
| Темы | JSON-темы: цвета, отступы, шрифты. resources/themes/ |
| i18n | Русский + English. JSON-локали: resources/langs/ |
| Автосохранение | Настройки (окно, слайдеры, MIDI-ноты) сохраняются в %USERPROFILE%\Documents\SoLyP\settings.json |
| Отсчёт | 3-2-1 с полоской прогресса, не запускает Play автоматически |
| Секции | Прыжки по секциям, Hybrid-режим (секция + Play), Landmark (MIDI-якорь) |
| Слот-модель | Каждая строка хранит свой Y — никаких scrollOffset и формул пересчёта |
| FastImage | На паузе текст захватывается как изображение и уезжает, предстроки крутятся отдельно |
Source/
├── Logic.cpp / .h # AudioProcessor, TransportState-машина, APVTS, MIDI
├── Display.cpp / .h # AudioProcessorEditor, отрисовка текста, таймеры
├── Slot.h # struct Slot { text; y }
├── Data/
│ ├── Song.cpp / .h # Песня: fromJson, fromText, toJson, rebuildDisplayLines
│ ├── SettingsManager.cpp / .h # Настройки: save/load JSON
│ └── I18n.cpp / .h # Интернационализация
├── Midi/
│ └── MidiManager.cpp / .h # Парсинг MIDI-нот → команды
├── UI/
│ ├── Display/ # DisplayCallbacks, DisplayActions, DisplayHelpers
│ ├── ControlsPanel # Панель управления (кнопки, слайдеры)
│ ├── LeftPanel # Левая панель (секции, статус)
│ ├── SettingsComponent # Компонент настроек
│ ├── Theme # Темы (JSON, цвета)
│ └── icons/ # SVG-иконки, app_icon.ico
└── Standalone/
└── StandaloneMain.cpp # Точка входа Standalone
JSON:
{
"title": "Моя песня",
"song": [
{ "section": "Куплет", "lines": ["Строка 1", "Строка 2"] },
{ "section": "Припев", "lines": ["Припев строка"] }
],
"legends": [ { "section": "Куплет", "note": "C1" } ],
"settings": { "preLinesOnPause": 2 }
}Plain text:
[Куплет]
Строка 1
Строка 2
[Припев]
Припев строка
| Нота (октава 2) | Команда |
|---|---|
| C (0) | Play |
| D (2) | Pause |
| E (4) | Next Section |
| F (5) | Hybrid (Section + Play) |
| G (7) | Countdown 3-2-1 |
| A (9) | Stop |
| Октава 1 (любая нота) | Landmark (якорь секции) |
| Файл | О чём |
|---|---|
| SUMMARY.md | Документация текущего состояния (скролл, пауза, отсчёт, секции) |
| CHANGELOG.md | История изменений по версиям |
| ROADMAP.md | План развития |
| SESSIONS.md | Логи сессий разработки |
| AGENTS.md | Инструкции для ИИ-ассистентов |
Этот проект создан для собственных нужд в рамках изучения vibecoding на платформе OpenCode. Публикую в открытом доступе — пользуйтесь, форкайте, дорабатывайте.
К сожалению, в данный момент я нахожусь в крайне сложной жизненной ситуации, и любая поддержка для меня жизненно необходима. Если проект оказался для вас полезным — пожалуйста поддержите донатом или воспользуйтесь предложением по ссылке. Это очень помогает не только продолжать разработку, но и время от времени прерывать чувство голода.
- ☕ Donation — поддержать автора: https://dalink.to/miska_moloka
- 🚀 OpenCode — платформа для vibecoding: https://opencode.ai/go?ref=DHSKBMGTK0
Спасибо, что вы здесь. 🙏
MIT.