# Тоны и шумы сердца: как звучат клапанные пороки

Дата: 13.10.2026
Статус: принята автономно (владелец 12.10.2026: «Все автономно»). Issue: #298.
Связано: часы сердца `2026-10-11-stage-2-heart-clock.md` (тоны S1 и S2 по кнопке), интерактив в статьях `2026-10-12-article-interactivity.md`. Источники: `/mnt/project-files/evidence/heart-murmurs.md` (дальше [E]), каждая цитата сверена скриптом с текстом страницы.

## Зачем

Владелец спросил, как звучат клапанные шумы. Статьи о пороках описывают шум словами («грубый систолический шум изгнания»), но услышать его на сайте нельзя. Нужен плеер, который проигрывает нормальные тоны и шумы пяти частых клапанных пороков, показывает, в какой момент цикла звучит шум, и объясняет, где его слушает врач.

## Что видит и слышит читатель

Страница `/<locale>/heart-sounds/` и компонент статьи `<HeartSounds sound="…" />`.

- Переключатель: «Норма», «Аортальный стеноз», «Аортальная недостаточность», «Митральный стеноз», «Митральная недостаточность», «Пролапс митрального клапана». В статье переключатель только из «Нормы» и болезни статьи, чтобы сравнить.
- Схема одного сердечного цикла (фонокардиограмма): S1, S2, систола и диастола подписаны, форма шума нарисована (нарастающе-убывающий ромб, убывающий клин, плато), щелчки и тон открытия отмечены чертой. Схема статичная и понятна без звука.
- Кнопка «Слушать». Звук только по нажатию, без автозапуска; `AudioContext` создаётся в обработчике нажатия, как у часов сердца. Пока звук играет, по схеме бежит курсор, синхронный со звуком. При `prefers-reduced-motion` или выключенном движении на сайте курсор не двигается, звук играет.
- Под схемой текст: в какой фазе шум, его форма и тембр, где лучше слышен и куда проводится, со ссылками на источники. Текст есть у каждого варианта, поэтому без звука и для экранного диктора ничего не теряется.
- Заметка над плеером: звук синтезирован по описанию из руководств, это схема для обучения, а не запись пациента и не инструмент для диагностики; врачом не проверено. Ставить диагноз по такому звуку нельзя; что порок подтверждают эхокардиографией, уже сказано в статьях о пороках, плеер это не повторяет.

## Источник звука: синтез, а не записи

Выбран синтез через Web Audio. Почему:

- звук должен идти в такт с часами сердца при любой частоте; запись живёт со своей частотой и не синхронизируется с моделью;
- записи с понятной лицензией (CC0, CC BY) и подписанным диагнозом по каждому из пяти пороков не нашлись: записи в MSD (Jules Constant) защищены авторским правом, наборы PhysioNet размечают «шум есть или нет», а не порок; Wikimedia Commons не ответил (лимит запросов) и в прошлых поисках проекта подходящих файлов не дал;
- синтезированный звук — наш код (MIT), лицензия и авторство не вызывают вопросов.

Синтез честно подписан как схематичный. Высота звуков завышена, чтобы их было слышно на динамиках телефона (как у тонов часов сердца, допущение этапа 2).

## Что звучит: факты и допущения

Время берётся из часов сердца (`createHeartClock`, пресет «Норма», `beatTiming`): S1 на пике R (`rPeak`, закрытие митрального), начало изгнания `ejectionStart`, S2 в `aorticClosure`, конец удара — начало следующего зубца P. Частота плеера 60 в минуту: при ней фазы длиннее и шум легче различить (`assumption:`).

| Вариант | Что слышно | Источник [E] | Допущения модели |
|---|---|---|---|
| Норма | S1 и S2, «тук-тук» | MSD Cardiac Auscultation | тембр тонов как у часов сердца |
| Аортальный стеноз | Шум изгнания в середине систолы, нарастающе-убывающий, грубый; слышен у правого и левого верхнего края грудины, проводится на ключицу и сонные артерии; II тон ослаблен | MSD AS; Минздрав 37_2 | шум от `ejectionStart` до 20 мс перед S2, пик на середине; грубость = широкая полоса шума; S2 тише обычного вдвое; тяжёлую форму с поздним пиком не рисуем |
| Аортальная недостаточность | Вскоре после II тона убывающий диастолический шум, высокий, «дующий»; громче всего в III–IV межреберье слева от грудины или на верхушке, у наклонившегося вперёд на выдохе | MSD AR; Минздрав 983_1 | шум от S2 до 2/3 диастолы, линейно убывает; высокий = полоса около 650 Гц |
| Митральный стеноз | Громкий I тон, тон открытия через 0,06–0,11 с после II тона, затем низкий рокочущий диастолический шум с пресистолическим усилением; слышен на верхушке, никуда не проводится; при фибрилляции предсердий пресистолическое усиление исчезает | MSD MS; Минздрав 945_1 | тон открытия через 80 мс после S2; шум от тона открытия, убывает до трети громкости к середине диастолы, затем нарастает с начала зубца P до S1; низкий = полоса около 180 Гц с «рокотом» (амплитудная модуляция) |
| Митральная недостаточность | Голосистолический шум одной громкости от I до II тона, «дующий»; на верхушке, проводится в подмышечную область; I тон ослаблен | MSD MR, MSD Cardiac Auscultation; Минздрав 881_1 | полоса около 650 Гц; S1 тише обычного вдвое |
| Пролапс митрального клапана | Высокочастотный щелчок в середине систолы; если есть регургитация, после него поздний систолический шум до II тона | MSD MVP, MSD Cardiac Auscultation; Минздрав 881_1 | щелчок на середине между S1 и S2; вариант с шумом (текст говорит, что пролапс без регургитации часто даёт только щелчок; шум немного нарастает к S2 (`assumption:`)) |

Чего плеер не воспроизводит (сказано в тексте варианта, где важно): громкость по степеням (1–6), изменения при пробах (Вальсальва, приседание), тяжёлый аортальный стеноз с поздним пиком, острую аортальную недостаточность с тихим шумом, шум Остина Флинта, III и IV тоны, расщепление тонов, разницу между точками выслушивания.

Нет доз, показаний к лечению и обещаний излечения: плеер говорит только о том, как звучит шум.

## Устройство

- `apps/web/src/components/heart-sounds/auscultation.ts`: чистая функция `auscultationEvents(beat, sound)` по удару часов возвращает тоны (`S1`, `S2`, `click`, `opening-snap`, с громкостью) и отрезки шума (начало, конец, форма громкости по точкам, тембр). Без DOM, с юнит-тестами: шум аортального стеноза внутри изгнания, митральной недостаточности от S1 до S2, аортальной недостаточности начинается в S2 и кончается до конца удара, тон открытия через 60–110 мс после S2, пресистолическое усиление кончается в S1, щелчок пролапса между S1 и S2, у нормы шумов нет; список вариантов и их схема совпадают со звуком (схема рисуется из тех же событий).
- `heart-sounds/player.ts`: планирует события по часам аудиоконтекста на 1 с вперёд (`setInterval`, а не кадры анимации, чтобы звук не прерывался в фоновой вкладке). Тоны — затухающие синусоиды, как у часов сердца; шум — белый шум из одного буфера через полосовой фильтр с огибающей громкости.
- `heart-sounds/HeartSounds.tsx`: остров React (`client:visible`), строки пропсами из `messages/<locale>.json`, схема на SVG (цвета из CSS-переменных, тёмная тема), `role="img"` с подписью; переключатель — радиокнопки в `fieldset`; кнопка с меняющейся подписью «Слушать» / «Остановить». Схема и ось времени слева направо (`dir="ltr"`), остальное на логических свойствах.
- `HeartSounds.astro` в `article-components.ts` для статей; страница `pages/[locale]/heart-sounds.astro` со всеми вариантами и списком источников; ссылка на неё со страницы часов сердца.
- Пакет `heart-clock` не меняется: плеер только читает время удара.
- Дизайн-аудит 14.10 (#342): подписи схемы — HTML вокруг SVG, их размер не зависит от ширины схемы; выбор звука — сегментированный переключатель, «Слушать» — акцентная кнопка-пилюля со значком; в статье плеер — блок в рамке с заголовком «Послушайте сердце» в конце раздела о диагностике, источники — ссылками на нумерованный список статьи (и страницы), без своего списка.

## План PR

1. Эта спека (issue).
2. Модель звуков, плеер, остров, страница, строки ru/en, юнит-тесты и e2e (страница открывается, переключатель меняет описание, кнопка звука, axe), ссылка со страницы часов.
3. Компонент `<HeartSounds>` в статьях о пяти пороках (по согласованию с потоком интерактива через координатора).

## Проверка

`pnpm lint`, `pnpm typecheck`, `pnpm test`, `pnpm i18n:check`, e2e, Lighthouse CI; независимое ревью ветки субагентом; после мержа проверить страницу на GitHub Pages.
