EnglishРусский Map

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
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. Количество звёзд на момент импорта не зафиксировано.