PDA

Просмотр полной версии : Помощь в определении частот нот МК-90



Radon17
29.06.2018, 15:35
Как известно, мк-90 с первой версией бейсика выводил ноты разной длительности (с высотой ноты уменьшалась длительность). Я провёл небольшое исследование, написал на бейсике короткую программу по перебору всех нот команды "PLAY", и через микрофон записал на компьютер, затем в Sound forge измерил длительность каждой ноты. Сороковая звучала почти в 10 раз меньше, чем первая! Всю полученную информацию собрал в таблицу Excel (прикреплена). Завершением стало написание небольшой консольной утилиты для ПК на С++ по конвертированию длительности одной ноты для другой. Это конечно не функция на ассемблере, но жить уже можно.

А вот с определением частот нот произошла заминка, я не нашёл приемлемого способа. Пришлось вручную выделять 100мс ноты, и считать пики... Что сказать, выдохся я на 17-ой ноте... Ну вот, пока, полученный результат(±10 Гц):

1)700 Гц
2)740 Гц
3)790 Гц
4)830 Гц
5)880 Гц
6)930 Гц
7)990 Гц
8)1040 Гц
9)1100 Гц
10)1150 Гц
11)1220 Гц
12)1310 Гц
13)1390 Гц
14)1460 Гц
15)1560 Гц
16)1650 Гц
17)1740 Гц

Итак, прошу помочь всех желающих в определении частот остальных нот.

Ссылки:

Эксель таблица с длительностью - https://yadi.sk/i/OgWWpv3V3Yb2hm
Моя утилита "Эквивалент" - https://yadi.sk/d/D4XgkNVw3Y7VrK
Звуковой файл с нотами - https://yadi.sk/d/1F_M57uX3Yb2oR

Для чего может понадобится частота? Чтобы сопоставить ноты МК-90 с реальными нотами (в сети можно найти всю информацию) - октавы две получится точно.

Спасибо за внимание.

svofski
29.06.2018, 15:48
Может быть, если звук цифруется чисто, надежней, точней и даже проще считать длину периода?

Radon17
29.06.2018, 15:58
Дело в том, что там не совсем чистая синусоида, есть два вида колебаний, они повторяются друг за другом.

svofski
29.06.2018, 17:03
Даа.. скачал, посмотрел на волновые формы. "Не совсем чистая синусоида" - это меандр, пропущенный через фильтр ВЧ (это же пьезодинамик, да?).

https://i.imgur.com/Izt90Gh.png
(источник (https://www.electronics-tutorials.ws/rc/rc_3.html))

Период все равно можно проследить между двумя вершинами. Проще скриншотом:

https://i.imgur.com/V1yBYcF.png


Но и БПФ тоже способ. Я бы только побольше частоту дискретизации сделал, для измерительных-то целей.

Radon17
29.06.2018, 17:09
О, спасибо, а то я гадал, как же генерировался этот сигнал внутри МК-90. Да, пьезодинамик стоит. Я вот думаю... может до преобразования подцепиться, и записать меандр, так-то проще будет.

IgorR76
29.06.2018, 17:36
А вот с определением частот нот произошла заминка, я не нашёл приемлемого способа.

Для определения частоты нот надо было сходить в музыкальную школу. Ваша запись нот начинается с ФА первой октавы, и дальше по полтона вверх. Табличка:
http://rus.ilkhomus.com/wp-content/uploads/2011/11/11.jpg

PS. Вот только непонятно, зачем Вам частоты?

Radon17
29.06.2018, 17:43
IgorR76, внимательно прочитайте моё самое первое сообщение, я имел в виду ноты (если вам угодно, "ноты") МК-90, их 40 штук, их частоту я и пытался измерить, про данную табличку я знаю, внимательно прочтите предпоследнее предложение, там сказано про "реальные ноты" это как раз и есть они.

Sergei Frolov
29.06.2018, 17:57
Есть приложения под Android - микрофоном определяется частота и показывается ближайшая нота. Точное название не помню. Но что-то вроде Spectrum Analyzer

IgorR76
29.06.2018, 18:03
Серёж, имеющий уши да услышит. Не надо приложений. И частот. Мелодию потом же не осциллографом смотреть.

piotr433
29.06.2018, 22:27
Немного технических деталей (Бэйсик 1.0)

В МК-90 пьезодинамик подключён к выводу синхросигнала канала 3 микросхемы последовательного интерфейса КА1835ВГ4 (http://www.pisi.com.pl/piotr433/manuals/guide13.djvu). Частота этого сигнала вычисляется по формуле:
Ф = F / (2 * N)
где
F - опорная частота 1600 кГц (не очень точная, так как вырабатывается RC-генератором)
N - число занесённое в регистр коэффициента деления

Команда PLAY записывает в регистр коэффициента деления номиналы из следующей таблицы (ноты 0-40, их 41 штук).

0x08EE, 0x0872, 0x07F9, 0x0783,
0x071A, 0x06B5, 0x0653, 0x05F7,
0x05A4, 0x0551, 0x0506, 0x04BC,
0x0477, 0x0439, 0x03FC, 0x03C2,
0x038D, 0x035A, 0x032A, 0x02FB,
0x02D2, 0x02A8, 0x0281, 0x025E,
0x023D, 0x021D, 0x01FE, 0x01E2,
0x01C7, 0x01AD, 0x0193, 0x017E,
0x0169, 0x0155, 0x0142, 0x012F,
0x0121, 0x010E, 0x00FF, 0x00F1,
0x00E3

Второй операнд команды PLAY определяет количество последовательно переданных байтов и, следовательно, длительность тона, которая вычисляется по формуле:
t = количество_байтов * 8_битов_в_байте / частота_тона

piotr433
08.08.2018, 15:11
Может не совсем в тему - я написал программу, измеряющую значение опорной частоты для последовательного интерфейса. Используется таймер периодических прерываний встроенной микросхемы часов реального времени КА512ВИ1. Прикреплённый архив содержит исходник на ассемблере и образ памяти модуля СМП (Бэйсик 1.0).

Мой результат: 1641 кГц