![]() |
Данный трёхголосный тон-генератор разработан для совместного использования с электронными часами с "кукушкой", но может использоваться и самостоятельно. Запуск мелодий может быть осуществлён через USART (1 стоповый бит, без контроля чётности, скорость – 244,140625 бод, период передачи одного бита, при этом составляет 4096 мкС), или кнопкой, вручную. К в/у часам, устройство подключается к порту RB5, а для микроконтроллера часов, используется соответствующая "прошивка".
Посредством USART (вывод 7 микроконтроллера) тон-генератор реагирует на две однобайтовые команды: b'01010000' и b'01010001'. При этом запускаются мелодии, присвоенные нулевому и первому "посылу", соответственно.
Кнопкой SA3 запускается проигрывание мелодии присвоенной нулевому "посылу". При следующем нажатии, начинается проигрывание мелодии, присвоенной первому "посылу", при следующем нажатии, опять нулевому, и так далее. Во время воспроизведения, кнопкой SA2, можно менять, так же "по кольцу", проигрываемую мелодию. При этом она автоматически запоминается, для выбранного "посыла", в энергонезависимой памяти микроконтроллера. Выключение воспроизведения осуществляется через аппаратный сброс MCLR, нажатием на кнопку SA1.
Во время проигрывания, синхронно с мелодией, воспроизводимой по 1-му каналу, на портах RA0-RA2, последовательно, появляются высокие логические уровни. Их можно использовать для управления световыми эффектами.
Проект является открытым, поэтому любой может скорректировать список воспроизводимых мелодий по своему вкусу. При добавлении новой мелодии, необходимо внести коррективы в секции программы: "work Bits" (изменить константу MXS), "Обработка данных из USART" (добавить строку goto playtuneN, где N – порядковый номер добавляемой мелодии), "Выбор мелодии, в зависимости от нажатой кнопки" (задать имена меток и темп воспроизведения добавляемой мелодии), ну, и конечно, необходимо записАть саму мелодию.
tunN0 | |||
1. | retlw | BRP | |
2. | retlw | .2 | |
3. | retlw | BRP | |
4. | retlw | .5 | |
5. | retlw | D4 | |
6. | retlw | CEL/.8 | |
----- | ----- | ----- | |
11. | retlw | PAU | |
12. | retlw | CEL/.8 | |
13. | retlw | REP | |
14. | retlw | .9 | |
----- | ----- | ----- | |
31. | retlw | D4 | |
32. | retlw | CEL/.8 | |
33. | retlw | PAU | |
34. | retlw | CEL/.8 | |
35. | retlw | COA | |
36. | retlw | A3 | |
37. | retlw | CEL/.8 | |
38. | retlw | PAU | |
39. | retlw | CEL/.8 | |
40. | retlw | REP | |
41. | retlw | .38 | |
42. | retlw | D4 | |
43. | retlw | CEL/.8 | |
----- | ----- | ----- | |
48. | retlw | PAU | |
49. | retlw | CEL/.8 | |
50. | retlw | MND | ; Конец мелодии |
Начало - метка вида tunN0. N – номер мелодии в памяти программ. 0 – означает, что мелодия предназначена, для канала 0 (для двух других каналов, необходимо указывать tunN1 и tunN2, соответственно).
Непосредственно нота записана в строках 5-6. Здесь сперва идёт высота ноты (D4 – нота "ре" 4-й октавы), а затем длительность (CEL/.8 – одна восьмая). Если нота имеет нестандартную длительность, например три четверти, то запись должна быть такой: CEL*.3/.4. Возможно записывать длительности от 1/32, до 7 целых (CEL/.32 и CEL*.7, соответственно).
В строках 11-12 записана пауза (PAU), между нотами. Правила записи, для неё, такие же, как и для нот.
В строках 3-4 указаны: начало цикла повтора (BRP), и количество циклов (допустимые значения – 1-255, хотя, при значении 1, фрагмент проиграется один раз, и, соответственно, смысла в данных строках, при этом, никакого нет). А в строках 13-14 – окончание цикла повтора (REP), и величина (допустимые значения: 1-255), на которую необходимо уменьшить "счётчик мелодии", что бы попасть на начало цикла (14-5=9). Циклы могут быть вложенными, т.е. во фрагменте, ограниченном BRP-REP, может находиться ещё один такой фрагмент, в нём ещё один, и так далее (всего – 24 уровня, независимо для каждого канала).
Строка 50 (MND) указывает на окончание мелодии, для данного канала. Является обязательной, для каждого из каналов, даже если в нём полностью отсутствует мелодия.
Предусмотрена возможность не только простого повтора фрагмента, но и использование разных окончаний. В реализации данной функции, и заключается разница двух способов.
1-й способ приведён в в/у примере. Данный пример также содержит вложенный цикл (строки 3-14). Начало же цикла с различными окончаниями, обозначено в строках 1-2.
Строка 35 (COA) указывает на начало различных окончаний. Алгоритм работы, при этом такой: дойдя до строки 35 (COA), программа проверит проигрывание последнего повтора. Если повтор не последний, будут проиграны строки 36-39. Затем, "счётчик мелодии" будет скорректирован на величину, указанную в REP (41-3=38), и фрагмент мелодии будет проигран опять (включая вложенный цикл – строки 3-14). Если же повтор последний (в данном примере, это будет второе проигрывание, но может быть и больше, вплоть до 255), строки 36-41 будут пропущены, и будет осуществлено дальнейшее проигрывание (со строки 42).
Данные конструкции могут так же содержать вложенные уровни. Количество уровней входит в число вложений обычных повторов.
Ограничение данного варианта записи: В промежутке COA-REP не должно быть никаких вложенных циклов.
2-й вариант, не имеет ограничений на вложения, и, кроме того, позволяет проигрывать не только различные окончания, но и разные начала. Достигнуто это, путём добавления двух строк, после COA, прямо указывающих величину коррекции "счётчика мелодии", при не последних (допустимые значения – 2-255), и последнем (допустимые значения – 1-255) повторах.
1. | retlw | BRP | |
2. | retlw | .2 | |
3. | retlw | A4 | |
4. | retlw | CEL/.16 | |
----- | ----- | ----- | |
9. | retlw | A5 | |
10. | retlw | CEL/.16 | |
11. | retlw | COA | |
12. | retlw | .10 | |
13. | retlw | .1 | |
14. | retlw | C5 | |
15. | retlw | CEL/.16 | |
----- | ----- | ----- | |
20. | retlw | G5 | |
21. | retlw | CEL/.16 | |
22. | retlw | C6 | |
23. | retlw | CEL/.16 | |
----- | ----- | ----- | |
36. | retlw | PAU | |
37. | retlw | CEL/.16 | |
38. | retlw | REP | |
39. | retlw | .28 | |
В данном примере, алгоритм работы следующий:
В строках 1-2 (BRP) задаётся начало первого начала (прошу прощения за тавтологию) и общее количество проигрываний фрагмента. Если необходимо проиграть два различных начала, то, на данный параметр, вступает в силу ограничение, единственное значение – 2.
В строке 11 (COA), программа проверяет наличие последнего повтора. Если повтор не последний, "счётчик мелодии" корректируется на значение в строке 12, и далее мелодия будет проигрываться со строки 22 (12+10=22).
В строке 38 (REP), если повтор не последний, будет осуществлёна корректировка "счётчика мелодии" на величину, в строке 39. Если необходимо проиграть два различных начала, необходимо перейти на строку 11 (COA) (39-11=28).
Программа опять проверит наличие последнего повтора, и, если он – последний, осуществит коррекцию "счётчика мелодии" на величину, указанную в строке 13. То есть, будут проигрываться строки, начиная с 14-й.
Если же указать, в 39 строке, переход на строку 3, первое начало будет проиграно ещё раз.
Полученные частотные последовательности присутствуют на выводах RA3 (канал 0), RA6 (канал 1), RA7 (канал 2). Дальнейшие пути реализации могут быть различны.
Ver (History) | Source | Flash |
1.1 | *.asm | *.hex |
1.1r | - | *.hex |
1.2.0r | *.asm | *.hex |
1.2.1r | *.asm | *.hex |
1.3.0r | *.asm | *.hex |
1.4.0r | *.asm | *.hex |
1.4.0d | *.asm | *.hex |
2.1.0 | *.asm | *.hex |
Ver (History) | Source | Flash |
2.1.0 | *.asm | *.hex |
Ver 1 | Ver 2 |
Набор 1 | - |
- | Набор 1 |
- | The Beatles |
- | Сектор Газа |
Отладочный набор 1 |
![]() |
Итак. Положение вещей на данный момент следующее:
Из всего, сказанного в первой части, остались только второй метод записи мелодий, и управление световыми эффектами. Всё остальное было серьёзно переработано.
Во-первых, в четыре раза увеличена тактовая частота. В связи с чем, период USART теперь составляет 1024 мкС (скорость, соответственно - 976,5625 бод), а частотные последовательности выводятся на RB3, RB4 и RB5.
![]() |
Во-вторых, таблица частот переделана из 8-ми битной, в 16-ти битную, что позволило перекрыть весь нотный диапазон (согласно протокола MIDI). Однако, замечено, что края диапазона звучат плохо, поэтому весь диапазон* искусственно ограничен от ноты C3 до C8, включительно.
Стоит также отметить, что приемлемого результата удалось добиться только на более-менее приличных УНЧ и динамических головках. Из самых простых, это был TDA1904 со старой отечественной головкой 2ГД-38.
Выкладываю несколько демонстрашек. Поскольку приличного микрофона сейчас нет, сигнал был подан прямо на вход звуковой карты. Запись делалась второпях (как всегда ), поэтому присутствуют некоторые огрехи.
* - нумерация октав, согласно протоколу MIDI.
Применив вместо PIC16F628A микроконтроллер PIC16F648A, удалось увеличить количество записанных мелодий примерно раза в три.
Схема подключения идентична.
Добавлены новые мелодии и демки.