Паршивый звук в наушниках macos, решение и автоматизация

Проблема

Я слушаю музыку в наушниках. Иногда звук становится паршивым. Я долго пытался понять, в чем дело. Потом разобрался: если наушники установлены как микрофон в macos, то звук становится плохим. Даже если сходить и переключить звук «входа» на нормальный микрофон, иногда он слетает обратно.

Паршивый звук в наушниках macos, решение и автоматизация 1
Так в настройках звука выглядит установленный микрофон от наушников

Решение

Чтобы звук снова стал нормальным, надо выбрать другой микрофон — «микрофон Macbook» или «внешний микрофон», если у вас он подключён.

Проблема в том, что макбук сам решает, когда их переключать. Вы не узнаете, когда он это сделает. Вручную ходить переключать — это дурной тон.

Автоматизация решения

Поражаюсь, что в маленькой инди-компании не додумались сделать кнопку: «Микрофон по-умолчнанию». Это бы всё решило.

Этой кнопки нет, придётся решать иначе. Будем делать это через программу Hammerspoon.

1. Скачиваем программу HammerSpoon. Скачается архив, его распаковываем и устанавливаем программу. Вам нужно будет дать ей разрешения, запускать при включении компьютера. Если вы пользователь Macos, должны знать как это делается.

2. Вставляем в терминал команду. Она создаст и откроет файл init.lua для программы.

mkdir -p ~/.hammerspoon && touch ~/.hammerspoon/init.lua && open ~/.hammerspoon/init.lua

