# config.py

PRESETS = {
    # --- СТАНДАРТНЫЕ ПРЕСЕТЫ ---
    # 75% перекрытие (hop = N_FFT / 4)
    "75p_n512":   {"N_FFT": 512,  "HOP_LENGTH": 128},
    "75p_n1024":  {"N_FFT": 1024, "HOP_LENGTH": 256},
    "75p_n2048":  {"N_FFT": 2048, "HOP_LENGTH": 512},
    "75p_n4096":  {"N_FFT": 4096, "HOP_LENGTH": 1024},
    "75p_n8192":  {"N_FFT": 8192, "HOP_LENGTH": 2048},

    # 87.5% перекрытие (hop = N_FFT / 8)
    "87p_n256":   {"N_FFT": 256,  "HOP_LENGTH": 32},
    "87p_n512":   {"N_FFT": 512,  "HOP_LENGTH": 64},
    "87p_n1024":  {"N_FFT": 1024, "HOP_LENGTH": 128},
    "87p_n2048":  {"N_FFT": 2048, "HOP_LENGTH": 256},
    "87p_n4096":  {"N_FFT": 4096, "HOP_LENGTH": 512},

    # --- ПРЕСЕТЫ ДЛЯ JPEG-СЖАТИЯ ---
    "jpeg_n256_75p":  {"N_FFT": 256,  "HOP_LENGTH": 64},
    "jpeg_n512_75p":  {"N_FFT": 512,  "HOP_LENGTH": 128},
    "jpeg_n512_87p":  {"N_FFT": 512,  "HOP_LENGTH": 64},
    "jpeg_n1024_87p": {"N_FFT": 1024, "HOP_LENGTH": 128},

    # --- ПРЕСЕТЫ ДЛЯ WebP-СЖАТИЯ ---
    "webp_n128_75p":  {"N_FFT": 128,  "HOP_LENGTH": 32},
    "webp_n128_87p":  {"N_FFT": 128,  "HOP_LENGTH": 16},
    "webp_n256_75p":  {"N_FFT": 256,  "HOP_LENGTH": 64},
    "webp_n256_87p":  {"N_FFT": 256,  "HOP_LENGTH": 32},
    "webp_n512_87p":  {"N_FFT": 512,  "HOP_LENGTH": 64},

    # --- ПРЕСЕТЫ ДЛЯ AVIF-СЖАТИЯ ---
    "avif_n128_75p":  {"N_FFT": 128,  "HOP_LENGTH": 32},
    "avif_n128_87p":  {"N_FFT": 128,  "HOP_LENGTH": 16},
    "avif_n256_75p":  {"N_FFT": 256,  "HOP_LENGTH": 64},
    "avif_n256_87p":  {"N_FFT": 256,  "HOP_LENGTH": 32},
    "avif_n512_87p":  {"N_FFT": 512,  "HOP_LENGTH": 64},

    "custom":  {"N_FFT": 4096, "HOP_LENGTH": 2048},
}

DEFAULT_CONFIG = {
    # --- ФАЙЛЫ ---
    "mp3_file": "track.mp3",          # Входной аудиофайл (MP3 или WAV)
    "active_preset": "75p_n4096",     # Пресет из PRESETS: размер FFT и длина хопа
    
    # --- ДИАПАЗОН ОБРАБОТКИ ---
    "trim_enabled": True,             # Включить обрезку трека по времени
    "trim_start": 60.0,                 # Начало обрабатываемого фрагмента в секундах
    "trim_end": 130.0,                   # Конец обрабатываемого фрагмента (0 = до конца трека)
    
    # --- НАСТРОЙКИ ФОРМАТА ИЗОБРАЖЕНИЯ ---
    "output_format": "jpeg",          # Формат: "png", "webp", "jpeg"/"jpg", "avif"
    "output_quality": 5,              # Качество для webp/jpeg/avif (1-100). Для PNG: уровень сжатия (1-9)
    "output_lossless": False,         # Lossless-режим для webp и avif

    # --- ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ AVIF ---
    "avif_speed": 0,                    # Скорость кодирования AVIF (0-10, 0 = лучшее сжатие)
    "avif_subsampling": "4:2:0",        # Цветовая субдискретизация: "4:4:4", "4:2:2", "4:2:0"
    
    # --- МАСШТАБИРОВАНИЕ ИЗОБРАЖЕНИЯ ---
    "scale_enabled": False,           # Включить масштабирование спектрограммы
    "scale_x": 2,                     # Масштаб по ширине (деление: 2 = в 2 раза уже)
    "scale_y": 1,                     # Масштаб по высоте (деление: 2 = в 2 раза ниже)
    "scale_method": "lanczos",        # Метод интерполяции: "lanczos", "bilinear", "bicubic", "nearest"
    
    # --- ПАРАМЕТРЫ ГЕНЕРАЦИИ ФАЗЫ ---
    "phase_generate_iterations": 5000,   # Число итераций Griffin-Lim (больше = точнее, но медленнее)
    "phase_generate_random_seed": 454,    # Seed для воспроизводимости (-1 = случайный)
    "griffin_lim_mode": "fast",     # Режим Griffin-Lim: "standard", "fast", "multi_scale"
    "griffin_lim_parallel": True,       # Параллельная обработка Mid/Side (ускорение ~2x)
    
    # --- РАННЯЯ ОСТАНОВКА (early stopping) ---
    "early_stop_enabled": True,         # Включить раннюю остановку
    "early_stop_threshold": 0.0001,     # Минимальное улучшение ошибки для продолжения
    "early_stop_patience": 10,          # Сколько итераций ждать улучшения перед остановкой
    
    # --- ПАРАМЕТРЫ MULTI-SCALE РЕЖИМА ---
    "multi_scale_factor": 2,            # Фактор уменьшения для грубого этапа (2, 4, 8)
    "multi_scale_coarse_iterations": -1, # Итераций на грубом этапе (-1 = все итерации)
    "multi_scale_fine_iterations": 400,   # Итераций на точном этапе (-1 = половина от общего)
    
    # --- ОБРЕЗКА НИЗКИХ ЧАСТОТ (убирает инфразвук и DC) ---
    "low_cut_enabled": True,            # Включить обрезку низких частот
    "low_cut_freq": 0,                 # Частота среза снизу в Гц (рекомендуется 20-100)
    
    # --- ОБРЕЗКА ВЫСОКИХ ЧАСТОТ (экономия места) ---
    "high_cut_enabled": True,           # Включить обрезку высоких частот
    "high_cut_mode": "auto",            # "auto" - автоматический срез по спаду энергии
                                        # "manual" - ручная установка частоты
    "high_cut_freq": 16000,             # Частота среза сверху в Гц (для manual режима)
    "high_cut_auto_threshold_db": -80,  # Порог энергии для автосреза (тише этого = обрезаем)
    "high_cut_auto_freq_min": 8000,     # Минимальная частота, выше которой ищем спад
    "high_cut_auto_margin_db": 10,      # Запас над порогом для надёжности среза

    "data_dir": "data",                 # Папка для выходных файлов
}