roboforum.ru

Технический форум по робототехнике.

Как подключить к МК пищалку?

Re: Как подключить к МК пищалку?

blindman » 20 июн 2010, 11:13

Да не нужны там вычисления вообще! Вычислить заранее, в программе использовать константы вычисленные. Вот этот кусок :

Код: Выделить всёРазвернуть
   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;
   }

Re: Как подключить к МК пищалку?

Kozinaka » 20 июн 2010, 17:18

И то верно! :D

Re: Как подключить к МК пищалку?

Kozinaka » 22 июн 2010, 10:31

Сделал всё же разбор текстовой нотации до проигрывания - перевожу в промежуточный формат в динамически выделенном куске памяти. Режим таймера генерирующего частоту перевёл в CTC, двойная буферизация всё же работала, хоть и не всегда, от этого при частом изменении периода счетчика на уменьшение появился неприятный эффект:

FastPWM_WorkBad.jpg
FastPWM_WorkBad.jpg (49.91 КиБ) Просмотров: 1772
"Ручная" двойная буферизация теперь выглядит так:
Код: Выделить всёРазвернуть
//Запуск генерации звука
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: Как подключить к МК пищалку?

Kozinaka » 28 июн 2010, 15:49

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

Re: Как подключить к МК пищалку?

Kozinaka » 23 июл 2010, 13:02

Хочу оформить свой код как библиотечку и снять видео-демку о её возможностях: для записи видео не хватает мощности пищалки (в то время как человек её прекрасно слышит).

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

Re: Как подключить к МК пищалку?

Kozinaka » 26 июл 2010, 10:37

Разобрался. :)

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

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

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

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

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


Rambler\'s Top100 Mail.ru counter