Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2015.12.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.8 MB
Время: 0.004 c
15-1429825354
Rouse_
2015-04-24 00:42
2015.12.20
К девятому мая


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


15-1429522423
pavelnk
2015-04-20 12:33
2015.12.20
По Андроиду


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


2-1403699566
CodeDrunk
2014-06-25 16:32
2015.12.20
Проектирование БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский