Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Послевыборно-осенний 8бит антидеприсант (00)


Послевыборно-осенний 8бит антидеприсант (00)

Сообщений 1 страница 17 из 17

1

Вот и осень наступила, холода, отсутствие отопления да ещё и грязные выборы. Опять жульё, опять распродажа ресурсов, опять нищебродство и отсутствие медицины.
Чтоб не упасть в отчаянную депрессию, так как на работе задерживают зарплату и если её выдадут, то вместе с зарплатой...вообщем созрело одно устройство.
Помните, барабанчик шарманку времён СССР?
http://s7.uploads.ru/t/gEflv.jpg

Два дня не мог вспомнить название мелодии и кажись вспомнил!!! Но скажу позже.
Спасибо Radan за чудную статью -Синтезатор речи RC2 на AVR (говорилка), опять выручила.
Нашел в VK звук ноты, отрезал кусок и получил блок DATA, длиной 22кБ. Впихнул его в контроллер, приправил RND функцией, изменяя тональность скоростью воспроизведения и получил ожидаемое:

Осталось теперь запихнуть ноты, вот тут то и проблема!
Прошивку попробую ужать до Atmega8, но врят-ли получится  :glasses:

Пример звука (форум не пускает его целиком):

Код:
16044:
' C:\Users\RADIOKSTOVO\YandexDisk-rprmsr\Ðàçðàáîòêà\Èãðóøêà\Êàìåðòîí3.ddd
....
Data &H6F , &H75 , &H39 , &H2C , &HAE , &HA1 , &H7B , &HA0 , &HCF , &HDF , &HFF , &HFF , &HFF , &HFF , &HFF , &HED
Data &HB0 , &H7B , &HB3 , &H7F , &H50 , &H6B , &H43 , &H25 , &H25 , &H9F , &H61 , &H5A , &H78 , &H1E , &H88 , &H63
Data &H1C , &H63 , &H89 , &H63 , &H1B , &H7C , &HCA , &H7C , &H86 , &HB4 , &HCE , &HEE , &HFF , &HFF , &HFF , &HFF
Data &HFF , &HBF , &H63 , &H80 , &HB3 , &H28 , &H68 , &H37 , &H19 , &HC , &H41 , &H58 , &H35 , &H61 , &H17 , &H26
Data &H66 , &H9 , &H24 , &H6D , &H57 , &HF , &H3A , &HAD , &H78 , &H6F , &H93 , &HB3 , &HD5 , &HFB , &HFF , &HFF
Data &HE8 , &HFF , &HC0 , &H8A , &H6C , &HB5 , &H34 , &H67 , &H44 , &H20 , &H12 , &H18 , &H6A , &H44 , &H43 , &H3A
Data &HD , &H74 , &H2E , &H1E , &H53 , &H64 , &H41 , &H1B , &H96 , &H9D , &H69 , &H88 , &HB3 , &HCC , &HED , &HFF
Data &HFF , &HFF , &HFF , &HDA , &HB3 , &H71 , &HA8 , &H91 , &H64 , &H62 , &H45 , &H31 , &H14 , &H7D , &H68 , &H4B
Data &H81 , &H1F , &H70 , &H86 , &H30 , &H54 , &H87 , &H76 , &H27 , &H83 , &HCA , &H94 , &H94 , &HC7 , &HD4 , &HF5
.......

Таймер:

Код:
Config Timer1 = Pwm , Compare A Pwm = Clear Up , Prescale = 1

Вывод звука:

Код:
  
Read D
   Pwm1a = D
пауза - Waitus от 3 до 110

+1

2

Вы как всегда поражаете своим нестандартным подходом, супер!  :cool:

Ev3658 написал(а):

Пример звука (форум не пускает его целиком)

Не понял, много текста не лезет в пост форума?

В ручке используется энкодер? Хотя как понимаю, там и кнопки хватит, но не будет того самого эффекта вращения...

0

3

https://youtu.be/CzP58IwkXCg?t=2m44s

0

4

RDW написал(а):

там и кнопки хватит

Я так и делал, просто энкодер самый простой механизм, он и в мышке есть и в магнитоле.

RDW написал(а):

https://youtu.be/CzP58IwkXCg?t=2m44s

Чудно, но в СССР была калинка малинка, точно помню  :D

Во, картина чуток прояснилась.

Тут уже массив с нотами и массива с пропуском щелчков для пауз.

Отредактировано Ev3658 (2016-09-21 17:22:36)

+1

5

5 баллов! :)

0

6

Отказался от прерывания и даже подпрограммы не нужны стали, Lookup упростил всё в разы.
Угощайтесь, рабочее  :glasses:

http://s3.uploads.ru/t/JtGVd.jpg


Код:
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 96
$swstack = 96
$framesize = 96

Config Timer1 = Pwm , Compare A Pwm = Clear Up , Prescale = 1

Kn1 Alias Pind.2                                            'порт кнопки

Config Portb.1 = Output                                     'порт таймера на выход
Config Portd.2 = Input                                      'порт кнопки на вход


Dim Z1 As Word                                              'номер ШИМ в звуке мелодии при воспроизведении
Dim Dlina As Word                                           'длина звука в блоке DATA

Dim D As Byte                                               'временная переменая

Dim Takt As Byte                                            'такт - номер ноты в блоке DATA музыки
Dim Tim1 As Byte                                            'таймер для опроса кнопки
Dim Speed As Byte                                           'скорость воспроизведения (тональность)
Dim Tr1 As Byte                                             'для определение НАЖАТ-Отжат - кнопка
Dim Muz As Word                                             'длина блоа DATA мелодии, в конце блока должно стоять значение 255 !!!!!!!!!!!!!!!! ВАЖНО!
Dim Paus As Byte                                            'переменная для тональности (пауза задержки ШИМ) - SPEED минус значение ноты
Dim Nota As Byte                                            ' Читаемая нота, если равна нулю, то доигрывает предыдущую и тем самым делает паузу
Dim Razbros As Byte                                         'разница тональности между нотами

Pwm1a = 255                                                 'если холодно, поставьте ноль, динамик будет жарить.


Z1 = 1                                                      'при запуске дренькаем
Dlina = 20716                                               'кол-во в блоке DATA звука
Speed = 80                                                  'скорость вывода звука (чем больше, тем ниже частота ноты)
Razbros = 5                                                 'номер ноты умножается на это число и минусуется из скорости вывода звука, получается разброс нот
Paus = Speed


' Определяем длину нот в музыке, обязательно в конце блока DATA музыки должно стоять 255, ноль в блоке DATA означает пропуск ноты!!!!
Do                                                          'начало бесконечного цикла прогарммы

D = Lookup(z1 , Muzik)                                      'читаем блок DATA музыки

If D = 255 Then                                             'ищем 255, если не находим, зависаем или глючим
   Muz = Z1                                                 'запоминаем конец блока DATA музыки
   Exit Do                                                  'выходим из цикла DO LOOP для продолжения программы
End If
Incr Z1                                                     'прибавляем Z1=Z1+1 и ищем...ищем 255 в блоке DATA музыки, чтоб понять, какая она длиной
Loop

'================================= НАЧАЛО ВЕСЕЛЬЯ =========================================

Do
'------------------- Воспроизведение ноты
If Z1 > 0 Then                                              'при нуле молчим
   Z1 = Z1 + 1                                              'можно и Incr Z1

   If Z1 => Dlina Then                                      'если ноту доиграли, сбрасываем и ждём следующего такта
      Z1 = 0
   End If

   D = Lookup(z1 , Blok)                                    'читаем блок DATA ноты
   Pwm1a = D                                                'выводим ШИМ звука
   Else                                                     'если не играем, то отключаем выход звука
      Pwm1a = 255                                           'чтоб динамик не вонял
End If

Waitus Paus                                                 'главная пауза прогарммы, определяющая тон ноты
'-------------------- Опрос кнопки и тактирование музыки
Incr Tim1                                                   ' нужна, чтоб опрашивать кнопку не так быстро
If Tim1 = 100 Then                                          ' опрашиваем кнопку через каждые 100 штук Waitus Paus
   Tim1 = 0                                                 'сбрасываем, чтоб потом опросить кнопку

   If Kn1 = 0 And Tr1 = 1 Then                              'ждём отжатия кнопки после её нажатия
      If Z1 = 0 Or Z1 > 1300 Then                           'если не играем или проиграли достаточно, переключаем такт (другую ноту)
         Incr Takt                                          'такт +1
         If Takt => Muz Then Takt = 0                       'возвращаем мелодию в самое начало после того, как проиграли
         Nota = Lookup(takt , Muzik)                        'читаем ноту из блока DATA
         If Nota > 0 Then                                   'если нота есть (0=пауза), то запускаем процесс вывода звука
               Z1 = 1
               Paus = Nota * Razbros                        'рассчитываем разброс частоты ноты
               Paus = Speed - Paus                          'высчитываем тональность ноты
         End If
      End If
      Tr1 = 0                                               'сбрасываем нажатие кнопки для ожидания следующего нажатия
   End If

   If Kn1 = 1 And Tr1 = 0 Then Tr1 = 1                      'ждём нажатие кнопки и переходим в ожидание отжатия

End If


Loop                                                        'конец бесконечного цикла программы

'Блок DATA мелодии

Muzik:
Data 10 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 0 , 0 , 5 , 0 , 6 , 0 , 8 , 0 , 0 , 0 , 0 , 5 , 0 , 6 , 0 , 8 , 0 , 0 , 0 , 0 , 6 , 0 , 5 , 0 , 3 , 0 , 0 , 0 , 0
Data 10 , 0 , 10 , 0 , 0 , 8 , 0 , 0 , 0 , 0 , 6 , 0 , 5 , 0 , 6 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 0 , 0 , 5 , 0 , 6 , 0 , 8 , 0 , 0 , 0 , 0 , 6 , 0 , 5 , 0 , 3 , 0 , 0 , 0 , 255