3. Откроется программа-редактор с пустым содержанием. Туда надо вставить код ниже. В самом начале файла есть указание микрофона. Измените название с «Микрофон MacBook Pro» на другой. Или добавьте свой.

    -- Список разрешённых микрофонов
    local preferredMics = {
        ["Микрофон MacBook Pro"] = true
    }
    
    -- Функция, переключающая вход
    local function fixInput()
        local currentInput = hs.audiodevice.defaultInputDevice():name()
        print("Текущий микрофон: " .. currentInput)
        
        if not preferredMics[currentInput] then
            for _, device in ipairs(hs.audiodevice.allInputDevices()) do
                if preferredMics[device:name()] then
                    device:setDefaultInputDevice()
                    print("Переключено на: " .. device:name())
                    return
                end
            end
            print("❌ Нет подходящего микрофона среди доступных.")
        else
            print("✅ Микрофон уже правильный.")
        end
    end
    
    -- Создаём watcher и запускаем
    local watcher = hs.audiodevice.watcher
    watcher.setCallback(function()
        hs.timer.doAfter(1, fixInput)
    end)
    watcher.start()
    
    print("🎙️ Hammerspoon следит за микрофоном!")
    

    4. Сохраните файл и нажмите в Hammerspoon в верхнем меню Reload config

    Паршивый звук в наушниках macos, решение и автоматизация 2

    Готово. Теперь если макбук переключит микрофон на наушники и у вас изменится качество звука, программа это заметит и переключит микрофон на нужный.

    Если будут вопросы — пишите. Помогу, чем смогу.

    Добавляем плавный след за курсором на сайт

    На одном из сайтов наткнулся на залипательный эффект — линия, которая идет за курсором. Я просто изучал сайт и на минуту залип на этом эффекте, рисуя что-то.

    Ниже скрипт и инструкция, как подключить такое себе.

    Демо

    Шаг 1: Подключение к странице

    Есть два способа добавить эффект на ваш сайт:

    Способ 1: Подключение отдельного файла

    1. Скопируйте код и создайте файл cursor-trail.js в папке вашего проекта (например, в js/).
    2. Добавьте его в ваш HTML-файл перед закрывающим тегом </body>:
    <body>
        <!-- Ваш контент -->
        <script src="js/cursor-trail.js"></script>
    </body>
    

    Способ 2: Встраивание кода в HTML

    Если вы не хотите использовать отдельный файл, можно встроить код прямо в HTML, указан полный код:

    <body>
        <!-- Ваш контент -->
        <script>
        document.addEventListener("DOMContentLoaded",()=>{
            // Настройки эффекта - удобно редактировать
            const trailSettings = {
                color: "rgba(255, 255, 255, 0.85)",  // Цвет линии
                thickness: 1,                        // Толщина линии
                maxSegments: 40,                     // Максимальное количество сегментов
                minDistance: 3,                      // Минимальное расстояние между точками
                fadeFactor: .95,                     // Фактор затухания
                inactivityTimeout: 5000              // Время бездействия до исчезновения (мс)
            };
            
            // Минифицированный код (не редактировать)
            let s=[],x=null,y=null,f=!0,t=null;function h(){s.length>0&&(s.forEach((e,i)=>{setTimeout(()=>{e.style.opacity="0"},50*i)}),setTimeout(()=>{s.forEach(e=>e.remove()),s.length=0},50*s.length+300))}function r(){t&&clearTimeout(t),t=setTimeout(h,trailSettings.inactivityTimeout)}function c(e,i,n,o){const a=document.createElement("div");a.classList.add("trail-segment");const l=Math.sqrt(Math.pow(n-e,2)+Math.pow(o-i,2)),d=180*Math.atan2(o-i,n-e)/Math.PI;if(a.style.width=`${l}px`,a.style.height=`${trailSettings.thickness}px`,a.style.left=`${e}px`,a.style.top=`${i}px`,a.style.transform=`rotate(${d}deg)`,a.style.transformOrigin="0 0",a.style.backgroundColor=trailSettings.color,a.style.position="fixed",a.style.pointerEvents="none",a.style.zIndex="9998",a.style.borderRadius="0px",a.style.opacity="1",a.style.transition="opacity 0.3s",document.body.appendChild(a),s.push(a),s.length>trailSettings.maxSegments){const e=s.shift();e.style.opacity="0",setTimeout(()=>{e.remove()},300)}s.forEach((e,t)=>{e.style.opacity=(t+1)/s.length})}document.addEventListener("mousemove",e=>{if(r(),f)return x=e.clientX,y=e.clientY,void(f=!1);if(null===x||null===y)return x=e.clientX,void(y=e.clientY);const t=e.clientX-x,i=e.clientY-y,n=Math.sqrt(t*t+i*i);n>trailSettings.minDistance&&(c(x,y,e.clientX,e.clientY),x=e.clientX,y=e.clientY)}),r()});
        </script>
    </body>

    Шаг 2: Настройка эффекта

    Откройте cursor-trail.js (или найдите встроенный код в HTML) и найдите найстройки скрипта:

    const trailSettings = {
        color: "rgba(255, 255, 255, 0.85)",  // Цвет линии
        thickness: 1,                        // Толщина линии
        maxSegments: 40,                     // Максимальное количество сегментов
        minDistance: 3,                      // Минимальное расстояние между точками
        fadeFactor: .95,                     // Фактор затухания
        inactivityTimeout: 5000              // Время бездействия до исчезновения (мс)
    };

    Что означают параметры:

    • color: Цвет линии в формате CSS (HEX, RGB, RGBA).
    • thickness: Толщина линии в пикселях.
    • maxSegments: Сколько сегментов может быть в линии (влияет на длину следа).
    • minDistance: На каком расстоянии добавляется новый сегмент (меньше — плавнее, больше — проще для браузера).
    • fadeFactor: Фактор затухания для плавного исчезновения (чем ближе к 1, тем медленнее затухание).
    • inactivityTimeout: Время в миллисекундах, после которого след исчезнет, если курсор не двигается (5000 = 5 секунд).

    Как настроить под себя:

    • Для тонкой и короткой линии: уменьшите thickness до 0.5 и maxSegments до 20−30.
    • Для длинного хвоста: увеличьте maxSegments до 100−150.
    • Для более заметного следа: используйте яркий цвет, например «#00ff00» (зеленый) или «rgba (0, 128, 255, 0.9)» (голубой).
    • Для более быстрого затухания при бездействии: уменьшите inactivityTimeout до 3000 (3 секунды).
    • Если сайт тормозит: увеличьте minDistance и уменьшите maxSegments.

    Особенности эффекта

    Наш эффект следа за курсором имеет несколько важных особенностей:

    1. Плавное затухание с конца: Старые сегменты постепенно исчезают, создавая эффект «хвоста».
    2. Автоматическое исчезновение: Если курсор не двигается 5 секунд, след плавно исчезает.
    3. Адаптивность: Сегменты динамически создаются в зависимости от скорости и траектории движения курсора.
    4. Оптимизация: Используется оптимальное количество элементов для плавного эффекта без перегрузки браузера.
    5. Простая настройка: Все параметры эффекта легко настраиваются через один объект с настройками.

    Итог

    Теперь у вас есть эффект следа за курсором с автоматическим затуханием! Это небольшое дополнение может сделать сайт более живым и интерактивным. Экспериментируйте с настройками, чтобы добиться нужного результата для вашего дизайна.

    Если есть вопросы, пишите в комментариях!