Пет-проект: Калимба
Сегодня захотелось сделать за пять минут крошечный музыкальный пет-проект - веб-симулятор калимбы! Сделать его решила с помощью Qwen, и результат получился превосходным, но не совсем... На компьютере звук действительно прекрасный. Особенно понравилась функция эха, которая, правда, работает не совсем так, как ожидалось. А вот на мобильном телефоне веб-калимба звучит с хрипотцой, точно старый шансонье, а потом и вовсе - теряет голос!
И вот, что Qwen говорит по этому поводу: Это очень распространённая и совершенно закономерная ситуация. Разница в звучании и "отваливание" звука на мобильных устройствах связаны с фундаментальными различиями в архитектуре аудиоподсистем десктопов и смартфонов, а также с особенностями работы Web Audio API. Вот что происходит "под капотом":
🔍 4 основные причины 1. Цифровой клиппинг (перегрузка мастер-шины) Каждая нота в коде имеет пиковую громкость 0.45, а мастер-громкость выставлена в 0.7. Если вы нажмёте всего 3 клавиши одновременно, суммарная амплитуда превысит 1.0 (цифровой потолок). На десктопе браузер часто применяет мягкий клиппинг или имеет запас headroom, а мобильные ОС жёстко ограничивают выходной сигнал, чтобы не повредить миниатюрные динамики. Результат → хрип → аварийное глушение канала.
2. Лимит параллельных аудио-нод и сборка мусора При каждом нажатии создаётся ~10 объектов: 7 осцилляторов, 6 GainNode, 2 фильтра, 1 noteGain. На десктопе Garbage Collector успевает подчищать отработавшие ноды. На мобильном устройстве память и CPU ограничены, аудиопоток реального времени начинает "задыхаться", возникают пропуски буфера (xrun) → слышен треск/хрип. При критической нагрузке мобильный браузер просто принудительно останавливает AudioContext.
3. Разный размер аудиобуфера На ПК браузер обычно использует буфер 512–1024 сэмпла (больше задержка, но стабильнее). На iOS/Android буфер часто 128–256 сэмпла для снижения задержки. Меньший буфер = меньше времени на обработку. Если синтез не успевает подготовить следующий блок данных → слышимый артефакт (хрип, щелчки).
4. Агрессивное энергосбережение мобильных ОС iOS и Android отслеживают "фоновую" активность аудио. Если AudioContext не получает регулярных пользовательских жестов или висит в паузе >10 сек, система переводит его в спящий режим. Звук пропадает до следующего тапа.
Я думаю, что первую версию калимбы оставлю без изменений, т.к. планировала играть в неё с клавиатуры. Но если вдруг кто-то попросит допилить под мобильный - сделаю. А пока - желаю приятной игры!