roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 16:31

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Как подключить к МК пищалку?
СообщениеДобавлено: 20 июн 2010, 11:13 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2008, 21:15
Сообщения: 4130
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич
Да не нужны там вычисления вообще! Вычислить заранее, в программе использовать константы вычисленные. Вот этот кусок :

Код:
   switch(g_pMelody[nNoteO]) {
      case 0:
         return -1;
      case 'C':    
         if(g_pMelody[nNoteO+1] != '#') {
            fFreq = 261.63; //До
         } else {
            fFreq =   277,18; //До диез
            ++nNoteO;
         }
         break;
      case 'D':
         if(g_pMelody[nNoteO+1] != '#') {
            fFreq = 293,66; //Ре
         } else {
            fFreq = 311,13; //Ре диез
            ++nNoteO;
         }
         break;
      case 'E':
/* blah-blah*/
      default: fFreq = -1; break;
   }
   if(fFreq > 0) {
      nFreq = F_CPU / ((fFreq * 4/*транспозиция*/)*2*8/*предделитель*/);
      //Выяснение октавы, коррекция частоты
      switch(g_pMelody[++nNoteO]) {
         case '0':
            nFreq <<= 1;
            ++nNoteO;
            break;            
         case '1':
            ++nNoteO;
            break;            
         case '2':
            nFreq >>= 1;
            ++nNoteO;
            break;
         case '3':
            nFreq >>= 2;
            ++nNoteO;
            break;
         case '4':
            nFreq >>= 3;
            ++nNoteO;
            break;
         default:
            break;
      }
   } else {
      nFreq = 0;
      ++nNoteO;
   }


переписать так:

Код:
   switch(g_pMelody[nNoteO]) {
      case 0:
         return -1;
      case 'C':    
         if(g_pMelody[nNoteO+1] != '#') {
            nFreq = 956; //До
         } else {
            nFreq =   902; //До диез
            ++nNoteO;
         }
         break;
      case 'D':
         if(g_pMelody[nNoteO+1] != '#') {
            nFreq = 851; //Ре
         } else {
            nFreq = 804; //Ре диез
            ++nNoteO;
         }
         break;
      case 'E':
/* blah-blah*/
      default: nFreq = 0; break;
   }
   if(nFreq > 0) {
      //Выяснение октавы, коррекция частоты
      switch(g_pMelody[++nNoteO]) {
         case '0':
            nFreq <<= 1;
            ++nNoteO;
            break;            
         case '1':
            ++nNoteO;
            break;            
         case '2':
            nFreq >>= 1;
            ++nNoteO;
            break;
         case '3':
            nFreq >>= 2;
            ++nNoteO;
            break;
         case '4':
            nFreq >>= 3;
            ++nNoteO;
            break;
         default:
            break;
      }
   } else {
      ++nNoteO;
   }

_________________
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подключить к МК пищалку?
СообщениеДобавлено: 20 июн 2010, 17:18 
Не в сети
Аватара пользователя

Зарегистрирован: 17 ноя 2009, 16:21
Сообщения: 85
Откуда: Москва
прог. языки: C/C++/C#
ФИО: Олег Козлов
И то верно! :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подключить к МК пищалку?
СообщениеДобавлено: 22 июн 2010, 10:31 
Не в сети
Аватара пользователя

Зарегистрирован: 17 ноя 2009, 16:21
Сообщения: 85
Откуда: Москва
прог. языки: C/C++/C#
ФИО: Олег Козлов
Сделал всё же разбор текстовой нотации до проигрывания - перевожу в промежуточный формат в динамически выделенном куске памяти. Режим таймера генерирующего частоту перевёл в CTC, двойная буферизация всё же работала, хоть и не всегда, от этого при частом изменении периода счетчика на уменьшение появился неприятный эффект:

Вложение:
FastPWM_WorkBad.jpg
FastPWM_WorkBad.jpg [ 49.91 КиБ | Просмотров: 1773 ]
"Ручная" двойная буферизация теперь выглядит так:
Код:
//Запуск генерации звука
void go_buzz(int nFreq) {   
   //Локальная переменная для считывания счетчика тайтмера
   int nCounter;
   //Установка значения счётного регистра
   OCR3A = nFreq;
   //Проверка на "перепрыгивание" предела
   nCounter = TCNT3;
   if(nCounter >= nFreq) {
      TCNT3 = nFreq - 1;
   }      
   //Запуск таймера с предделителем 8
   TCCR3B |= 1<<CS31;
}


1. Реализовал задание темпа проигрывания в bpm.
2. Реализовал линейные "слайды" - плавный переход между нотами, в нотации выглядит так: "C2>C1:16"(перейти от До второй октавы до До первой за 1/16).

Осталось из намеченного:

1. Параболические "слайды" - линейные больно "роботские" :)
2. Вибрато - небольшие регулярные колебания частоты несколько раз в секунду.
3. Знаки повторения блоков в нотации: "(C:4 M:4 )3 F:8 G:8 C2:4" (повторить первый блок три раза, потом перейти к дальнейшему проигрывнию). Без этого сильно пухнет нотация при записи реальных мелодий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подключить к МК пищалку?
СообщениеДобавлено: 28 июн 2010, 15:49 
Не в сети
Аватара пользователя

Зарегистрирован: 17 ноя 2009, 16:21
Сообщения: 85
Откуда: Москва
прог. языки: C/C++/C#
ФИО: Олег Козлов
Параболические слайды не слух почти не отличаются от линейных, поэтому реализовал их, послушал и выбросил. В остальном всего добился - чуть достругаю демострационную пикалку и изложу результаты в виде библиотечки для пищалки.
:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подключить к МК пищалку?
СообщениеДобавлено: 23 июл 2010, 13:02 
Не в сети
Аватара пользователя

Зарегистрирован: 17 ноя 2009, 16:21
Сообщения: 85
Откуда: Москва
прог. языки: C/C++/C#
ФИО: Олег Козлов
Хочу оформить свой код как библиотечку и снять видео-демку о её возможностях: для записи видео не хватает мощности пищалки (в то время как человек её прекрасно слышит).

Можно ли подключить вместе с пищалкой разъем миниджек 3.5 и подключить внешние активные колонки? Если да, то как реализовать схему отключения пищалки при втыкании разъема от колонок?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подключить к МК пищалку?
СообщениеДобавлено: 26 июл 2010, 10:37 
Не в сети
Аватара пользователя

Зарегистрирован: 17 ноя 2009, 16:21
Сообщения: 85
Откуда: Москва
прог. языки: C/C++/C#
ФИО: Олег Козлов
Разобрался. :)

Отключение чего-либо при втыкании штекера реализовано механически в разъемах миниджеков, а подключить наушники\активные колоники можно, по крайней мере у меня заработало без дыма.

Дальше планирую сделать видео-демку и в рамкай её разработки додумать несколько фишек:

1. Прерывание основной мелодии для проигрывания спецэффекта (другой мелодии). Например на фоновой музыке в тетрисе иногда нужно проигрывать улюлюканье при уничтожении линии, фоновая мелодия при этом должна не останавливаться, а просто проигрываться молча.

2. Проигрывание заранее скомпилированной в байт-код мелодии, для экономии памяти и вообще удобства (п.1 как раз требует реализации этого пункта) - один раз отпарсил нотацию, а дальше хранишь или передаёшь на удалённый МК только самую суть.

3. Отслеживание позиции проигрываемой ноты в текстовой нотации. Это демонстрационно-отладочный режим, сделаю его подключаемым на макросах.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 31


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO