audio-cassette-simulation
- title
- audio-cassette-simulation
- type
- toolbox
- summary
- Bash- и ffmpeg-скрипты для обработки аудио по профилям шести конкретных аудиокассет
- tags
- bash, ffmpeg, audio, retro, watchlist
- language
- Shell
- license
- MIT
- created
- 2026-07-29
- updated
- 2026-07-29
- lang
- ru
- translation_of
- audio-cassette-simulation
- source_updated
- 2026-07-29
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Набор bash-скриптов, пропускающих аудио через цепочки фильтров ffmpeg, чтобы придать ему звучание кассетной записи. В каждом профиле обработка состоит из четырёх элементов - ленточный шум, детонация (wow and flutter) в виде модуляции высоты тона, ограничение полосы частот и эквализация; меняются лишь параметры для каждой конкретной кассеты. Для работы требуются bash и ffmpeg, собранный с libmp3lame.
Профили как каталоги
Репозиторий устроен так: одна папка на кассету, внутри - собственная пара скриптов; в этом и заключается вся архитектура проекта. Здесь нет флага выбора профиля и общего скрипта: переходите в папку нужной кассеты и запускаете то, что там лежит.
Шесть кассет и их характеристики из README:
BASF LH Extra C90- немецкая лента первого типа (ferric), умеренный шум и лёгкая детонацияMaxell UD C90- лента ferric более высокого класса, меньше шума и шире частотный диапазонSony CHF60 Type I Normal (1978)- винтажная 60-минутная нормальная лента, тёплая серединаSony CHF90 (1978)- 90-минутная версия с чуть более заметным дрейфом скорости лентыTDK D90 (1995-1997)- поздний Type I, чистый звук с мягким аналоговым характеромmk60- советская МК-60, сильный шум, ощутимая детонация, агрессивный срез частот
Две модели Sony образуют интересную пару: один и тот же год, один состав, но более длинная лента тоньше, поэтому сильнее плывёт. МК-60 находится на противоположном от TDK полюсе, что примерно соответствует реальному разрыву между японским Type I конца 1990-х и советской бытовой кассетой.
Использование
# Convert local audio files (mp3, ogg, m4a, aac)
./convert_cassette_*.sh
# Record a live web stream into segment files
./record_stream_cassette_*.sh [STREAM_URL]
Результат сохраняется в ./out. Запись потока - менее очевидная часть: скрипт захватывает живой веб-поток и нарезает его на сегменты с уже применённым профилем кассеты. Это гораздо ближе к реальной записи радиоэфира на магнитофон, чем конвертация чистого файла.
Ограничения
README - это вся документация. В нём не описаны цепочки фильтров, уровень шума, глубина модуляции или частоты среза для профилей, поэтому реальные значения параметров можно увидеть только в самих скриптах, а способов настройки, кроме правки кода вручную, не предусмотрено. Добавление седьмой кассеты требует копирования каталога. Ничего из этого не калибровалось по реальной деке или реальной плёнке: профили представляют собой текстовые описания, переведённые в настройки фильтров, а не снятые импульсные отклики или сэмплы шума, поэтому названия кассет стоит воспринимать скорее как стилизацию, чем как точную эмуляцию. Требование libmp3lame означает вывод в MP3, из-за чего после аналоговой симуляции накладывается сжатие с потерями.
Проект находится в watchlist: один автор, нет релизов, и пока не ясно, объединится ли когда-нибудь дублирование по папкам в один скрипт с аргументом профиля.
Репозиторий: AARomanov1985/Audio-Cassette-Simulation, MIT. Количество звёзд на момент импорта не зафиксировано.