реклама на сайте
подробности

 
 
> Кодировка нот, Как закодировать
ogk
сообщение Jan 8 2008, 10:01
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 4-02-07
Пользователь №: 25 035



В программе (ПРИМЕР из интернета) нота кодируется одним байтом. 3 младших бита задают длительность, 5 бит- высоту тона. В подпрограмме декодирования ноты имеется
retlw D'252' ; 00000DDD= СИ 1 октавы (494 ГЦ).

retlw D'238' ; 00001DDD= ДО 2 октавы (524 ГЦ).
и т. д.
Откуда берут эти десятичные числа: 252 и 238? Ведь в двоичном коде это 11111100 и 11101110 соответственно. Или эти числа зависят от конкретного алгоритма? Как их вычислять? И если можно, подскажите алгоритм воспроизведения мелодии и кодировки нот.
Декодирование длительности тоже непонятно:
retlw D'8' ; HHHHH000= 1/8
retlw D'16' ; HHHHH001= 1/4

Спасибо всем, кто поможет разобраться.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ttron
сообщение Jan 11 2008, 09:01
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 134
Регистрация: 1-06-05
Из: Москва
Пользователь №: 5 634



Цитата(ogk @ Jan 8 2008, 13:01) *
В программе (ПРИМЕР из интернета) нота кодируется одним байтом. 3 младших бита задают длительность, 5 бит- высоту тона. В подпрограмме декодирования ноты имеется
retlw D'252' ; 00000DDD= СИ 1 октавы (494 ГЦ).

retlw D'238' ; 00001DDD= ДО 2 октавы (524 ГЦ).
и т. д.
Откуда берут эти десятичные числа: 252 и 238? Ведь в двоичном коде это 11111100 и 11101110 соответственно. Или эти числа зависят от конкретного алгоритма? Как их вычислять? И если можно, подскажите алгоритм воспроизведения мелодии и кодировки нот.
Декодирование длительности тоже непонятно:
retlw D'8' ; HHHHH000= 1/8
retlw D'16' ; HHHHH001= 1/4

Спасибо всем, кто поможет разобраться.

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

Тем не менее - успехов.


--------------------
"Регистрируй, наблюдай, экономь микросекунду, зря вопрос не задавай, не запоминай ерунду" (с) не помню, чье
Go to the top of the page
 
+Quote Post
ogk
сообщение Jan 12 2008, 09:09
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 46
Регистрация: 4-02-07
Пользователь №: 25 035



Цитата(ttron @ Jan 11 2008, 13:01) *
Видимо, в соответствии с номером ноты из таблицы выбирается код, соответствующий периоду (или полупериоду) частоты данной ноты, в данном случае выраженному в тактах опорной частоты, подаваемой на вход счетчика, задающего частоту ноты. Аналогично с длительностью - она тоже выражена в тактах счетчика, задающего длительность звучания ноты.
А вообще недурно бы давать ссылку или более внятно формулировать вопрос (в данном случае контекст абсолютно неясен, поэтому никто и не отвечает...)

Тем не менее - успехов.

Уважаемый ttron, я ссылку дал. Помогите разобраться с алгоритмом воспроизведения мелодии.
Go to the top of the page
 
+Quote Post
ttron
сообщение Jan 12 2008, 21:04
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 134
Регистрация: 1-06-05
Из: Москва
Пользователь №: 5 634



Цитата(ogk @ Jan 12 2008, 12:09) *
Уважаемый ttron, я ссылку дал. Помогите разобраться с алгоритмом воспроизведения мелодии.
При генерации мелодии на TMR0 подается тактовая частота 15625Гц (тактовая частота 1Мгц и предварительный делитель на 64), сам таймер используется для задания длительностей звучания нот и пауз. Минимальный дискрет времени определяется предустановкой TMR0 (это темп мелодии, сохраняемый в регистре SPEED). Например, при загрузке в него константы 140, время до установки флага T0IF составляет примерно 7.4мс
генерация ноты производится с помощью программного счетчика, тактируемого частотой 250кГц (цикл обновления = 4 программных такта, при том что длительность программного такта 1мкс) Таких счетчиков два: это программные циклы с метками S_label1 и S_label2. В этот счетчик загружается константа полученная при дешифрации кода ноты п/п Dc_tone. Например, для генерации ноты си 1-й октавы (494Гц) используется константа 252, которая при загрузке в вышеупомянутый программный счетчик обеспечивает длительность полупериода частоты тона ноты равный 252/250=1,008мс, что дает период равный 2.016мс или частоту 496Гц (погрешность воспроизведения частоты ноты). Таким образом расчет констант для нот должен был бы производиться по формуле: C=1/(2*F*0.000004)
Длительность ноты задается регистром DURATION, куда загружается код, полученный из дешифрации условной длительности задаваемой тремя младшими битами ноты. Например для "целой" ноты (условный код 100) в DURATION заносится 64, что при вышеуказанном темпе соответствует длительности ноты 473мс. Этот регистр уменьшается на 1 при каждом переполнении TMR0.
Собственно это все... Может я где-то ошибся, но думаю, дальше разберетесь самостоятельно, это просто сделать в симуляторе MPLAB. Успехов.


--------------------
"Регистрируй, наблюдай, экономь микросекунду, зря вопрос не задавай, не запоминай ерунду" (с) не помню, чье
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01388 секунд с 7
ELECTRONIX ©2004-2016