{
  "version": "1.0",
  "how_to_use": "Грейд применяется ОДИН раз, к базовому визуальному ряду, до прожига субтитров. Дважды наложенный грейд удваивает контраст и убивает тени.",
  "order_of_operations": [
    "1. Приведение к канвасу (scale/crop) — иначе грейд считается по лишним пикселям.",
    "2. Грейд.",
    "3. Зерно/виньетка, если нужны.",
    "4. Прожиг субтитров — поверх готовой картинки."
  ],
  "verification": "Каждый грейд проверяется на реальном кадре с лицом и на кадре с текстом. scripts/apply_grade.py --contact-sheet делает сравнение до/после.",
  "grades": [
    {
      "id": "neutral_clean",
      "label": "Нейтральная база",
      "use": "Честная картинка без стилизации. Отправная точка для любого грейда.",
      "filter": "eq=contrast=1.03:brightness=-0.005:saturation=1.02:gamma=0.99",
      "warnings": []
    },
    {
      "id": "teal_orange",
      "label": "Тил-оранж",
      "use": "Кинематографический контраст кожи и фона. Универсальный «дорогой» вид.",
      "filter": "colorbalance=rs=0.04:gs=-0.01:bs=-0.05:rm=0.02:bm=-0.03:rh=-0.03:bh=0.05,eq=contrast=1.10:saturation=1.06:gamma=0.97,curves=r='0/0.02 0.5/0.52 1/1':b='0/0.04 0.5/0.48 1/0.97'",
      "warnings": [
        "Кожа не должна уходить в оранжевый пластик — проверь лицо крупным планом."
      ]
    },
    {
      "id": "warm_film",
      "label": "Тёплая плёнка",
      "use": "Мягкий тёплый негатив: интервью, история, воспоминание.",
      "filter": "colorbalance=rs=0.05:bs=-0.04:rm=0.03:bm=-0.02,eq=contrast=1.04:saturation=0.96:gamma=1.02,curves=all='0/0.05 0.5/0.5 1/0.96'",
      "warnings": [
        "Поднятый чёрный — это стиль; на OLED он выглядит как засветка, проверь на телефоне."
      ]
    },
    {
      "id": "cold_tech",
      "label": "Холодный техно",
      "use": "Синеватый контраст: техника, IT, ночной город.",
      "filter": "colorbalance=rs=-0.04:bs=0.06:rm=-0.02:bm=0.04,eq=contrast=1.12:saturation=0.94:gamma=0.96",
      "warnings": [
        "Кожа легко зеленеет — если в кадре лицо, уменьшай gs."
      ]
    },
    {
      "id": "moto_punch",
      "label": "Мото-панч",
      "use": "Жёсткий контраст и насыщенность: скорость, дорога, спорт.",
      "filter": "eq=contrast=1.14:saturation=1.16:gamma=0.96,unsharp=5:5:0.8:5:5:0.0,colorbalance=rs=0.03:bs=-0.02,curves=all='0/0.012 0.5/0.5 1/1'",
      "warnings": [
        "Контраст снижен с 1.18 до 1.14: на 1.18 тени тестового кадра уходили в клип."
      ]
    },
    {
      "id": "soft_pastel",
      "label": "Мягкая пастель",
      "use": "Низкий контраст, светлая палитра: лайфстайл, красота, еда.",
      "filter": "eq=contrast=0.94:brightness=0.02:saturation=0.92:gamma=1.06,curves=all='0/0.08 0.5/0.54 1/0.98'",
      "warnings": []
    },
    {
      "id": "high_key_clean",
      "label": "Хай-кей",
      "use": "Светло, чисто, много воздуха: продукт на白 фоне, презентация.",
      "filter": "eq=contrast=1.0:brightness=0.05:saturation=1.0:gamma=1.08,curves=all='0/0.03 0.25/0.32 0.75/0.82 1/1'",
      "warnings": []
    },
    {
      "id": "noir_contrast",
      "label": "Нуар",
      "use": "Почти монохром с сохранённым тоном кожи: драма, серьёзная тема.",
      "filter": "eq=contrast=1.16:saturation=0.32:gamma=0.96,curves=all='0/0.02 0.5/0.45 1/0.99'",
      "warnings": [
        "Насыщенность 0.32 оставляет тон кожи; ниже 0.2 лицо станет серым."
      ]
    },
    {
      "id": "vhs_camcorder",
      "label": "VHS-камкордер",
      "use": "Ретро-видео: мягкая картинка, смещение каналов, шум.",
      "filter": "eq=contrast=1.06:saturation=1.12:gamma=1.03,rgbashift=rh=2:bh=-2,gblur=sigma=0.6,noise=alls=8:allf=t",
      "warnings": [
        "Шум и размытие съедают читаемость субтитров — прожигай титры ПОСЛЕ грейда."
      ]
    },
    {
      "id": "night_city",
      "label": "Ночной город",
      "use": "Глубокие тени, вытянутые огни, холодная база с тёплыми акцентами.",
      "filter": "eq=contrast=1.10:saturation=1.10:gamma=0.94,colorbalance=rs=-0.03:bs=0.05:rh=0.04:bh=-0.02,curves=all='0/0.015 0.35/0.30 0.7/0.76 1/1'",
      "warnings": [
        "Тени подняты на 1.5% специально: без этого тёмный кадр уходит в чистый чёрный."
      ]
    },
    {
      "id": "documentary_flat",
      "label": "Документальный флэт",
      "use": "Минимум вмешательства, максимум информации в тенях.",
      "filter": "eq=contrast=0.98:saturation=0.98:gamma=1.04,curves=all='0/0.04 0.5/0.5 1/0.97'",
      "warnings": []
    },
    {
      "id": "print_editorial",
      "label": "Редакционная печать",
      "use": "Как журнальная страница: чистый белый, плотный чёрный, спокойный цвет.",
      "filter": "eq=contrast=1.08:saturation=0.9:gamma=1.0,curves=all='0/0.01 0.2/0.2 0.8/0.83 1/1',unsharp=3:3:0.4",
      "warnings": []
    },
    {
      "id": "kodak_2383_print",
      "label": "Kodak 2383 — голливудская печать",
      "use": "Тёплый контрастный принт: плотный чёрный, бирюзовая тень, янтарный свет. Постановка, продукт, финал.",
      "filter": "curves=all='0/0.02 0.25/0.21 0.75/0.83 1/0.98':b='0/0.05 0.5/0.49 1/0.93',colorbalance=rs=-0.03:bs=0.06:rm=0.02:bm=-0.02:rh=0.05:bh=-0.04,eq=contrast=1.18:saturation=1.12:gamma=0.98",
      "warnings": [
        "Плотный чёрный съедает детали в тёмной одежде — проверь кадр на тёмном фоне.",
        "На кожу ложится янтарь: если лицо уходит в пластик, снижай --strength, а не насыщенность."
      ]
    },
    {
      "id": "fuji_eterna_soft",
      "label": "Fuji Eterna — мягкий пастельный",
      "use": "Молочный подъём чёрного и зелёные средние тона. Лирика, лайфстайл, спокойный разговор.",
      "filter": "curves=all='0/0.06 0.25/0.27 0.8/0.82 1/0.95':g='0/0.02 0.5/0.52 1/0.99',colorbalance=rs=-0.04:gs=0.03:bs=0.05:gm=0.03:rh=0.02,eq=contrast=1.04:saturation=0.94:gamma=1.03",
      "warnings": [
        "Поднятый носок кривой — это и есть весь look. Выровняешь его контрастом — останется просто блёклая картинка."
      ]
    },
    {
      "id": "kodak_portra_skin",
      "label": "Kodak Portra — тёплый негатив под кожу",
      "use": "Мягкий тёплый негатив, выгодный для лица. Портрет, интервью, говорящая голова.",
      "filter": "curves=all='0/0.045 0.5/0.51 1/0.965':r='0/0.02 0.5/0.53 1/1':b='0/0.03 0.5/0.48 1/0.96',colorbalance=rs=0.03:gs=-0.02:bs=-0.01:rm=0.03:gm=-0.01:rh=0.04:bh=-0.03,eq=contrast=1.05:saturation=1.02:gamma=1.01",
      "warnings": [
        "Проверяй по лицу, а не по фону: если кожа краснеет, а не теплеет, значит ушло в красный вместо оранжевого."
      ]
    },
    {
      "id": "bleach_bypass",
      "label": "Bleach bypass — металл и контраст",
      "use": "Обесцвеченный жёсткий контраст. Драма, техно, «серьёзно».",
      "filter": "curves=all='0/0 0.2/0.13 0.8/0.9 1/1',eq=contrast=1.32:saturation=0.55:gamma=0.97,colorbalance=gs=0.02:bs=0.03:rh=0.02",
      "warnings": [
        "Обесцвеченная кожа быстро выглядит больной — не опускай saturation ниже 0.5.",
        "Контраст 1.32 клиппит света: смотри контрольный кадр, а не только процент чёрного."
      ]
    }
  ],
  "extras": {
    "vignette": {
      "filter": "vignette=angle=PI/5",
      "use": "Мягкое затемнение краёв, тянет взгляд в центр."
    },
    "grain_light": {
      "filter": "noise=alls=5:allf=t",
      "use": "Лёгкое зерно, скрывает бандинг на градиентах."
    },
    "grain_film": {
      "filter": "noise=alls=12:allf=t+u",
      "use": "Плёночное зерно, заметное."
    },
    "sharpen_web": {
      "filter": "unsharp=5:5:0.6:5:5:0.0",
      "use": "Компенсация мягкости после ресайза вниз."
    },
    "bloom_soft": {
      "filter": "split[a][b];[b]gblur=sigma=18,curves=all='0/0 0.7/0.55 1/1'[bl];[a][bl]blend=all_mode=screen:all_opacity=0.25",
      "use": "Свечение в светах: премиальная мягкость. Это цепочка с split — вставляй как отдельный шаг."
    }
  },
  "tuning_note": "Кривые подобраны так, чтобы на реальном тёмном кадре в чистый чёрный уходило меньше 1.5% пикселей. apply_grade.py проверяет это измерением и предупреждает, если конкретный материал всё равно выбивает тени.",
  "method": {
    "order": [
      "1. Сначала смотри, потом крути. Нормализация — экспозиция и баланс белого — идёт до всего остального: look поверх паразитного оттенка просто запекает этот оттенок в картинку.",
      "2. Первичка: точки чёрного и белого, контраст, насыщенность.",
      "3. Согласование планов: каждый кадр догоняется к герою по числам, а не на глаз.",
      "4. Вторичка: отдельные оттенки — кожа, небо, зелень.",
      "5. Look: расщепление тона и/или плёночная кривая.",
      "6. Проверь заново: точки у 0 и 1 без грубого клиппинга, баланс нейтрален, если тон не задуман."
    ],
    "film_without_lut": "LUT всего лишь замораживает набор движений по кривым и колёсам. Любой из них собирается руками, и порядок имеет значение: носок и плечо тональной кривой, затем перекрёстное влияние каналов (оттенок обязан меняться вместе с яркостью — именно это отличает эмуляцию плёнки от «S-кривой с подкраской»), затем расщепление тона, затем лепка насыщенности, и только в конце поворот оттенков не больше чем на 8°.",
    "source": "Метод взят из скилла palmier color-grading (D:/montage/tools/palmier-skills) и переложен на фильтры ffmpeg. Там он описан под инструменты Palmier Pro с их скопами; здесь роль скопов выполняет apply_grade --contact-sheet и отчёт по уходу пикселей в чистый чёрный."
  }
}