Skip to content

Repository files navigation

SoLyP

🌐 English version

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

[Припев]
Припев строка

MIDI-ноты (по умолчанию)

Нота (октава 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. Публикую в открытом доступе — пользуйтесь, форкайте, дорабатывайте.

К сожалению, в данный момент я нахожусь в крайне сложной жизненной ситуации, и любая поддержка для меня жизненно необходима. Если проект оказался для вас полезным — пожалуйста поддержите донатом или воспользуйтесь предложением по ссылке. Это очень помогает не только продолжать разработку, но и время от времени прерывать чувство голода.

Спасибо, что вы здесь. 🙏


Лицензия

MIT.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages