Прерыватель для (DR)SSTC i3.

А что мы делаем?
Aneg
Сообщения: 17
Откуда: Украина

Сообщение Aneg » 07 янв 2012, 20:58

А как воспроизвести на тесле wav файл?

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 08 янв 2012, 00:24

А как воспроизвести на тесле wav файл?

Никак. Такого режима не будет. Будет аудио-ин, но до него я еще не добрался и с ним еще не все вполне ясно.

Аватара пользователя
Intra
Сообщения: 95
Откуда: Волгоград

Сообщение Intra » 08 янв 2012, 12:00

Вроде бы баг с одинаковыми нотами легко убирается на уровне миди запрещением повторяющихся частот?

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 08 янв 2012, 12:21

Intra, бага на уровне миди и не будет. Он будет только в режиме "мегамодулятора".

Аватара пользователя
Intra
Сообщения: 95
Откуда: Волгоград

Сообщение Intra » 11 янв 2012, 17:31

Увидел у тебя видео, есть идея. Можно переназначить в сырцах периферию с мк в твоём проэкте на периферию мк STM32-Discovery?
Плюсы:
Не нужно делать плату, на собственном опыте убедился, что делать плату дома - это нупростопиздец. а такую компактную с смд и TQFP....
Не надо ничего паять. простая коммутация проводами внутри экранированного корпуса и все разъёмы крепятся к стенкам корпуса без пайки (в т.ч. и кнопки).
Минусы: ?
PROFIT!!! ^^'

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 11 янв 2012, 17:51

Можно переназначить в сырцах периферию с мк в твоём проэкте на периферию мк STM32-Discovery?

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

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 12 янв 2012, 12:33

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

Aneg
Сообщения: 17
Откуда: Украина

Сообщение Aneg » 13 янв 2012, 05:43

BSVi писал(а):разгреб почту и задания, связанные с другими проектами

Задания для тебя отправляют по электронной почте? Кто же тогда ставит перед тобой эти задания?

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 17 янв 2012, 18:37

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

Естественно, ничего не мешает мне заниматься и прерывателем, пока есть передышка от драйверов, просто основной упор будет на драйвере :)

Аватара пользователя
Intra
Сообщения: 95
Откуда: Волгоград

Сообщение Intra » 21 янв 2012, 21:04

Когда я перечислял варианты комбинаций режимов, то говоря о "левая часть клавиатуры идёт в одну теслу", а "правая часть клавиатуры - во вторую теслу" я имел ввиду это)) http://www.youtube.com/watch?v=Mnnw8ckfgZ8
Интересно, это сложно реализовать.. ^,..,^

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 21 янв 2012, 21:18

Реализовать не сложно, но это уже после релиза всей основной функциональности, но я запишу в список хотелок. Я вижу это так - в двух прерывателях настраиваются фильтры - от и до какой ноты играть, они соединяются последовательно в MIDI цепочку и вуаля.

Сейчас я полностью погруз в новом драйвере. Он обещает быть мегаэпичным.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 29 янв 2012, 22:35

Итак, немного вернулся к i3. Сделал фазолинейный выход. Смысл в том, что когда играет нота, если приходит она-же, но с другим pitch bend'ом, или просто, она-же, был слышен разрыв. То есть, нота на мгновение прекращала звучать, потом, продолжала. Вот, исправил этот недостаток.

Появилась небольшая беда. Я думал, что получится не заморачитваться, и считать частоту ноты в тупую:

Код: Выделить всё

    uint32 GetOod(uint8 note, uint8 pitch)
    {
        return (uint32)(1000000.0f / (440.0f * exp2f(((note-69) * 100 + pitch)/1200.0f)));
    }


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

Nuendo->Midi yoke->Midi to serial->Usb to Uart->Uart (38400)->i3 midi receiver->i3 midi player->i3 output dirvier.

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

Аватара пользователя
Intra
Сообщения: 95
Откуда: Волгоград

Сообщение Intra » 30 янв 2012, 20:11

С Днём Рождения!

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 31 янв 2012, 14:19

С Днём Рождения!

Спасиб! :)

Написал буфер для нот. Штука получилась довольно сложной. Она решает в какой последовательности играть ноты, и что делать с теми нотами, которые еще нажаты. Вот, к примеру вот такая последовательность нот:

sequence.gif
sequence.gif (3.69 КБ) 24284 просмотра


В случае одноголосного синтезатора, после отпускания Ля, должна играть Соль#, после отпускания Ля должна играть Фа#, итп. Первая проблема, что отпускать ноты могут в любом порядке. В случае с многоголосным синтезатором все становится еще сложнее - нужно распределять ноты между каналами синтезатора. Да так, чтобы новые ноты замещали самые старые в звучащих каналах.

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

Теперь можно позаниматься громкостью и питч бэндом.

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

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 01 фев 2012, 01:04

А вот как вы думаете, каким образом делать громкость?

Проблема 1:
В миди слишком дофига разных управляторов громкостью. Я думаю, что на длинну импульса в i3 будут влияет следующие: Контроллер Main Volume, Velocity ноты, максимальная длинна импульса, которая задается в меню i3.

Стоит ли вообще реагировать на громкость канала, которая передается по midi?

Проблема 2:
Громкость в midi изменятся от 0 до 127. Но реально значения больше 100 я не видел. Если делать управление до 127, то на большинстве мелодий длинна пачки будет меньше, чем заданная. Мое решение - реагировать на громкость от 0 до 100, а от 100 до 127 - ставить максимальную.
Хотя, нет - вот сейчас смотрю мидишку, и вижу много нот больше 100.

Проблема 3:
Никто толком не знает, как реальная громкость теслы зависит от длинны пачки. Логарифмически? Линейно? Экспоненциально? Какая зависимость должна быть?
Мое решение - так как зависимости пока нет, использую линейную как самую простую в реализации.

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

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 01 фев 2012, 12:51

Все сложные вычисления перевел в формат с фиксированной запятой.В точности, похоже, не проиграл, а скорость увеличилась в 5 раз. Теперь можно и экспоненту для громкости считать, если понадобится :)

Аватара пользователя
Intra
Сообщения: 95
Откуда: Волгоград

Сообщение Intra » 01 фев 2012, 15:48

Я думаю с громкостью теслы никто никогда не заморачивался.
Я недавно закончил аудио-прерыватель
http://www.youtube.com/watch?v=OQIHKX-TWUo
Тяжёлый, корявый и неуклюжий.
Но понял одну вещь. когда берешь ноту на гитаре, вычисляется основная частота и идет ряд импульсов. с кэф. заполнения = к примеру 5 условных %.
Когда берешь, скажем квинту. там появляются два ряда импульсов и кеф заполнения умножается на два.
Смысл в том, что когда берешь одну ноту - длинна молнии условно равна 20 см. когда берешь две ноты то 40 см, потому что ряд каналов пробоя воздуха от к примеру 300 Гц вытягивает стример на длину к примеру 20см, и дополняясь рядом импульсов второй ноты вытягивает канал пробоя воздуха ещё дальше. считать длительность импульса нужно не из расчётов громкости, а из расчётов кэфа заполнения, чтобы не вызвать перегрев. сама громкость стримера будет увеличиваться относительно его длинны. а его длинна будет увеличиваться не только от длительности импульса, а ещё и от частоты сыгранной ноты, количества этих нот, сумм их частот, и громкость каждой из нот здесь совсем не при чем. достаточно использовать NoteOn NoteOff Pitch Bend и ControlChange. все остальное просто есть так, как оно есть. лучше рассчитывать длительность импульса ориентируясь не на громкость нот, а на возможность сыграть все 88нот. Кстати. за пять минут игры на гитаре через мой аудио-прерыватель у меня и X-Ray въебала ммц от перегрева. а перегрев произошел от большого кэфа заполнения. ключи остались целы. в аудио-прерывателе очень высокая полифония. все обертоны, случайно задетые струны, превращаются в ряд импульсов и этих импульсов становится гигантское кол-во. вот тебе и ответ, что будет если сделать огромную полифонию в пять нот. я думаю, увеличу кол-во капов и напряжение батареи ммц и все будет ок. даже с аудио-прерывателем. а с миди вообще проблем не будет. там всё можно сделать подконтрольным мк.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 01 фев 2012, 18:51

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

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

Ну, и новости с фронта - сделал таки управление громкостью из трех источников: Channel volume, Note velocity и длинна пачки из прерывателя.
Запустил полифонию.
Написал питчбэнд. но не успел проверить. Этим займусь сегодня вечером.

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

Появилась еще мысля сделать вариант для SSTC - длинна пачки всегда равна полупериоду ноты.

После этого всего, нужно будет привести код в порядок и делать меню для приемника midi.

Аватара пользователя
Intra
Сообщения: 95
Откуда: Волгоград

Сообщение Intra » 01 фев 2012, 20:27

Нет. Я говорил о удержании кэфа заполнения путём контроля верхнего порога длительности каждого импульса одного ряда. т.е. не более 5% от периода любой ноты. это универсальный инструмент для контроля кэфа и это позволит расширить спектр воспроизводимых частот. никакой громкости дополнительно не надо. при возникновении второй ноты стример просто будет становится громче за счет удлинения. я указал, что "примерно 20см" и "примерно 40см". он просто увеличивается например до какой нибудь определённой точки, а дальше больше не увеличивается и другие ноты тише не становятся. у меня так потому что я ноты низкие на гитаре беру. когда будешь тестировать громкость уже на тесле то сразу всё поймёшь. там вариантов не много и усложнять пересчёт цикла в коде ни к чему.

Ограничитель суммы частот не нужен. защиту от всех видов въёбов можно сделать если каждый импульс любой по частоте ноты держать в значении рабочего времени равного пяти процентам. а там он хоть четвёртую октаву возьмёт, от этого ключи не нагреются. будет просто короткий стример и всё. глянь ещё раз видюшку соло ван халена у ричарда ролисона выше в этом треде. у него там когда стример уходит в третью октаву, то просто уменьшается, потому что при такой высокой частоте импульсов их рабочее время мало. и делает из 5 периодов пачки 1 или 2 не позволяя силовой сильно греться.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 02 фев 2012, 12:31

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



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

Посмотреть можно тут

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 03 фев 2012, 02:40

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

Я очень долго думал, как это побороть, и, таки придумал. Это можно сделать на объединении таймеров в stm32. Собственно, завтра попробую это закодить, и, если получится, i3 станет еще лучше :)

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 03 фев 2012, 15:26

Беда подкралась незаметно, так и не придумал, как разумными методами побороть дрожание фронта. Были такие варианты

1. Использовать два таймера в чейне. Первый считает до неого значения, при совпаденнии счетчика с этим значением, запускается второй и выдает импульс, а в это время пересчитывается следующее время срабатывания. Недостатки у такого способа - много неопределенностей. Что будет, если нужно отработать два события с интервалом в 3мкс? Кроме того, сложные расчеты в прерывании - не хорошо, большая загрузка процессора. Хотя, точное время выхова прерывания уже не так критично.

2. Использовать два таймера и DMA. При этом, основной потом расчитывает время срабатывания таймера, а DMA передает эти времена таймерам. В этом варианте есть проблема с задержкой от сигнала включения ноты до того, как DMA дойдет до этого сигнала. Хотя, может, получится в тупую пересчитывать, нужно провести эксперимент.

4. Перейти на другой контроллер (типа stm32l151rb). Оказалось, что я зря пропустил low power контроллеры, в них а разы больше таймеров, чем в том, что я использую сейчас, и по цене они даже дешевле. Этот вариант самый хороший для решения задачи, но самый плохой для меня, потому, как моя текущая плата теперь ни на что не годится :)

Как-то так :)

Аватара пользователя
Intra
Сообщения: 95
Откуда: Волгоград

Сообщение Intra » 03 фев 2012, 18:27

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

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 06 фев 2012, 14:51

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

Еще мне лютобешенно понравислась ошибка в эрате - бутлоадер не работает. Хотя, в даташите написано, что он есть :)

Но ничего, я, вроде, придумал, как выкрутиться и с тем контроллером, что сейчас, правда придется немного попаять и перелопатить кучу кода :) Но ничего, нам не привыкать :) Когда сделаю - отчитаюсь :)

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 08 фев 2012, 19:33

Усе, ацкий кусок по переделке выходной части доделан. Теперь она совершенно няшная, практически полностью все делает в аппаратуре и не загружает процессор. И никакие критические секции не страшны. Закодить пришлось довольно много, но оно, вроде, работает. Плата обрасла МГТФом. Вообщем, все как положено.

Звук стал немного лучше - реально слышно, что прерыватель быстрее отрабатывает ноты.

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

Вот так и живем :)

Вернуться в «Наши проекты»



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

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