Цитата:
|
С помощью данного синтезатора можно имитировать игру пианина в пределах одной октавы
|
Причем, именно пианинА. (Если правильно, то пианинО ) Такая вот очень странная пиёнина, в которой
"Если нажаты сразу несколько кнопок, то частота звучания будет соответствовать среднеарифметической частоте нажатых клавиш". Это совсем не правильно. Лучше в тексте программы эту функцию убрать нафик, поскольку извлекаемый в таком случае "среднеарифметический" тон не будет иметь ничего общего с общепринятыми нотами.
Разница в частотах между двумя нотами, например,
до и
ре математически равна корню 12-й степени из 2 в квадрате. Кроме случая с нотами
ми -
фа и
си -
до- там разница равна корню 12-й степени из 2. Частота ноты
ля должна быть кратна 440 Гц. Октава - это разница в 2 раза по частоте.
Конечно, если следовать алгоритму автора, то есть всего лишь 256 значений для частоты. Такие вот хреновые ноты получаются.
Если же автор проекта попытался вычислением среднеарифметической частоты имитировать звучание аккорда, то есть когда нажаты 3 и более клавиш, то это не правильно. В аккорде должны звучать одновременно три и более разных тона (частоты), соответствующих нажатым клавишам. Да и диапазон клавиатуры тогда всяко превысит одну октаву, да и потребуется все 12 клавиш в октаве - без них никак, октава делится на 12 равных интервалов с разницей между ними в корень 12-й степени из 2. Да и клавиши в аккорде нажимаются не "отфанаря", а строго определенные.
(вон уважаемый st__1 дофига знает по этой теме, ыгыгыг)
Поэтому - я за то, чтобы
убрать совсем такую затею со среднеарифметическим - упростится код, существенно разгрузятся вычисления. Лучше уж дописать фильтр нажатия клавиш, чтобы звучала какая-либо одна нота.
Насколько я понимаю, частота тона синтезируется методом изменения периода ШИМ регистром PR2, а скважность импульсов постоянна и равна 2.
EEPROM контроллера всего 256 байт.
По-хорошему, нужно бы сохранять значения не только длительности и ноты, но и паузы между нотами. Есть такие мелодии, где паузы просто необходимы. Например, когда одна и та же нота повторяется несколько раз через промежутки. Да хотя бы если вспомнить мелодию "в траве сидел кузнечик" - видно, что есть паузы между фразами.
Да и вообще, тогда воспроизводимая мелодия будет больше похожа на ту, что игралась пальцами.
Проигрывание мелодии не должно вызывать затруднений - ну просто еще одна кнопка на свободном порту с опросом состояния. В случае выявления нажатия - переход к чтению EEPROM с нулевого адреса, формированию длительности и высоты нот и паузы. Конец записанной мелодии определяется, когда очередной прочитанный байт будет содержать код ("стоп-байт"), сформированный после окончания записи последней ноты. Ну или по достижению последнего адреса EEPROM.
И не забыть блокировать реакцию на нажатия всех кнопок кроме одной (пуск-стоп) во время проигрывания записанной мелодии.
Итого, получается блокизаписи по 3 байта - высота ноты, ее длительность и длительность паузы между нотами.
Вот и выходит, что из 256 байт остается только 85. Но этого, думаю, для коротенькой мелодии всяко хватит. На крайняк, если 85 нот не достаточно, можно установить внешнюю память по последовательному интерфейсу - благо, свободны линии, по которым можно организовать SPI или I2C интерфейс.
Но это, имхо, излишне, ибо сам алгоритм утройства слишком уж примитивный и неправильный. Годится разве что натыкать "в траве сидел кузнечик".
Цитата:
|
считываются комбинация нажатых клавиш.... игру пианина ..... Пока есть свободной место для записи ... в соответствии с новой комбинации клавиш
|
Афтар чета падежи не вяжет ваасче.