Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.12.20;
Скачать: CL | DM;

Вниз

Midi 2 Beep-код   Найти похожие ветки 

 
Дмитрий С ©   (2015-02-05 18:30) [0]

Кто-нибудь встречал преобразователь Midi файла (одной из его дорожек) в код из beep и sleep ?


 
Kilkennycat ©   (2015-02-05 20:13) [1]

перегони миди в ваф, ваф это практически бип-слип


 
brother ©   (2015-02-05 20:18) [2]

ну, если в дорожке нет аккордов, то че бы нет? думаю чтение из миди реализовать не сложно, а далее вообще все просто...)


 
Kerk ©   (2015-02-05 20:33) [3]

Beep не работает давно...


 
Дмитрий С ©   (2015-02-05 22:48) [4]


> Beep не работает давно...

Работает в w8.1 у меня, только щелкает что-то. Да и мне для мк в итоге надо.


> brother

Изучаю вот по вике :)


 
Kilkennycat ©   (2015-02-05 22:50) [5]


> для мк в итоге надо

там pwm есть для этих целей. в подавляющем большинстве мк.


 
Дмитрий С ©   (2015-02-05 23:05) [6]


> Kilkennycat

Им и воспользуюсь) алгоритм на винде отлаживаю.


 
Германн ©   (2015-02-06 01:57) [7]


> Дмитрий С ©   (05.02.15 23:05) [6]
>
>
> > Kilkennycat
>
> Им и воспользуюсь) алгоритм на винде отлаживаю.
>

Как можно отлаживать алгоритм не видя (точнее не слыша) результата?
Отлаживать алгоритм на самом мк религия запрещает?


 
Inovet ©   (2015-02-06 03:22) [8]

Может, правильнее будет попросить кого, из музыкально образованных, чтобы для этой мелодии назвали ноты с их длительностями и паузами между ними? Так сказать, в разовом случае. И в нём же (разовом случае) - загрузить в любой МИДИ редактор, да и содрать оттуда.


 
KSergey ©   (2015-02-06 09:29) [9]

А в самом деле - что за задача-то? и какого плата миди-файл?
Это разово конкретный мидик надо преобразовать или постоянно-периодически?


 
Dimka Maslov ©   (2015-02-06 11:18) [10]


> Kerk ©   (05.02.15 20:33) [3]
>
> Beep не работает давно...


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


 
Дмитрий С ©   (2015-02-06 12:10) [11]

У меня сложилось впечатление, что я из пушки по воробьям. Мне нужна была одна мелодия (В траве сидел кузнечик) и моей нотной грамотности вкупе с викой хватило "преобразовать" ее вручную. С интервалами в припеве напутал, кажется, но не критично, звучит нормально.

вот пример:
procedure TForm1.Button1Click(Sender: TObject);
const
                                 // a    b    c    d    e    f    g    h    i    j    k    l     m
                                 // do   do#  re   re#  mi   fa   fa#  so   so#  la   la#  si  4 do
 Freqs1: array[0..12] of Integer = (262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,  523);
 Song = "4jejejii.ieieijj.jejejii.ieieij..jll8lll4mm8mmm4mljijj.jll8lll4mm8mmm4mljij..." ;
 L = 220;
var
 I, J, N: Integer;
 M: Integer;
begin
 Windows.Beep(1, 2000); // включение звуковой карты (можно убрать)
 M := 4;
 for J := 0 to 4 do
   for I := 1 to Length(Song) do
   begin
     if Song[I] = "." then
     begin
       Windows.Beep(20, (L) * 4 div M);
     end
     else
     if Song[I] in ["1".."9"] then
     begin
       M := Ord(Song[I]) - Ord("0");
     end
     else
     begin
       N := Ord(Song[I]) - Ord("a");
       if N <= 0 then
         Continue;
       Windows.Beep(Freqs1[N-1], L * 4 div M);
     end;
   end;
end;


 
Дмитрий С ©   (2015-02-06 12:15) [12]

Блин, я теперь себе хочу эту мелодию на рингтон:) Как? :))


 
SOFT_FOR_YOU ©   (2015-02-06 12:38) [13]

Мне понравилось :)


 
MonoLife ©   (2015-02-06 12:41) [14]

прикольно! Помню, давным-давно, на фоксе 2.0 писал бипом мелодию при этом по экрану еще и паровозик бегал с вагонами:) жаль исходники так на 286-ом и остались


 
Дмитрий С ©   (2015-02-06 13:33) [15]

Кстати, ошибка в строке
Windows.Beep(Freqs1[N-1], L * 4 div M);
Из-за чего вся мелодия на пол-тона ниже получилась:)


 
Dimka Maslov ©   (2015-02-06 14:50) [16]


> Блин, я теперь себе хочу эту мелодию на рингтон:) Как? :
> ))


Вот с этого и надо начинать. Современные телефоны спокойно воспроизводят midi файлы. Если нет, то нужен midi - редактор (любой, но советую MidiSoft Studio 95, но работает он только на виртуальной машине Windows 98). Мелодия там воспроизводится, записывается чем-то вроде SoundForge, записывается в mp3шечку и наступает счастье.


 
Дмитрий С ©   (2015-02-06 15:00) [17]


> Вот с этого и надо начинать.

Ну это все таки не главная задача, чтобы с нее начинать. Сопутствующая.


 
Inovet ©   (2015-02-06 18:15) [18]

Всё равно ФАЭМИ круче
http://www.youtube.com/watch?v=wudqDyxUnnI


 
Дмитрий С ©   (2015-02-06 18:57) [19]


> Inovet ©   (06.02.15 18:15) [18]

Ерунда какая-то


 
Inovet ©   (2015-02-06 19:23) [20]

> [19] Дмитрий С ©   (06.02.15 18:57)
> Ерунда какая-то

Ну не скажи, найди ещё один синтезатор, чтобы её уделал.


 
Kilkennycat ©   (2015-02-07 05:13) [21]

была у меня Фаэми... классная вещь!


 
Дмитрий С ©   (2015-02-08 11:38) [22]

Открытие дня. Pwm не годится для извлечения звуков :)


 
Kilkennycat ©   (2015-02-08 12:04) [23]

Мартышка к старости слаба глазами стала;
А у людей она слыхала,
Что это зло еще не так большой руки:
Лишь стоит завести Очки.
Очков с полдюжины себе она достала;
Вертит Очками так и сяк:
То к темю их прижмет, то их на хвост нанижет,
То их понюхает, то их полижет;
Очки не действуют никак.
"Тьфу пропасть! — говорит она, — и тот дурак,
Кто слушает людских всех врак:
Всё про Очки лишь мне налгали;
А проку на-волос нет в них".
Мартышка тут с досады и с печали
О камень так хватила их,
Что только брызги засверкали.

К несчастью, то ж бывает у людей:
Как ни полезна вещь, — цены не зная ей,
Невежда про нее свой толк все к худу клонит;
А ежели невежда познатней,
Так он ее еще и гонит.

И.А. Крылов. 1812 год.


 
Kilkennycat ©   (2015-02-08 12:09) [24]

http://www.pic24.ru/doku.php/osa/ref/appendix/quartet


 
Inovet ©   (2015-02-08 14:45) [25]

> [22] Дмитрий С ©   (08.02.15 11:38)
> Pwm не годится для извлечения звуков

Через beep и sleep? В общем да.


 
Дмитрий С ©   (2015-02-08 20:44) [26]


> Kilkennycat ©   (08.02.15 12:09) [24]

Мне такое и не снилось.

Кажется, я понял принцип. Попробую то же самое сделать на атмеге.


 
Kilkennycat ©   (2015-02-08 22:24) [27]

ты вот это глянь: http://www.pic24.ru/doku.php/osa/articles/vga_game там видео есть. со звуком ;)


 
Inovet ©   (2015-02-08 23:10) [28]

> [27] Kilkennycat ©   (08.02.15 22:24)
> http://www.pic24.ru/doku.php/osa/articles/vga_game

Круто.


 
Kilkennycat ©   (2015-02-09 00:13) [29]


> Inovet ©   (08.02.15 23:10) [28]

мне очень нравятся разработки Виктора Тимофеева, и как сделано, и стиль описания. Очень профессионально и оригинально.


 
кгшзх ©   (2015-02-09 10:47) [30]

http://www.youtube.com/watch?v=mBfovjFbNMU


 
brother ©   (2015-02-09 11:07) [31]

http://www.youtube.com/watch?feature=player_detailpage&v=ntYL_uKkblQ
круче


 
brother ©   (2015-02-09 11:13) [32]

и классика жанра
http://www.youtube.com/watch?v=B_Q6jMUdfYc


 
Дмитрий С ©   (2015-02-09 11:26) [33]


> Kilkennycat ©

Я правильно понимаю, что такую мелодию на пьезопищялке не сыграть?


 
Kilkennycat ©   (2015-02-09 13:37) [34]

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


 
Дмитрий С ©   (2015-02-09 16:53) [35]


> Kilkennycat ©

А как она может синусоиду выдать?

Windows.Beep(440) выдает на ноуте достаточно приятный слуху тон. Пьезопищалка - мерзкий, к тому же и не стабильный (возможно из-за ошибки в прошивке, я обычным ардуиновским tone проверял).


 
Kilkennycat ©   (2015-02-09 17:08) [36]


> Дмитрий С ©   (09.02.15 16:53) [35]

пъезопищалка может выдать синусоиду легко, если она достаточно большая, и лежит между синусоидными штампами.

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


> обычным ардуиновским tone

для меня это необычно.

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

Скажешь, что надо - скажу, как сделать.


 
Дмитрий С ©   (2015-02-09 17:26) [37]


> Kilkennycat ©   (09.02.15 17:08) [36]

Я что-то вроде музыкальной шкатулки делаю. Мелодия + 3 RGB диода под музыку меняют цвета с коротким fade эффектом (а может и без него, если тормозить будет), а после мелодии - более плавный fade эффект (режим ночника).

Плату я уже распаял и проверил. Осталось сделать прошивку.
Я собираюсь делать так же без ардуиновских заготовок. С помощью таймеров и ШИМ-а.


 
Дмитрий С ©   (2015-02-09 17:29) [38]


> Kilkennycat ©   (09.02.15 17:08) [36]

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


 
Дмитрий С ©   (2015-02-09 17:34) [39]

Посоветуй, стоит ли припаять кварц и получить 16 MHz или 8и будет достаточно для этой задачи?


 
brother ©   (2015-02-09 18:14) [40]

[37] хотелось бы посмотреть на готовый аппарат...


 
Дмитрий С ©   (2015-02-09 18:17) [41]


> brother ©   (09.02.15 18:14) [40]

Как будет готово видео выложу.


 
Kilkennycat ©   (2015-02-09 18:52) [42]


> стоит ли припаять кварц и получить 16 MHz или 8и будет достаточно
> для этой задачи?


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


 
Inovet ©   (2015-02-10 03:05) [43]

> [35] Дмитрий С ©   (09.02.15 16:53)
> А как она может синусоиду

Настоящие джедаи пишут "Синусойда" и для полного пассворда добавлялют "джа", а особо продвинутые в искусствах ингаляций знают тайное слово "Растафари".


 
Дмитрий С ©   (2015-02-10 23:19) [44]

Пока что-то не выходит:(

Настроил таймер в режиме ШИМ на частоте примерно 15KHz (8 битный таймер в два прохода на частоте генератора 8MHz. 8000000/512=15625).
Повесил прерывание на переполнение счетчика этого самого таймера (выполняется раз в 512 тактов процессора), где обновляю регистр сравнения шима (1 раз за 8 срабатываний таймера):

 tickCount ++;
 OCR1A = sinCache[(tickCount >> 3) % sizeof(sinCache)]; // (tickCount div 8) mod sizeof(sinCache);

Где:

volatile byte sinCache[64];
 for(int i =0; i<sizeof(sinCache); i++) {
   sinCache[i] = 127 + round(127*sin(6.283 * 440 * i / 1962)); // sin(2*pi*440*i/1962). 1962=15625/8
 }

Звук всеравно получается мерзский и даже рядом не стоит с частотой 440 Гц.


 
Kilkennycat ©   (2015-02-10 23:40) [45]

этот мк случайно не st7fox?


 
Дмитрий С ©   (2015-02-10 23:48) [46]


> Kilkennycat ©   (10.02.15 23:40) [45]

Нет. Atmega328, извлеченная из ардуиноподобной платы.


 
Kilkennycat ©   (2015-02-11 00:14) [47]

странно, что не угадал, ведь так мало вариантов было...
а как ты думаешь, есть ли какая-нибудь разница между микроконтроллерами, их компиляторами, конфигурацией?
и в чем выражается мерзский и даже рядом не стоит с частотой 440 Гц.?
какую частоту выдает?


 
Дмитрий С ©   (2015-02-11 00:40) [48]

Точно не скажу, но намного выше. Ощушение, что на  уши давит.
При это есть и более низкий звук с гуляющей частотой.

Я не настолько глубоко знаком с программированием мк. Я отключил все  прерывания, кроме своего, и не использовал ардуиновские функции в его обработчике
Это то что было в моих силах:)

Поискал ещё в ютубе мелодии на ардуино. - почти везде обычный писк (включение/выключение пина с заданной частотой). В одном месте я увидел идею, которая может сработать: формировать напряжение не с помощью pwm, а с помощью 8 ног МК и кучи резисторов. В этом случае,я полагаю, можно значительно увеличить частоту дискретизации. Хотя я, конечно, не уверен что проблема в ней.


 
Kilkennycat ©   (2015-02-11 00:47) [49]


> 8 ног МК и кучи резисторов

это примитивный цап


> Я не настолько глубоко знаком с программированием мк.

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


 
RWolf ©   (2015-02-11 01:01) [50]

Припаяйте какую-нибудь YM2149F и выгружайте в неё любую из статыщмильёнов спектрумовских чиптюнов.


 
Inovet ©   (2015-02-11 01:20) [51]

У тебя 15625 - это частота прерывайний? При этом ШИМ 8 бит? Тогда
15625 / 256 примерно 61 Гц. Откуда взялись 440?


 
Kilkennycat ©   (2015-02-11 02:20) [52]


> Откуда взялись 440?

че-нить включил прескалерное. нет данных, бесполезно гадать. 3 режима пвм, какой юзает - неясно. 8 или 16 бит - только со слов, инициализации невидно. информацию ищет на ютубе...


 
Дмитрий С ©   (2015-02-11 12:32) [53]

Настало время рассказать подробнее.

Сейчас я хочу сделать двухголосную полифонию с поддержкой аккордов (т.к. они есть в выбранной мной мелодии).

Я действительно искал примеры в ютубе, чтобы быть уверенным, что это возможно сделать на моем МК.

МК у меня следующий: Atmega328P-PU с ардуиновским бутлоадером. IDE: тоже ардуино. Компилятор в ней GCC. Сторонних библиотек никаких нет.

Кварц я не припаивал, и с помощью fuse битов включил встроенный в микросхему генератор 8МГц. Сделал я это давно и уже не помню как.

Схема подключения такая: одна нога динамика припаяна к ноге PB4, другая через резистор 120 Ом (корич,красн,корич) к PB1 (т.к. на ней выход выбранного мной таймера и ШИМ-а). Так же к контактам динамика я припаял конденсатор 0,1 мкф (вот такой http://neoviservis.narod.ru/images/cap_k10_17_104.jpg ).
Динамик вытащил из дешевой нокии (он состоит из пленочки, катушки и магнита).
На ногу PB4 я подаю просто минус. На ногу PB1 - ШИМ-сингал.

Была идея вместо минуса в PB4 припаять к другому ШИМ выходу этого же таймера (PB2), чтобы увеличить разрядность потока на 1 бит и увеличить амплитуду колебаний, путем поочередного включения шимов. Но пока до нее не дошел.

Скетч следующий:

volatile unsigned long tickCount = 0;
volatile byte sinCache[1024];

void setup() {
 Serial.begin(9600);
 
 // http://www.jameco.com/Jameco/workshop/JamecoBuilds/arduinocircuit_fig12.jpg
 pinMode(9, OUTPUT);  // Режим ноги PB1 (так что для ШИМа)
 pinMode(12, OUTPUT); // Режим ноги PB4
 digitalWrite(12, 0); // Минус на PB4
 
 for(int i=0; i<sizeof(sinCache); i++) {
   sinCache[i] = 127 + round(127*sin(2 * 3.1415926 * 440 * i / 15700));
   Serial.print(i);
   Serial.print(" ");
   Serial.println(sinCache[i]);
 }

 // Неинвертированный | Шим 8 бит http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_38.htm
 // и http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_43.htm
 TCCR1A = (1<<7) | (1<<0);

 // http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_39.htm
 TCCR1B = (1 << 0); // Без делителя частоты
 
 SREG |= (1<<7); // Глобальное разрешение прерываний.
 TIMSK1 = (1<<TOIE1); // Разрешить прерывание по переполнению Т1. (остальные выключены)
 
 // Для диагностики, значения не имеет:
 unsigned long predTickCount = tickCount;
 while(1) {
   Serial.print(OCR1A);
   Serial.print(" ");
   Serial.print(tickCount);
   Serial.print(" ");
   Serial.println(tickCount - predTickCount);
   predTickCount = tickCount;
   delay(1000);
 }
}

ISR(TIMER1_OVF_vect) {
 tickCount ++;
 // http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_43.htm
 OCR1A = sinCache[(tickCount) % sizeof(sinCache)];
}

void loop() {
}



Записать результат смогу вечером.


> Inovet ©   (11.02.15 01:20) [51]
> У тебя 15625 - это частота прерывайний? При этом ШИМ 8 бит?
>  Тогда
> 15625 / 256 примерно 61 Гц. Откуда взялись 440?

15625 раз в секунду таймер успевает дойти с 0 до 255 и затем до 0.
440 образуется путем формирования синусоиды с помощью изменения ширины ШИМ-а.


 
Kilkennycat ©   (2015-02-11 13:19) [54]


> Схема подключения такая: одна нога динамика припаяна к ноге
> PB4, другая через резистор 120 Ом (корич,красн,корич) к
> PB1 (т.к. на ней выход выбранного мной таймера и ШИМ-а).
>  Так же к контактам динамика я припаял конденсатор 0,1 мкф

то есть, если напутаешь с начальным состоянием порта мк, достигаешь тока в 40 миллиампер. Скоро пойдешь покупать новый проц.


 
RWolf ©   (2015-02-11 13:40) [55]

Ну, то есть, частота ШИМ 15625/2 = 7.8125 кГц?
Чтобы получить оценку верхней границы частот сигнала, делим ещё на 4. Грязноватый звук выйдет.


 
Дмитрий С ©   (2015-02-11 13:42) [56]


> то есть, если напутаешь с начальным состоянием порта мк,
>  достигаешь тока в 40 миллиампер. Скоро пойдешь покупать
> новый проц.

Вряд-ли. Во-первых динамик тоже имеет сопротивление, хоть и незначительное. Во-вторых, отлаживаюсь я на 3,3 В, а в итоге работать будет от 4,5 В (три батарейки по 1,5 В). Поэтому ток не превысит 40 мА и всегда будет являться допустимым.


 
Inovet ©   (2015-02-11 13:43) [57]

Т.е. ты исходил из предположения о сопротивлении динамика больше килоома, что-то мне кажется, что его сопротивление несколько десятков Ом, 32 Ома например. Про увеличение разрядности на 1 бит не понял, тем более не понял про увеличение амплитуды. Ладно. У тебя динамик воспроизводит эти твои 15625 Гц с соответсвующими артефактами. ФНЧ надо ниже настроить, да и усилитель надо бы сделать, хоть на одном транзисторе.


 
Дмитрий С ©   (2015-02-11 13:47) [58]


> Ну, то есть, частота ШИМ 15625/2 = 7.8125 кГц?
> Чтобы получить оценку верхней границы частот сигнала, делим
> ещё на 4. Грязноватый звук выйдет.

Почему на два делить?
15625, а по факту получается 15700, это грубо говоря количество минимумов на рисунке:
http://www.gaw.ru/im/_micros/avr/arh/34.gif
т.е. это и есть частота шима.

Можно по подробнее по поводу "делим еще на 4"?


 
Дмитрий С ©   (2015-02-11 13:51) [59]


> Inovet ©   (11.02.15 13:43) [57]

Я исходил из пункта "Во-вторых" из [56].

3,3 В / 120 Ом = 27,5 мА (при допустимых 50)
4,5 В / 120 Ом = 37,5 мА (при допустимых чуть более 40)

Что значит "ФНЧ надо ниже настроить" ?

Усилитель сделаю, как получу нормальный звук без него.


 
Inovet ©   (2015-02-11 13:53) [60]

> [59] Дмитрий С ©   (11.02.15 13:51)
> Что значит "ФНЧ надо ниже настроить" ?

Ты кондесатор тот на 0,1 мкФ от фонаря впаял?

> [59] Дмитрий С ©   (11.02.15 13:51)
> Усилитель сделаю, как получу нормальный звук без него.

Утром деньги, вечером стулья.


 
Inovet ©   (2015-02-11 13:55) [61]

Это если предположить, что в программе всё правильно сделано, и на вышоде действительно шим той синусоиды на 440 Гц, а не фигня какая-нибудь.


 
RWolf ©   (2015-02-11 13:59) [62]


> Почему на два делить?15625, а по факту получается 15700,

Всё верно, я уже прочитал выше.


>  Можно по подробнее по поводу "делим еще на 4"?

Ну, меня так учили: настраивай ФНЧ на четверть частоты ШИМ, чтобы полезный сигнал в звоне не тонул.


 
Дмитрий С ©   (2015-02-11 14:05) [63]

По-поводу увеличения битности и амплитуды вот мои соображения:

Мы имеем два 8-битных ШИМ выхода, подключаем к ним динамик, назовем их А и Б.

Далее формируем 9-битный сигнал: от -255 до 255. Пусть значение сигнала в рассматриваемый момент времени t: S(t).

Динамик расположен так, что его диафрагма двигается вверх и вниз.

Рассмотрим несколько ситуаций:

1. S(t) = 0.  На ноги А и Б одновременно подается 0 или 1. Диафрагма находится в нейтральном положении.
2. S(t) = 200 (т.е. >0). На ногу Б подается 0, на ногу А - ШИМ сигнал 200/255. Диафрагма находится выше нейтрального положения на 200/255 от предельного.
3. S(t) = -200 (т.е. <0). На ногу А подается 0, на ногу Б - ШИМ сигнал 200/255.
Диафрагма находится ниже нейтрального положения на 200/255 от предельного.

------------------------

Пока писал, пришел в голову другой вариант с одним ШИМ-ом. Положим, что нога А - ШИМ, а Б - обычная 0/1.

Рассмотрим несколько ситуаций:
1. S(t) = 0.  На ноги А и Б одновременно подается 0 или 1. Диафрагма находится в нейтральном положении.
2. S(t) = 200 (т.е. >0). На А - ШИМ сигнал 200/255, на Б - 0. Диафрагма находится выше нейтрального положения на 200/255 от предельного.
3. S(t) = -200 (т.е. <0). На А - ШИМ (255-200)/255, на ногу Б - 1. Диафрагма находится ниже нейтрального положения на 200/255 от предельного.

В итоге получаем, что диафрагма динамика перемещается не от 0 до 1, а от -1 до 1 (амплитуда увеличена в два раза), а сигнал получился 9 битный (-255 до 255).


 
Kilkennycat ©   (2015-02-11 14:09) [64]


> Поэтому ток не превысит 40 мА и всегда будет являться допустимым.

неверно.
во-первых, даже при 3.3 в. ток более 20 ма.
при 4.5 ты приблизился к максимальному значению потребления.
Напомню, что максимальное вовсе не равно номинальному.
ну и реализация моста на двух ногах... в момент переключения может выйти кака.


 
Дмитрий С ©   (2015-02-11 14:10) [65]


> Ты кондесатор тот на 0,1 мкФ от фонаря впаял?

Практически.
А вообще отсюда http://www.pic24.ru/doku.php/osa/ref/appendix/quartet


> Ну, меня так учили

Я правильно понял, частота дискретизации самого звука минимум в 4 раза меньше чем частота ШИМ-а должна быть?
На виндовом waveOut я проверил, что частоты дискретизации самого звука 1,96 кГц мне хватит, поэтому у меня даже с запасом.


var
 WF: tWAVEFORMATEX;
 WaveOutHandle: HWAVEOUT;
 i: Integer;

 Buf: array[0..3*8000-1] of byte;
 H: TWaveHdr;
begin
  wf.cbSize := SizeOf(wf);
 wf.wFormatTag:=WAVE_FORMAT_PCM;
 wf.nChannels := 1;    //1 канала
 wf.wBitsPerSample := 8;    //8 бит
 wf.nBlockAlign:=(wf.nChannels * wf.wBitsPerSample) div 8;
 wf.nSamplesPerSec := 1960;    //1,96 кГц
 wf.nAvgBytesPerSec := wf.nSamplesPerSec * wf.nBlockAlign;

 Winapi.Windows.Beep(880, 2000);
 for I := 0 to Length(Buf) - 1 do
 begin
   if I < 8000 then
     Buf[I] := ( 127 +  Round(127 * ( Sin(2 * Pi * I * 880 / wf.nSamplesPerSec) )))
   else
   if I < 16000 then
     Buf[I] := ( 127 +  Round(127 * ( Sin(2 * Pi * I * 440 / wf.nSamplesPerSec) )))
   else
     Buf[I] := ( 127 +  Round(127 * ( Sin(2 * Pi * I * 440 / wf.nSamplesPerSec) + Sin(2 * Pi * I * 880 / wf.nSamplesPerSec) )/2));

 end;
 ZeroMemory(@H, SizeOf(H));
 H.lpData := PAnsiChar(@Buf);
 H.dwBufferLength := SizeOf(Buf);
 H.dwBytesRecorded := 0;
 H.dwFlags := WHDR_INQUEUE;
 H.dwLoops := 10;

 waveOutOpen(@WaveOutHandle, WAVE_MAPPER, @wf, 0, 0, WAVE_ALLOWSYNC or CALLBACK_NULL);
 waveOutPrepareHeader(WaveOutHandle, @H, sizeof(H));
 waveOutWrite(WaveOutHandle, @H,sizeof(H));
 waveOutReStart(WaveOutHandle);
end;


 
Дмитрий С ©   (2015-02-11 14:14) [66]


> неверно.
> во-первых, даже при 3.3 в. ток более 20 ма.
> при 4.5 ты приблизился к максимальному значению потребления.
>
> Напомню, что максимальное вовсе не равно номинальному.
> ну и реализация моста на двух ногах...
>  в момент переключения
> > может выйти кака.


Там в любом случае ШИМ сигнал - даже за пределами этого тока - маловероятно что МК испортится. И при 3.3 V допустимый ток - 50 мА - это из описания МК.

А до "каки" еще дойти нужно:) Учитывая что выходы на одном порту будут, то переключатся они будут одновременно практически. Не знаю, правда, как конденсатору будет от этого:) Но, повторюсь, до этого еще дойти нужно.


 
Inovet ©   (2015-02-11 14:16) [67]

> [65] Дмитрий С ©   (11.02.15 14:10)
> Практически.
> А вообще отсюда

Ну так там сколько написано? 78 кГц, а у тебя 15 кГц.


 
Дмитрий С ©   (2015-02-11 14:17) [68]


> Ну так там сколько написано? 78 кГц, а у тебя 15 кГц.

Если хочешь помочь - помоги, а это я и сам вижу :(


 
Inovet ©   (2015-02-11 14:24) [69]

> [68] Дмитрий С ©   (11.02.15 14:17)

На 78 уже сам динамик добавит фильтрации, потому что не воспроизведёт такую частоту и будет усреднять. А 15 воспроизведёт достаточно хорошо, надо фильтровать сильнее, увеличь ёмкость конденсатора до 0,5 мкФ.


 
Дмитрий С ©   (2015-02-11 14:32) [70]

Пока у меня идея: увеличить частоту ШИМа.

И следующие идеи:
1. Сделать формирования ШИМ-сигнала вручную с периодом 128, вместо 512, тем самым увеличить частоту в 4 раза, до примерно 62 кГц. Пожертвовав 1-им битом звуковой полосы.

2. Впаять кварц на 16 или 20 МГц. Для 8-битного шима, получаем: 20MHz/256 = 78 КГц - уже лучше.

Интересно: а можно переключаться *на ходу* между внешним кварцем и внутренним генератором?


 
Kilkennycat ©   (2015-02-11 14:45) [71]


> Там в любом случае ШИМ сигнал - даже за пределами этого
> тока - маловероятно что МК испортится. И при 3.3 V допустимый
> ток - 50 мА

не в любом случае. есть три случая, когда его там не будет. в момент включения, при сбое-зависании и при ошибке.
и там не допустимый, а максимальный. работа на максимальном ни чем не гарантированна, попадется один мк - проработает долго, другой - сдохнет сразу.
и где ты увидел в даташите 50? там 40. И ты говорил, что 3.3 - это отладка, а работа при 4.5, как-то странно, обычно отлаживают-тестируют в рабочем или более экстремальном режиме, но никак наоборот


> а можно переключаться *на ходу* между внешним кварцем и
> внутренним генератором?


читай даташит. там все есть.


 
RWolf ©   (2015-02-11 15:24) [72]


> Дмитрий С ©   (11.02.15 14:32) [70]
> Пока у меня идея: увеличить частоту ШИМа. И следующие идеи:
> кварц на 16 или 20 МГц.

есть специальные меги с встроенным умножителем частоты ШИМ.


 
Kilkennycat ©   (2015-02-11 16:13) [73]


> 2. Впаять кварц на 16 или 20 МГц. Для 8-битного шима, получаем:
>  20MHz/256 = 78 КГц - уже лучше.

я могу на твоей атмеге при внутреннем генераторе 8 МГц получить шим максимально 4 МГц... просто почитал даташит. еще и занижать придется.


> 20MHz/256 = 78 КГц - уже лучше.

формула неверна. в даташите иной расчет.


 
Дмитрий С ©   (2015-02-11 16:35) [74]


> я могу на твоей атмеге при внутреннем генераторе 8 МГц получить
> шим максимально 4 МГц... просто почитал даташит. еще и занижать
> придется.

Так я хочу программный шим сделать. Перевести таймер в обычный режим. А в прерывании на достижении таймером определенного значения обновлять настройки таймера так, чтобы получить шим длиной 128 тактов, вместо 512, который является минимальным аппаратным.

Хотя, конечно, в крайних положениях обработчику не хватит времени выполниться.

Выходит что этот МК неспособен сделать то что я от него хочу?


 
RWolf ©   (2015-02-11 16:40) [75]

Чем Fast PWM не угодил?


 
Дмитрий С ©   (2015-02-11 16:55) [76]


> RWolf ©   (11.02.15 16:40) [75]

Начал искать что это такое и нашел клевую статью, как раз на похожую тему.

http://easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-shim.html

Спасибо.

P.S. Кто-нить знает места в Москве, куда можно придти поработать с этим всем и где будет оборудование (паяльник, осциллограф) и возможно советчик:)


 
Kilkennycat ©   (2015-02-11 17:53) [77]


> Так я хочу программный шим сделать.

зачем? есть замечательный аппаратный, и не один, можно полифонию забабахать. меньшими усилиями. а ты хочешь программный.... развивая идею дальше, тебе и мк не нужен будет - несколько резисторов, счетчик ИД, одна ЛА3 и операционный усилитель.


 
RWolf ©   (2015-02-11 17:57) [78]


>  [77]

Есть замечательные аппаратные музыкальные процессоры за сущие копейки. Вся эта возня с шимами не стоит домашнего применения; я понимаю, если в серийном приборе — там надо экономить.


 
Дмитрий С ©   (2015-02-11 18:49) [79]


> Kilkennycat ©   (11.02.15 17:53) [77]

У аппаратного частота слишком маленькая.


> RWolf ©   (11.02.15 17:57) [78]

Ну уже поздно, устройство уже собрано. А идея "забабахать" полифонию пришла уже после того как я его собрал.


 
Kilkennycat ©   (2015-02-11 20:17) [80]


> У аппаратного частота слишком маленькая.

вовсе нет... ты просто не чувствуешь.
сам подумай - чем обусловлено наличие аппаратного шима? неужели разработчики занизили его б частотную характеристику, к коему нет никаких предпосылок, в угоду чему либо? размышляй объективно, что разработчики мк несколько сильнее тебя и меня вместе взятых (и это так), и невозможность извлечь правильный звук, это не их косяк, а наш.
попробуй осознать шим, что это не только частота, т.е. отношение периода к единице, но и скважность и длительность, что существует множество режимов шим, которые позволяют моделировать в какой-то степени и ам и чм модуляцию, там такие звуки можно извлекать, что просто жуть. Вся фишка именно в осознании того, как это работает.
в противном случае проще потратить 3*N+1 резисторов и собрать примитивный Цап и гнать 8(16)-битный wav


 
Inovet ©   (2015-02-11 20:32) [81]

> [80] Kilkennycat ©   (11.02.15 20:17)
> 8(16)-битный wav

на 16 надо резисторы точные и остальное тоже.


 
Kilkennycat ©   (2015-02-11 20:35) [82]


> Inovet ©   (11.02.15 20:32) [81]

ну, разрядность на точность не скоро влиять начинает, если погрешность резисторов не успевает перекрываться. можно и 5%, если допустимы высокие сопротивления


 
Inovet ©   (2015-02-11 20:36) [83]

берём километр провода отрезаем кусок 0,01 м, припаеваем, потом 0,02 м, припаеваем и заканчиваем куском 655,36 м. С частотой только проблемы возникнут.


 
Inovet ©   (2015-02-11 20:38) [84]

> [82] Kilkennycat ©   (11.02.15 20:35)
> можно и 5%

Ну можно и одинаковых кусков нарезать, но с точностью 0,001%.


 
Inovet ©   (2015-02-11 21:09) [85]

Удалено модератором


 
Дмитрий С ©   (2015-02-12 13:32) [86]

Вчера удалось получить частоту ШИМ-а в 80 KHz в режиме Fast PWM, путем большого количества проб. И я почитал даташит, на удивление, понятный для меня документ.

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


 
Дмитрий С ©   (2015-02-14 21:50) [87]

Вроде получил нормальный звук, но очень тихий. Ребят, подскажите, как сделать простой усилитель на транзисторе?


 
Kilkennycat ©   (2015-02-14 23:57) [88]

ГУГЛ


 
Дмитрий С ©   (2015-02-15 13:00) [89]


> Kilkennycat ©   (14.02.15 23:57) [88]

Тоже верно, но одних знаний недостаточно, нужен и опыт еще.

В общем собрал я простой усилитель + еще воткнул между базой транзистора и землей конденсатор на 10 микрофарад - звук стал намного лучше. Я думаю придется его подбирать.

Теперь вот большой вопрос, а как две частоты соединять? Т.е. есть два сигнала, как получить из совмещенный?


 
Kilkennycat ©   (2015-02-15 13:34) [90]

гугл микшер


 
RWolf ©   (2015-02-15 18:18) [91]

что с чем мешать? в этом аппарате два шима, что ли?


 
Inovet ©   (2015-02-15 18:58) [92]

> [91] RWolf ©   (15.02.15 18:18)
> в этом аппарате два шима, что ли?

Видать, не осилил программное смешивание.


 
Дмитрий С ©   (2015-02-15 18:58) [93]


> RWolf ©   (15.02.15 18:18) [91]

Нет, шим1. Программно смешать две частоты.

Есть 8-битный звуковой синусовидный сигнал (всегда положительный) частотой 440 Гц. Функция S1(x) возвращает значение этого сигнала, где X - шаг дискретизации.
Соответственно S1(x) может принимать значения от 0 до 255.

Есть аналогичный сигнал, но частотой, к примеру, 523 Гц, его функция S2(x).

И есть 8-битный регистр OUT, куда я кладу значение сигнала (суммарного)  каждый шаг дискретизации.

С одним сигналом (одной частотой) все получилось в порядке: получается достаточного качественный звук (приемлемый для меня, с учетом усилителя и фильтра).

А вот с двумя вообще не понятно как их суммировать.
В выбранной мной мелодии есть аккорды и в сумме требуется до 4 сигналов одновременно играть.
Средним арифметическим что ли? В этом случае меня смущает то, что один сигнал будет в 4 раза тише играть, пока остальные молчат.

На данный момент я добился следующих показателей:
Скорость 8-битного ШИМ-а 31250 Гц. (можно увеличить за счет разрядности шима).
Частота дискретизации 7812 Гц. (можно увеличить до примерно 15 кГц).


 
Kilkennycat ©   (2015-02-15 19:07) [94]

а я бы просто взял ARM Cortex M3 и забабахал бы мп3 проигрывание. За один день.


 
Inovet ©   (2015-02-15 19:10) [95]

> [93] Дмитрий С ©   (15.02.15 18:58)
> что один сигнал будет в 4 раза тише играть, пока остальные молчат.

А должн так же что ли? т.е. звучат четыре ноты или вообще иструмента все вместе с максимальным уровнем, затем три замолкают и внезапно оставшаяся начинает звучать громче, как все четыре вместе до этого. Интересный подход. Имей ввиду, что изменения уровня звука слух воспримет совсем не так, как ты думаешь.


 
Inovet ©   (2015-02-15 19:14) [96]

И насчёт смешивания. Просто складывай их и всё, только в записи нот кроме номера ноты и длительности надо ещё сохранять уровень, или хотя бы на каждую партию общий для всех нот.


 
Дмитрий С ©   (2015-02-15 19:20) [97]


> Inovet ©   (15.02.15 19:14) [96]

Т.е. складывать и делить на их количество, правильно?

Я проанализировал проект квартета, ранее упомянутого в ветке. Там похоже так и делается.


 
Inovet ©   (2015-02-15 19:24) [98]

> [97] Дмитрий С ©   (15.02.15 19:20)
> Т.е. складывать и делить на их количество, правильно?

На ходу я бы не стал делить, лучше бы заранее при отладке, или как тут этот процесс уже назвать - сведении, ага, один раз всё сдалал чтобы оно нормально звучало, а при воспроизведении только складывал.


 
Kilkennycat ©   (2015-02-15 19:25) [99]


> Т.е. складывать и делить на их количество, правильно?

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


 
Inovet ©   (2015-02-15 19:28) [100]

> [99] Kilkennycat ©   (15.02.15 19:25)

Да всё правильно он говорит - тише будет, должен, а не будет, так вылезет в переполнение. А ШИМ там или другой вид модуляции - дело второе.


 
Дмитрий С ©   (2015-02-16 10:54) [101]


> Kilkennycat ©   (15.02.15 19:25) [99]

