Трёхголосный тон-генератор.
(10.09.2007)
Перед повторением обязательно прочитать здесь.


3-voice tone-generator


Данный трёхголосный тон-генератор разработан для совместного использования с электронными часами с "кукушкой", но может использоваться и самостоятельно. Запуск мелодий может быть осуществлён через 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). Дальнейшие пути реализации могут быть различны.



Прошивки для PIC16F628A
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


Прошивки для PIC16F648A
Ver (History) Source Flash
2.1.0 *.asm *.hex


Таблицы мелодий
Ver 1 Ver 2
Набор 1 -
- Набор 1
- The Beatles
- Сектор Газа
Отладочный набор 1



Пока возникли две проблемы:

В связи с вышесказанным, приглашаю всех к сотрудничеству, для решения данных недостатков.

Вариант схемы, для отладки в программе-симуляторе "Proteus":

debug

Сам проект


Обсудить на форуме "Pro-radio"




Дополнения к статье (29.09.2007).

Итак. Положение вещей на данный момент следующее:

Из всего, сказанного в первой части, остались только второй метод записи мелодий, и управление световыми эффектами. Всё остальное было серьёзно переработано.

Во-первых, в четыре раза увеличена тактовая частота. В связи с чем, период USART теперь составляет 1024 мкС (скорость, соответственно - 976,5625 бод), а частотные последовательности выводятся на RB3, RB4 и RB5.



3-voice tone-generator 16-bit


Во-вторых, таблица частот переделана из 8-ми битной, в 16-ти битную, что позволило перекрыть весь нотный диапазон (согласно протокола MIDI). Однако, замечено, что края диапазона звучат плохо, поэтому весь диапазон* искусственно ограничен от ноты C3 до C8, включительно.

Стоит также отметить, что приемлемого результата удалось добиться только на более-менее приличных УНЧ и динамических головках. Из самых простых, это был TDA1904 со старой отечественной головкой 2ГД-38.

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



Demo1
Demo2
Demo3
Demo4
Demo5
Demo6
Demo7
Demo8

* - нумерация октав, согласно протоколу MIDI.




Дополнение к статье (22.10.2007).

Применив вместо PIC16F628A микроконтроллер PIC16F648A, удалось увеличить количество записанных мелодий примерно раза в три.

Схема подключения идентична.

Добавлены новые мелодии и демки.




НаписАть отзыв E-mail            Other electronics  Другая электроника

Home
На главную



счётчик посещений

Copyright © 2007 by Dmitry Dubrovenko.