'Блок DATA звука

Blok:

Data &H52 , &H49 , &H46 , &H46 , &HE4 , &H50 , &H0 , &H0 , &H57 , &H41 , &H56 , &H45 , &H66 , &H6D , &H74 , &H20
Data  &h10 , &h0 , &h0 , &h0 , &h1 , &h0 , &h1 , &h0 , &h11 , &h2B , &h0 , &h0 , &h11 , &h2B , &h0 , &h0
Data  &h1 , &h0 , &h8 , &h0 , &h64 , &h61 , &h74 , &h61 , &hBF , &h50 , &h0 , &h0 , &hB5 , &h8F , &h56 , &hBD
............................. На воруме нельзя выложит ьтакое кол-во символов, в файле ниже

Исходник - https://yadi.sk/d/653fwzmCvY6g3

Отредактировано Ev3658 (2016-09-23 10:29:13)

+6

7

а как достигали плавности затухания звука?

0

8

Александр Д. написал(а):

а как достигали плавности затухания звука?

Записал звук в формате WAV 11кГц 8bit, после воспользовался программой из проекта Синтезатор речи RC2 на AVR (говорилка), которая перевела этот WAV в текст (блок) DATA, вышло 21кб.
Ещё для плавности в конце можно ШИМ уменьшить циклом.  Тональность регулировал меняя скорость воспроизведения блока DATA.

0

9

Оригинально!

0

10

Решил эту вещь увековечить на нашем сайте - http://bascom.at.ua/publ/posharmanim/1-1-0-134

+2

11

Ev3658, есть вопрос.
Блок DATA звука - в какой последовательности ноты идут, если нужно другую мелодию закодировать?

0

12

radan написал(а):

Ev3658, есть вопрос.
Блок DATA звука - в какой последовательности ноты идут, если нужно другую мелодию закодировать?

Если блок дата нот, то с первой и дальше, конец блока обозначается значением "255"
0=пауза, а другие значения меняют тональность, примерно по номерам музыкальных нот.
Если блок дата звука - то это звук WAV, который выводится со скоростью/тональностью согласно данным из блока даты нот )

Если нужно сделать паузу между нотами, то ставится нужное кол-во нулей. Каждое значение в блоке дата, это такт импульса крутилки/энкодера. По этому тут пауза делается пропуском тактов.

radan написал(а):

Решил эту вещь увековечить на нашем сайте - http://bascom.at.ua/publ/posharmanim/1-1-0-134


Мне уже друзья ссылки скидывают, удивляются ))))

Отредактировано Ev3658 (2016-11-30 14:53:36)

0

13

Я немного не то имел ввиду.
WAV - с какой ноты идёт? Ну там до, ре или ми.
Т.е. если у меня такая мелодия - до ре ми до ре, какие цифры в блоке дата нот должны стоять?

0

14

radan написал(а):

Я немного не то имел ввиду.
WAV - с какой ноты идёт? Ну там до, ре или ми.
Т.е. если у меня такая мелодия - до ре ми до ре, какие цифры в блоке дата нот должны стоять?


У меня WAV один, это 1 нота. Паузой между вывtдения ШИМ (скорость воспроизведения) меняется его тональность, так и получается разный звук ноты.
Звук большой, увесистый, все ноты не запихнуть, одну то еле-еле.
Сам звук имеет минимальное время звучания (если быстро крутить) и максимальное (если остановить).
Так-же при пропусках тактов крутилки, звук обязан доигрываться, от сюда и сложность кода.

Два блока DATA.
Блок Muzik: - ноты мелодии, где 0 пропуск такта и 255 - конец блока.
Блок Blok: - сам звук 1 эталонной ноты, из него и делается все ноты.

0

15

Ой, понял вопрос, вот, мне в VK подсказали:
http://s4.uploads.ru/t/4V57A.jpg

1 клетка - одна шестнадцатая такта. Цифра 1-7 до--си
это чисто мелодия "калинка" не полная, упрощенная и зацикленная
без припева "Ах под сосною под зелёную..."
http://s6.uploads.ru/t/lt17L.jpg

А так, меня ещё Youtub учил:

+1

16

Вот спасибо, теперь всё понятно.
Будем зимний антидепрессант делать.

0

17

radan написал(а):

Вот спасибо, теперь всё понятно.
Будем зимний антидепрессант делать.

Тогда с АКБ, в старый холодильник, с кривым от машины и на улицу  :cool: с сабом  :D
Кстати, реально ведь. У меня от машины два АКБ полудохлых есть, не разряжаются, но и для стартера уже никак. Надо найти какую нибудь бочку и замутить подобное  8-)

Отредактировано Ev3658 (2016-11-30 16:31:36)

0


Вы здесь » Программирование ATMEL в BASCOM. » Готовые конструкции » Послевыборно-осенний 8бит антидеприсант (00)