В PCM Format C в начале каждого поля расположена одна строка заголовка (control data block), содержащая некоторую служебную информацию, разделенную на несколько полей (рис. 1).

Рис. 1. Структура строки заголовка (control data block)

Во всех известных PCM процессорах задействованы только поля Cueing word и частично Control word. Первое поле содержит 56 бит, состоящих из повторяющегося паттерна “1100”, которые необходимы для идентификации начала PCM-кадра. Поле Control word содержит флаги пре-эмфазиса, режимов коррекции и защиты от копирования.

В процессе разработки кодера и глубокого изучения всех доступных материалов о PCM Format C был обнаружен стандарт IEC 60841-1988, в котором подробно описано поле Address word (рис. 2). Оно предназначено для записи индекса и тайм-кодов. Было принято решение добавить этот функционал в кодер, но сделать его отключаемым.

Рис. 2. Структура поля Address word

Поле индекса состоит из 6 бит, что позволяет записывать туда число от 0 до 63. Под часы отведено 4 бита, под минуты, секунды и поля – 6 бит, поэтому максимальный тайминг записи под конкретным индексом может быть равен 15:59:59.59 для NTSC и 15:59:59.49 для PAL. То есть при записи видеокассеты индекс может и не изменяться, и даже если записывать 300-минутную кассету в режиме PAL EP, счетчик тайм-кода не переполнится.

При наличии валидного сигнала на входе кодер подсчитывает количество формируемых полей видео и на основе этого считает секунды, минуты и часы. Эта информация записывается в строку заголовка.

С индексом ситуация была менее понятная. Какой-либо информации о том, как и при каких условиях он должен изменяться, нет. В момент добавления этого функционала, форм-фактор и органы управления кодера были уже определены. Поэтому добавить специальные кнопки для работы и индексом не представлялось возможным. Но учитывая, что кнопка REC MUTE предназначена для вставки пауз между композициями при их записи, именно в момент ее нажатия можно увеличивать значение индекса, сбрасывая при этом значение тайм-кода. Тогда каждая новая композиция будет записана с новым значением индекса и с информацией о ее длительности. Сброс индекса происходит при отключении питания кодера.

С такой реализацией была выпущена небольшая серия кодеров. Но в процессе их эксплуатации у владельцев часто возникала мысль автоматизировать изменение индекса между треками при записи кассет с PCM контентом. Это исключит необходимость держать руку на кнопке REC MUTE во время записи. Кроме этого, у mihail2501 возникла идея вместо локального тайм-кода для каждого трека реализовать абсолютный счетчик времени для всей записи. Именно по такому принципу реализован ABS-счетчик в магнитофонах DAT. А учитывая, что в стандарте IEC 60841-1988 не оговорены подробности реализации тайм-кодов, абсолютный счетчик этот стандарт не нарушает. Это сподвигло нас дополнить кодер этим функционалом.

Принцип автоиндекса можно реализовать с помощью детектора пауз. Между записываемыми треками необходимо добавить абсолютную тишину в пару секунд, которую будет детектировать кодер и автоматически увеличивать индекс на единицу. Это можно сделать в плеере при подготовке плейлиста для записи. Но к такому подходу есть пара замечаний.

Во-первых, описанный способ сработает только с цифровым звуком. В режиме аналогового входа абсолютной тишины никогда не бывает, и для него нужно выбрать порог, ниже которого будет считаться, что текущий трек закончился. Но какой величины выбрать порог? Аналоговые записи могут быть довольно шумными, если они воспроизводятся, например, с компакт-кассетной деки. И при пороге, к примеру, в -70 дБ можно вообще не обнаружить никаких пауз. А увеличив порог до -60 дБ, при хорошем качестве записи (с высоким динамическим диапазоном, или просто в акапеллах) может произойти ситуация, что кодер “нашинкует” запись индексами не в тех местах. В идеале для таких целей необходима регулировка величины порога, но для нее в кодере нет свободных органов управления. Также, кроме выбора величины порога, в схему автодетекта необходимо вводить гистерезис. Это все усложняет логическую схему в ПЛИС, у которой осталось не так уж много свободных ячеек. Поэтому учитывая, что аналоговый вход в кодере реализован, скажем так, как дополнительный функционал и больше “по фану”, мы приняли решение не вводить никакой порог срабатывания детектора пауз.

Во-вторых, встречаются музыкальные альбомы, которые сведены единым произведением без пауз между треками. В этом случае, опять же, нужно вводить порог со всеми вытекающими проблемами. Кроме того, встречаются записи, в которых есть тишина, но они считаются целыми треками.

То есть для аналогового входа и/или специфичных альбомов и треков потребуется либо отключение автоматического индекса, либо его ручной ввод. Включение и отключение тайм-кодов и индекса у нас реализовано на дополнительном переключателе. Чтобы сделать автоинкремент индекса отключаемым, в кодере с дополнительной платой мы пожертвовали одним переключателем, который управлял отключением Q-коррекции. Ее мы перенесли на разъем DEBUG. Там ею управлять менее удобно, но данная опция и требуется очень нечасто и скорее в экспериментальных целях. А в основной версии кодера внизу как раз был один незадействованный переключатель.

Суммируя вышесказанное, после долгих обсуждения мы пришли к следующей реализации, в которой доступны три варианта работы с индексом и ABS-счетчиком.

  1. ABS-счетчик и индекс выключены, автоиндекс выключен
    Кодер не добавляет в заголовок PCM-кадра информацию об индексе и времени. Кнопка REC MUTE работает как обычно и в нажатом состоянии добавляет тишину в запись.
  2. ABS-счетчик и индекс включены, автоиндекс выключен
    Кодер добавляет в заголовок PCM-кадра информацию об индексе и времени.
    При включении кодера ABS-счетчик остановлен и индекс равен нулю. Перед началом записи на кассету следует нажать кнопку REC MUTE, после отпускания которой кодер запустит счетчик абсолютного времени. Далее необходимо еще раз нажать кнопку REC MUTE, чтобы сделать индекс равным 1, и подать на вход аудио-данные.
    Увеличить индекс можно вручную нажатием кнопки REC MUTE. При этом в запись будет добавлена тишина на время, пока была зажата кнопка.
    Изменение формата PCM, смена входа или TV-стандарта сбросит индекс на ноль, а также остановит и сбросит счетчик времени.
  3. ABS-счетчик и индекс включены, автоиндекс включен
    Кодер добавляет в заголовок PCM-кадра информацию об индексе и времени.
    При включении кодера ABS-счетчик остановлен и индекс равен нулю. Перед началом записи на кассету следует нажать кнопку REC MUTE, после отпускания которой кодер запустит счетчик абсолютного времени. Далее можно подать на вход аудио-данные, и в начале первого трека (при появлении первого отличного от нуля семпла) индекс автоматически станет равным 1. Далее, встречая в данных тишину (нулевые семплы) ~1.5 с и больше, кодер будет инкрементировать индекс после ее окончания.
    При необходимости индекс можно увеличить вручную кратковременным нажатием кнопки REC MUTE. В данном режиме кнопка REC MUTE управляет только индексом и не добавляет тишину в запись.
    Изменение формата PCM, смена входа или TV-стандарта сбросит индекс на ноль, а также остановит и сбросит счетчик времени.