ogk 0 8 января, 2008 Опубликовано 8 января, 2008 · Жалоба В программе (ПРИМЕР из интернета) нота кодируется одним байтом. 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 Спасибо всем, кто поможет разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ttron 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба В программе (ПРИМЕР из интернета) нота кодируется одним байтом. 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 Спасибо всем, кто поможет разобраться. Видимо, в соответствии с номером ноты из таблицы выбирается код, соответствующий периоду (или полупериоду) частоты данной ноты, в данном случае выраженному в тактах опорной частоты, подаваемой на вход счетчика, задающего частоту ноты. Аналогично с длительностью - она тоже выражена в тактах счетчика, задающего длительность звучания ноты. А вообще недурно бы давать ссылку или более внятно формулировать вопрос (в данном случае контекст абсолютно неясен, поэтому никто и не отвечает...) Тем не менее - успехов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a_electronic 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба Ноты кодируются обычно при помощи коэффициента деления, т.е. числа. которое надо загрузить в программируемый делитель для получения требуемой частоты. Ноты отличаются друг от друга на коэффициент корень из 12, отличие не должно превышать 0.3% - иначе ухо, незнакомое с медвежьими стопами, почувствует фальш. Существуют "оптимальные" коэффициенты деления, это низшее значение коэффициента деления, отклонения последующих его произведений на корень из 12 для 11 значений не превышает требуемых 0.3%. Наименьший из них - 116. Это будет верхняя нота. Следующая за ней вниз будет 116 * корень из 12 и т.д. Если ориентироваться на абсолютный слух, то ля первой октавы - это 440 гц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
INT1 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба 5ти бит будет маловато :-), вот статья: music_scale.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ogk 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба Спасибо всем. А вообще недурно бы давать ссылку или более внятно формулировать вопрос (в данном случае контекст абсолютно неясен, поэтому никто и не отвечает...) Тем не менее - успехов. Вот ссылка http://www.pic16.nm.ru/site/elka/elka.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ttron 0 11 января, 2008 Опубликовано 11 января, 2008 · Жалоба Ноты кодируются обычно при помощи коэффициента деления, т.е. числа. которое надо загрузить в программируемый делитель для получения требуемой частоты. Ноты отличаются друг от друга на коэффициент корень из 12, отличие не должно превышать 0.3% - иначе ухо, незнакомое с медвежьими стопами, почувствует фальш. Существуют "оптимальные" коэффициенты деления, это низшее значение коэффициента деления, отклонения последующих его произведений на корень из 12 для 11 значений не превышает требуемых 0.3%. Наименьший из них - 116. Это будет верхняя нота. Следующая за ней вниз будет 116 * корень из 12 и т.д. Если ориентироваться на абсолютный слух, то ля первой октавы - это 440 гц Небольшое уточнение... Корень 12-й степени из 2, т.е. 2^(1/12) - поскольку октавы различаются по частотам в 2 раза, а в октаве 12 нот (считая всякие диезы и бемоли). В остальном все логично Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ogk 0 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба Видимо, в соответствии с номером ноты из таблицы выбирается код, соответствующий периоду (или полупериоду) частоты данной ноты, в данном случае выраженному в тактах опорной частоты, подаваемой на вход счетчика, задающего частоту ноты. Аналогично с длительностью - она тоже выражена в тактах счетчика, задающего длительность звучания ноты. А вообще недурно бы давать ссылку или более внятно формулировать вопрос (в данном случае контекст абсолютно неясен, поэтому никто и не отвечает...) Тем не менее - успехов. Уважаемый ttron, я ссылку дал. Помогите разобраться с алгоритмом воспроизведения мелодии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ttron 0 12 января, 2008 Опубликовано 12 января, 2008 · Жалоба Уважаемый 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. Успехов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ogk 0 14 января, 2008 Опубликовано 14 января, 2008 · Жалоба Спасибо ttron! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться