Хочу понять как модуляция при записи на кассету работает

Page 1/2
| 2

By dhau

Paragon (1556)

dhau's picture

25-11-2017, 05:33

Моя цель - понять как из cas правильно генерировать wav. Пусть будет стандартная скорость записи 1200 бод, а wav будет как принято 44.1khz, mono, 8-bit.

Читаю этот документ. Помогите понять как правильно пересчитывать такты z80 в миллисекунды, а то как-то приблизительно по документу получается.

Login or register to post comments

By Alexey

Guardian (2165)

Alexey's picture

25-11-2017, 18:49

Понять несложно. Главное в FSK - частота сигнала и формат кодирования нуля и единички, который из этого проистекает. У единички частота в 2 раза выше. Ну и конечно для разных файлов есть свой формат посылки. Для передачи 8 бит данных в FSK используется 11 бит. Вот тут в моей презентации со слайда 28 можно кое-какую визуальную информацию получить:

http://www.finnov.net/~wierzbowsky/TYME_2013_Presentation.ppt

Также если не побрезгуете изучить говнокод, можете порыться в моих исходниках Caslink3. ;)

http://podrezov.com/caslink3.htm

By dhau

Paragon (1556)

dhau's picture

26-11-2017, 01:39

Алексей, спасибо! Я вашу программу уже скачал, но это большой и сложный проект, его так нахрапом не поймёшь Smile

У меня пока супер примитивная цель: написать прогу, которая сгенерирует wav с тоном 2400 герц и продолжительностью 3 секунды. И пусть wav будет 44.1 килогерц, 8-бит, моно.

Есть вот такая библиотека: libsndfile, вродебы отшлифованная, но не знаю насколько легко её использовать. Думаю может запользовать, чтобы велик не переизобретать.

Про презентацию: дома оффиса нет, открыть нечем, бесплатного вьювера от микрософт тоже нет. Обычно люди ppt экспортируют в pdf перед публикацией, потому что pdf везде читается :)

By Alexey

Guardian (2165)

Alexey's picture

26-11-2017, 22:10

У Микрософта есть бесплатные просмотрщики MS Office файлов. Вот например для Powerpoint:

https://www.microsoft.com/en-us/download/details.aspx?id=13

Попробую объяснить на пальцах. Эти 2400 Герц - это 2400 колебаний в секунду. То есть вам надо записать 2400 раз смену нолика (нижий пик синусоиды = 00) и единички (верхний пик синусоиды = FF) в единицу времени - секунду. При частоте дискретизации 11кГц (это 11025 байт в секунду) вам надо создать 2400 колебаний, то есть смена нуля и единички должна происходить каждые 4.59 байта. Для последующего масштабирования проще записать такую последовательность для 10 байт (то есть смена нуля и единички произойдет 2 раза). В итоге получаем байтовую (для 8-бит моно аудиофайла) последовательность:

00 00 FF FF FF 00 00 FF FF FF

Теперь эту последовательность надо повторить 1102 раза чтобы получить секунду звучания. В итоге у вас получится частота сигнала 2400Гц при частоте дискретизации аудиофайла 11кГц и разрядности 8 бит. Для 44кГц (44100 байт в секунду) надо отмасштабировать нашу байтовую последовательность в 4 раза (то есть каждый байт повторить 4 раза):

00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF

Конечно получается не синусоидная форма сигнала, а скорее квадратики (см. презентацию), но MSX их кушает вполне охотно. К тому же их проще загнать в MP3, если конечно не перебарщивать с компрессией.

By Alexey

Guardian (2165)

Alexey's picture

27-11-2017, 17:47

Продолжим. Форматы записи для разных файлов различаются. Для бинарных и токенизированных файлов Бейсика для начала даётся сигнал определённой частоты и определённой длительности - заголовок (см. доки). За ним следует первичный блок данных (имя файла, а также стартовые адреса для бинарников), кодированный в 11-битном формате. Затем идёт опять же сигнал определённой частоты и длительности (второй заголовок), а за ним следуют основные данные файла в том же 11 битном формате со старт-битом и двумя стоп-битами. Для нетокенизированных файлов данные грузятся по 256 байт после короткого заголовка.

Советую почитать эту доку: http://www.msxarchive.nl/pub/msx/docs/hardware/msx-tape.doc

By dhau

Paragon (1556)

dhau's picture

27-11-2017, 18:36

Спсибо, скачал PowerPoint Viewer, даже не знал что такое есть. Пролистал презентацию, очень интересно! Я пока буду копать в сторону создания wav файла с тоном определённой частоты.

Я всё ещё хочу понять точную формулу пересчёта тактов в миллисекунды, а то как-то всё приблизительно:

┌───────────┬──────┬────────────────────────────────────────┐
│ Скорость  │  Бит │             Форма волны                │
│ передачи  │      │                                        │
├───────────┼──────┼────────────────────────────────────────┤
│           │      │   |           |           |            │
│           │   0  │   |           ┌───────────┐            │
│           │      │   |           │           │  1200Hz×1  │
│   1200    │      │   |───────────┘           └            │
│    бод    ├──────┼────────────────────────────────────────┤
│           │      │   |     |     |           |            │
│           │   1  │   |     ┌─────┐     ┌─────┐            │
│           │      │   |     │     │     │     │  2400Hz×2  │
│           │      │   |─────┘     └─────┘     └            │
├───────────┼──────┼────────────────────────────────────────┤
│           │      │   |     |     |           |            │
│           │   0  │   |     ┌─────┐           |            │
│           │      │   |     │     │           |  2400Hz×1  │
│   2400    │      │   |─────┘     └           |            │
│    бод    ├──────┼────────────────────────────────────────┤
│           │      │   |  |  |     |           |            │
│           │  1   │   |  ┌──┐  ┌──┐           |            │
│           │      │   |  │  │  │  │           |  4800Hz×2  │
│           │      │   |──┘  └──┘  └           |            │
└───────────┴──────┴────────────────────────────────────────┘
                       |  |  |     |           |
                       ◄───────────────────────►──────────
                       |  |  |     |               2983 T
                       |  |  |     |              (833 msec)
                       ◄───────────►──────────
                       |  |  |        1491 T (417 msec)
                       ◄─────►───────────
                       |  |    746 T (208 msec)
                       ◄──►────────
                       |  | 373 T (104 msec)

By dhau

Paragon (1556)

dhau's picture

27-11-2017, 21:21

Алексей, я тут считал сколько байт пишется в wav на каждный байт данных в bin/rom/cas. При скорости записи 1200 бод и при wav 44.1khz / 8-bit / mono у меня получилось 396 байт. Мне это надо чтобы размер чанков riff и data заранее правильно посчитать.

Для каждого байта пишется 11 бит: один стартовый `0`, 8 данных, 2 стоповых `1`.

Для каждого бита в wav пишется пульс. Если мы записываем бит `0`, то пишем один длинный пульс 1200 герц; если бит `1`, то пишем два коротких пульса по 2400 герц.

Количество байт в канале файла wav считаем так: частота дискретизации wav (44100 герц) / частота пульса.

Для короткого пульса на 2400 герц это 44100/2400 = 18.375 = 18 байт.
Для длинного пульса на 1200 герц это 44100/1200 = 36.75 = 36 байт (или лучше 37?).

И того 11 * 36 = 396.

Как лучше округлять до целого или как-то накапливать остаток и раскидывать? А то от отбрасывания дробного остатка пульсы получаются немного короче чем должны бы были быть. При дискретизации 48 килогерц дробей нет:
48000/2400 = 20 байт; 48000/1200 = 40 байт. И кстати это похоже обьясняет почему castools использует странную частоту дискретизации 43.2 килогерц: 18*2400 = 36*1200 = 43200. Но если такую частоту использовать, то чип-кодек на компе или телефоне её всё-равно проинтерполирует в 44.1 или 48 килогерц. Так что по моему лучше по умолчанию использовать 48 килогерц, но дать возможность пользователю задать свою частоту.

By dhau

Paragon (1556)

dhau's picture

27-11-2017, 21:30

Мне кажется что из-за отбрасывания дробного остатка при подсчёте числа байтов на пульс у нас немного плывёт частота сигнала: если дискретизация 44.1 килогерц и 18 байт на короткий пульс, 36 на длинный, то вмесно частот 1200 и 2400 герц мы используем частоты 1225 и 2450.

Алексей, я поищу ваш емэйл и напишу на прямую, хотелось бы с вами обменяться номерами для ватсапа если вы им пользуетесь.

By Alexey

Guardian (2165)

Alexey's picture

27-11-2017, 21:57

Да, частота получаемая в Caslink чуть плывёт, так как мы считаем что в 10 байтах умещается 1, 2 и 4 импульса. Хотя правильнее было бы считать так, чтобы не было округления. Но MSX особой точности не требует, так что я не гнался за точными частотами и тем более за тактами.

Когда делался Caslink, в 1999 году, то не было устройств, которые поддерживали бы 48кГц. Да и об mp3 плеерах тогда не слышали. У меня мобила была тогда с пищалкой вместо динамика. Так что дизайн несёт в себе грабли с тех самых пор.

Моё мыло находится в учётке на этом сайте. Кликните на мой ник слева и увидите мыло.

By dhau

Paragon (1556)

dhau's picture

28-03-2019, 16:36

Результаты моих усилий и экспериментов: msxtape.py. Работает с 8 и 16-битными сэмплами, и 44.1 / 48KHz. Ещё есть что-то не то: при дискретизации 22.05KHz OpenMSX не распознаёт wav. На 44.1KHz запись на 1200бод работает, а на 2400 нет. На 48KHz работают и 1200 и 2400. Я подозреваю что или из-за того что все на плавающей точке считается или из-за того что звук слишком громкий: 0/255 для 8-битных сэмплов, -32768/32767 для 16-битных.

Хочу записать какие-то проги с реальной MSX и проанализировать записи, может найду что не так.

By Alexey

Guardian (2165)

Alexey's picture

29-03-2019, 12:01

При записи с реальной MSX у Вас будет аналоговый сигнал (синусоида), который для декодирования надо будет привести к цифровому виду. Значит придется писать с бОльшей дискретизацией и затем писать код, который будет делать аналогово-цифровое преобразование. Это непростая задача, я в Caslink изначально такое планировал, а затем отказался от этой идеи в виду её сложности.

Есть утилиты cas2wav и wav2cas, свою прогу Вы можете потренировать сравнивая Ваши результаты с тем, что выдают эти утилиты.

Page 1/2
| 2