Оставим пока модуляцию, для начала нужно решить что именно модулировать.

Вот графики функций, описывающих 440 Гц и 523 Гц (100 делений по Х в секунду).
Соответственно синим и зеленым.

Оранжевым - их сумма. Наглядно видно, что сумма выходит за рамки [-1; 1] и не сложно установить, что ее рамки [-2; 2]. Но канал у нас [-1; 1], и соответственно результат надо в него как-то вписать.

http://yotx.ru/#!1/2_h/sH@1v7Rgzhf23/aH/zYv9i34gh/K/t/wPhGztgABC8BwaBDra3Dg529w/2STTsxs4p4/F0i/G4dXmxu/8PhG/sgAFA8B74bOdie@vgYHf/YJ9Ew24cMB63Lk4Zjwe7@/9A@MYOGAAE74FBoIPtrYODXeg/EL6xAwYAwXvgs52L7a2Dg939g30SDbuxc3bGeNzaumQ8biF29wEH

Остается два варианта:
А) делить на 2.
Б) найти другой способ суммирования.

Твои предложения?


 
Дмитрий С ©   (2015-02-16 11:31) [102]

Среднее арифметическое мне кажется самым хорошим вариантом.
Но возникают вопросы:
А если частот будет 4 или 50 и какие то из них будут сильными, а какие то нет, + их сила будет меняться со временем, то на сколько делить?


 
Дмитрий С ©   (2015-02-16 12:57) [103]

Послушав какие бывают мелодии и придя к выводу, что слишком затяну время и результат будет так себе. Я решил пойти по пути примерно> Kilkennycat ©   (15.02.15 19:07) [94].
Припаяю что-нибудь вроде http://amperka.ru/product/df-player-mp3-module , а через ADC буду уже "ловить" звук и подсвечивать цветы своей композиции.
Осталось только с динамиком определиться :)

Всем большое спасибо за терпение и советы!


 
Kilkennycat ©   (2015-02-17 00:08) [104]


> Дмитрий С ©   (16.02.15 12:57) [103]

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


 
KSergey ©   (2015-02-17 09:22) [105]

> Дмитрий С ©   (05.02.15 18:30) 
> Кто-нибудь встречал преобразователь Midi файла (одной из его дорожек) в код из beep и sleep ?

А вот это выделенное - сразу было в вопросе?
если да - то позор мне, не заметил ключевого момента


 
brother ©   (2015-02-17 11:14) [106]

да, тк редактировать сообщения пользователю после отправки нельзя...


 
Дмитрий С ©   (2015-04-30 13:51) [107]

В общем забил я на полифонию. Сделал обычным бипом.

Получилось вот что:

http://www.youtube.com/watch?v=aV42lAC04v4


 
RWolf ©   (2015-04-30 13:58) [108]

Как-то тихо совсем, поближе микрофон переставь, что ли.
И что за неведомые проблемы с полифонией, после такого-то обсуждения?


 
Дмитрий С ©   (2015-04-30 14:33) [109]


> RWolf ©   (30.04.15 13:58) [108]

Я не добился приемлемого качества за отведенное время. По мне так 8 МГц не хватает для полифонии.


 
Inovet ©   (2015-04-30 14:51) [110]

> [109] Дмитрий С ©   (30.04.15 14:33)
> По мне так 8 МГц не хватает для полифонии.

И как только раньше на всяких 4 МГц i8086, уж не говоря про i8080, Z80 и т.п., исхитрялись делать...


 
Inovet ©   (2015-04-30 14:54) [111]

> [107] Дмитрий С ©   (30.04.15 13:51)
> Получилось вот что:

Это что ли "Катюша" в джазовой обработке?


 
RWolf ©   (2015-04-30 15:05) [112]


> [109]

В одной моей поделке на атмеге 14 Мгц три голоса играют не напрягаясь. Можно было бы и ещё добавить.


 
Дмитрий С ©   (2015-04-30 17:31) [113]


> И как только раньше на всяких 4 МГц i8086, уж не говоря
> про i8080, Z80 и т.п., исхитрялись делать...

Может там отдельный звуковой генератор какой-то был?
Предположим 8 битный звук.
Где-то в ветке читал, что желательно, чтобы PWM успел 4 раза досчитать до конца.
256 * 4 = 1024 такта. При частота дискретизации 8000Hz, получаем 8192000 такта в секунду. Четырех МГц явно не должно хватать. Хотя на 8и можно и еще поиграться. Но это потом, в свободное время.


> В одной моей поделке на атмеге 14 Мгц три голоса играют
> не напрягаясь.

Не затруднит код показать? Интересно как сделал.


 
RWolf ©   (2015-04-30 19:50) [114]


> [113]

Код закрытый, но тут все принципы уже обсудили: прерывания по таймеру с частотой 28 кГц, нота пропускается через таблицу синусов, таблицы громкостей, получается текущее значение звукового давления в канале. Повторить для всех каналов, смешать результаты, обновить управляющий регистр ШИМ.



Страницы: 1 2 3 вся ветка

Текущий архив: 2015.12.20;
Скачать: CL | DM;

Наверх




Память: 0.81 MB
Время: 0.008 c
2-1403699566
CodeDrunk
2014-06-25 16:32
2015.12.20
Проектирование БД


15-1429741804
Юрий
2015-04-23 01:30
2015.12.20
С днем рождения ! 23 апреля 2015 четверг


2-1403613872
Dennis I. Komarov
2014-06-24 16:44
2015.12.20
function Format


15-1423150223
Дмитрий С
2015-02-05 18:30
2015.12.20
Midi 2 Beep-код


2-1403498172
Sakipiel
2014-06-23 08:36
2015.12.20
не отрабатывает событие дабл клик для некоторых компонентов