Прерыватель для (DR)SSTC i3.
А как воспроизвести на тесле wav файл?
Никак. Такого режима не будет. Будет аудио-ин, но до него я еще не добрался и с ним еще не все вполне ясно.
Вроде бы баг с одинаковыми нотами легко убирается на уровне миди запрещением повторяющихся частот?
Intra, бага на уровне миди и не будет. Он будет только в режиме "мегамодулятора".
Увидел у тебя видео, есть идея. Можно переназначить в сырцах периферию с мк в твоём проэкте на периферию мк STM32-Discovery?
Плюсы:
Не нужно делать плату, на собственном опыте убедился, что делать плату дома - это нупростопиздец. а такую компактную с смд и TQFP....
Не надо ничего паять. простая коммутация проводами внутри экранированного корпуса и все разъёмы крепятся к стенкам корпуса без пайки (в т.ч. и кнопки).
Минусы: ?
PROFIT!!! ^^'
Плюсы:
Не нужно делать плату, на собственном опыте убедился, что делать плату дома - это нупростопиздец. а такую компактную с смд и TQFP....
Не надо ничего паять. простая коммутация проводами внутри экранированного корпуса и все разъёмы крепятся к стенкам корпуса без пайки (в т.ч. и кнопки).
Минусы: ?
PROFIT!!! ^^'
Можно переназначить в сырцах периферию с мк в твоём проэкте на периферию мк STM32-Discovery?
Неа, на дискавери стоит другой контроллер (без USB) и нет кучи обвязки типа дисплея, памяти, преобразователя уровней, конвертора RS485, оптопары, итп. В итоге, оборудовать дискавери этим всем - сложно, намного проще сделать свою плату, тем более, она уже разведена. Осталось только на завод отправить файлы
Фууух, более-менее разгреб почту и задания, связанные с другими проектами. К сожалению, сейчас коничество свободного времени резко сократиться, и темп работы над прерывателем тоже. Тем не менее, я успел написать приемник midi посылок. Там ничего особо сложного, просто принимает, расшифровывает и отдает принятые посылки "проигрывателю midi". Теперь нужно этот самый проигрыватель написать.
BSVi писал(а):разгреб почту и задания, связанные с другими проектами
Задания для тебя отправляют по электронной почте? Кто же тогда ставит перед тобой эти задания?
Извиняюсь, но проект слегка приостановлен в связи с тем, что все драйвера для теслы распроданы. Накопилось довольно много хотелок для этих драйверов, поэтому я сейчас буду разрабатывать новые. Как только новые драйвера уйдут в производство, возвращусь к прерывателю.
Естественно, ничего не мешает мне заниматься и прерывателем, пока есть передышка от драйверов, просто основной упор будет на драйвере
Естественно, ничего не мешает мне заниматься и прерывателем, пока есть передышка от драйверов, просто основной упор будет на драйвере
Когда я перечислял варианты комбинаций режимов, то говоря о "левая часть клавиатуры идёт в одну теслу", а "правая часть клавиатуры - во вторую теслу" я имел ввиду это)) http://www.youtube.com/watch?v=Mnnw8ckfgZ8
Интересно, это сложно реализовать.. ^,..,^
Интересно, это сложно реализовать.. ^,..,^
Реализовать не сложно, но это уже после релиза всей основной функциональности, но я запишу в список хотелок. Я вижу это так - в двух прерывателях настраиваются фильтры - от и до какой ноты играть, они соединяются последовательно в MIDI цепочку и вуаля.
Сейчас я полностью погруз в новом драйвере. Он обещает быть мегаэпичным.
Сейчас я полностью погруз в новом драйвере. Он обещает быть мегаэпичным.
Итак, немного вернулся к i3. Сделал фазолинейный выход. Смысл в том, что когда играет нота, если приходит она-же, но с другим pitch bend'ом, или просто, она-же, был слышен разрыв. То есть, нота на мгновение прекращала звучать, потом, продолжала. Вот, исправил этот недостаток.
Появилась небольшая беда. Я думал, что получится не заморачитваться, и считать частоту ноты в тупую:
Но не тут то было, контролер не успевает и проглатывает быстрые ноты (67мс уже проглатывает). Сейчас там очень много посрединков, которые могут прогалывать ноты, я даже не уверен, что это делает контроллер. Сейчас цепочка от компьютера до выхода из прерывателя выглядит вот так:
Nuendo->Midi yoke->Midi to serial->Usb to Uart->Uart (38400)->i3 midi receiver->i3 midi player->i3 output dirvier.
Усе, разобрался. Ошибка была наитупейшая. При назначении новой ноты, сбрасывался счетчик таймера, отседова лезли баги.
Появилась небольшая беда. Я думал, что получится не заморачитваться, и считать частоту ноты в тупую:
Код: Выделить всё
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.
Усе, разобрался. Ошибка была наитупейшая. При назначении новой ноты, сбрасывался счетчик таймера, отседова лезли баги.
С Днём Рождения!
С Днём Рождения!
Спасиб!
Написал буфер для нот. Штука получилась довольно сложной. Она решает в какой последовательности играть ноты, и что делать с теми нотами, которые еще нажаты. Вот, к примеру вот такая последовательность нот:
В случае одноголосного синтезатора, после отпускания Ля, должна играть Соль#, после отпускания Ля должна играть Фа#, итп. Первая проблема, что отпускать ноты могут в любом порядке. В случае с многоголосным синтезатором все становится еще сложнее - нужно распределять ноты между каналами синтезатора. Да так, чтобы новые ноты замещали самые старые в звучащих каналах.
Это очевидные моменты - реально там еще куча логики, типа подавление нот, которые пришли без сигнала выключения предыдущих, итп. Получился такой хитрый алгоритм на двух односвязных списках, который еще и работает.
Теперь можно позаниматься громкостью и питч бэндом.
Синтезатор получается довольно жирненьким уже.
А вот как вы думаете, каким образом делать громкость?
Проблема 1:
В миди слишком дофига разных управляторов громкостью. Я думаю, что на длинну импульса в i3 будут влияет следующие: Контроллер Main Volume, Velocity ноты, максимальная длинна импульса, которая задается в меню i3.
Стоит ли вообще реагировать на громкость канала, которая передается по midi?
Проблема 2:
Громкость в midi изменятся от 0 до 127. Но реально значения больше 100 я не видел. Если делать управление до 127, то на большинстве мелодий длинна пачки будет меньше, чем заданная. Мое решение - реагировать на громкость от 0 до 100, а от 100 до 127 - ставить максимальную.
Хотя, нет - вот сейчас смотрю мидишку, и вижу много нот больше 100.
Проблема 3:
Никто толком не знает, как реальная громкость теслы зависит от длинны пачки. Логарифмически? Линейно? Экспоненциально? Какая зависимость должна быть?
Мое решение - так как зависимости пока нет, использую линейную как самую простую в реализации.
Все правильно?
Проблема 1:
В миди слишком дофига разных управляторов громкостью. Я думаю, что на длинну импульса в i3 будут влияет следующие: Контроллер Main Volume, Velocity ноты, максимальная длинна импульса, которая задается в меню i3.
Стоит ли вообще реагировать на громкость канала, которая передается по midi?
Проблема 2:
Хотя, нет - вот сейчас смотрю мидишку, и вижу много нот больше 100.
Проблема 3:
Никто толком не знает, как реальная громкость теслы зависит от длинны пачки. Логарифмически? Линейно? Экспоненциально? Какая зависимость должна быть?
Мое решение - так как зависимости пока нет, использую линейную как самую простую в реализации.
Все правильно?
Все сложные вычисления перевел в формат с фиксированной запятой.В точности, похоже, не проиграл, а скорость увеличилась в 5 раз. Теперь можно и экспоненту для громкости считать, если понадобится
Я думаю с громкостью теслы никто никогда не заморачивался.
Я недавно закончил аудио-прерыватель
http://www.youtube.com/watch?v=OQIHKX-TWUo
Тяжёлый, корявый и неуклюжий.
Но понял одну вещь. когда берешь ноту на гитаре, вычисляется основная частота и идет ряд импульсов. с кэф. заполнения = к примеру 5 условных %.
Когда берешь, скажем квинту. там появляются два ряда импульсов и кеф заполнения умножается на два.
Смысл в том, что когда берешь одну ноту - длинна молнии условно равна 20 см. когда берешь две ноты то 40 см, потому что ряд каналов пробоя воздуха от к примеру 300 Гц вытягивает стример на длину к примеру 20см, и дополняясь рядом импульсов второй ноты вытягивает канал пробоя воздуха ещё дальше. считать длительность импульса нужно не из расчётов громкости, а из расчётов кэфа заполнения, чтобы не вызвать перегрев. сама громкость стримера будет увеличиваться относительно его длинны. а его длинна будет увеличиваться не только от длительности импульса, а ещё и от частоты сыгранной ноты, количества этих нот, сумм их частот, и громкость каждой из нот здесь совсем не при чем. достаточно использовать NoteOn NoteOff Pitch Bend и ControlChange. все остальное просто есть так, как оно есть. лучше рассчитывать длительность импульса ориентируясь не на громкость нот, а на возможность сыграть все 88нот. Кстати. за пять минут игры на гитаре через мой аудио-прерыватель у меня и X-Ray въебала ммц от перегрева. а перегрев произошел от большого кэфа заполнения. ключи остались целы. в аудио-прерывателе очень высокая полифония. все обертоны, случайно задетые струны, превращаются в ряд импульсов и этих импульсов становится гигантское кол-во. вот тебе и ответ, что будет если сделать огромную полифонию в пять нот. я думаю, увеличу кол-во капов и напряжение батареи ммц и все будет ок. даже с аудио-прерывателем. а с миди вообще проблем не будет. там всё можно сделать подконтрольным мк.
Я недавно закончил аудио-прерыватель
http://www.youtube.com/watch?v=OQIHKX-TWUo
Тяжёлый, корявый и неуклюжий.
Но понял одну вещь. когда берешь ноту на гитаре, вычисляется основная частота и идет ряд импульсов. с кэф. заполнения = к примеру 5 условных %.
Когда берешь, скажем квинту. там появляются два ряда импульсов и кеф заполнения умножается на два.
Смысл в том, что когда берешь одну ноту - длинна молнии условно равна 20 см. когда берешь две ноты то 40 см, потому что ряд каналов пробоя воздуха от к примеру 300 Гц вытягивает стример на длину к примеру 20см, и дополняясь рядом импульсов второй ноты вытягивает канал пробоя воздуха ещё дальше. считать длительность импульса нужно не из расчётов громкости, а из расчётов кэфа заполнения, чтобы не вызвать перегрев. сама громкость стримера будет увеличиваться относительно его длинны. а его длинна будет увеличиваться не только от длительности импульса, а ещё и от частоты сыгранной ноты, количества этих нот, сумм их частот, и громкость каждой из нот здесь совсем не при чем. достаточно использовать NoteOn NoteOff Pitch Bend и ControlChange. все остальное просто есть так, как оно есть. лучше рассчитывать длительность импульса ориентируясь не на громкость нот, а на возможность сыграть все 88нот. Кстати. за пять минут игры на гитаре через мой аудио-прерыватель у меня и X-Ray въебала ммц от перегрева. а перегрев произошел от большого кэфа заполнения. ключи остались целы. в аудио-прерывателе очень высокая полифония. все обертоны, случайно задетые струны, превращаются в ряд импульсов и этих импульсов становится гигантское кол-во. вот тебе и ответ, что будет если сделать огромную полифонию в пять нот. я думаю, увеличу кол-во капов и напряжение батареи ммц и все будет ок. даже с аудио-прерывателем. а с миди вообще проблем не будет. там всё можно сделать подконтрольным мк.
Тут проблема в чем. Если пытаться держать средний к. заполнения, как ты предлагаешь (это не сложно), то получается хитрая неоднозначность - при включении второго звука, первый будет становится тише. Кроме того, зависимость громкости от длинны пачки, скорее-всего, нелинейная.
В случае с гитарой, действительно, можно сделать такой себе аналог компрессора - при увеличении количества пачек, уменьшаяется их длинна. В случае с миди, я не вижу в этом особого смысла. Компрессия будет заметна.
Ну, и новости с фронта - сделал таки управление громкостью из трех источников: Channel volume, Note velocity и длинна пачки из прерывателя.
Запустил полифонию.
Написал питчбэнд. но не успел проверить. Этим займусь сегодня вечером.
После того, как это все заработает, буду делать ограничитель суммы частот. Сейчас все работает в "опасном" режиме, когда можно включить любую частоту.
Появилась еще мысля сделать вариант для SSTC - длинна пачки всегда равна полупериоду ноты.
После этого всего, нужно будет привести код в порядок и делать меню для приемника midi.
В случае с гитарой, действительно, можно сделать такой себе аналог компрессора - при увеличении количества пачек, уменьшаяется их длинна. В случае с миди, я не вижу в этом особого смысла. Компрессия будет заметна.
Ну, и новости с фронта - сделал таки управление громкостью из трех источников: Channel volume, Note velocity и длинна пачки из прерывателя.
Запустил полифонию.
Написал питчбэнд. но не успел проверить. Этим займусь сегодня вечером.
После того, как это все заработает, буду делать ограничитель суммы частот. Сейчас все работает в "опасном" режиме, когда можно включить любую частоту.
Появилась еще мысля сделать вариант для SSTC - длинна пачки всегда равна полупериоду ноты.
После этого всего, нужно будет привести код в порядок и делать меню для приемника midi.
Нет. Я говорил о удержании кэфа заполнения путём контроля верхнего порога длительности каждого импульса одного ряда. т.е. не более 5% от периода любой ноты. это универсальный инструмент для контроля кэфа и это позволит расширить спектр воспроизводимых частот. никакой громкости дополнительно не надо. при возникновении второй ноты стример просто будет становится громче за счет удлинения. я указал, что "примерно 20см" и "примерно 40см". он просто увеличивается например до какой нибудь определённой точки, а дальше больше не увеличивается и другие ноты тише не становятся. у меня так потому что я ноты низкие на гитаре беру. когда будешь тестировать громкость уже на тесле то сразу всё поймёшь. там вариантов не много и усложнять пересчёт цикла в коде ни к чему.
Ограничитель суммы частот не нужен. защиту от всех видов въёбов можно сделать если каждый импульс любой по частоте ноты держать в значении рабочего времени равного пяти процентам. а там он хоть четвёртую октаву возьмёт, от этого ключи не нагреются. будет просто короткий стример и всё. глянь ещё раз видюшку соло ван халена у ричарда ролисона выше в этом треде. у него там когда стример уходит в третью октаву, то просто уменьшается, потому что при такой высокой частоте импульсов их рабочее время мало. и делает из 5 периодов пачки 1 или 2 не позволяя силовой сильно греться.
Ограничитель суммы частот не нужен. защиту от всех видов въёбов можно сделать если каждый импульс любой по частоте ноты держать в значении рабочего времени равного пяти процентам. а там он хоть четвёртую октаву возьмёт, от этого ключи не нагреются. будет просто короткий стример и всё. глянь ещё раз видюшку соло ван халена у ричарда ролисона выше в этом треде. у него там когда стример уходит в третью октаву, то просто уменьшается, потому что при такой высокой частоте импульсов их рабочее время мало. и делает из 5 периодов пачки 1 или 2 не позволяя силовой сильно греться.
Тыксь, вроде закончил миди синтезатор и приемопередатчик в том виде, в котором я собирался его делать. Там есть пара багов, но не сильно критичных. Потихоньку, исправлю. Вот - небольшой обзор, как это работает.
Начал рисовать структуру меню, чтобы потм меньше было вспоминать. Да, с мегамодулятором я, наверное, перестарался Зато, можно все, что хочешь нарулить.
Посмотреть можно тут
Начал рисовать структуру меню, чтобы потм меньше было вспоминать. Да, с мегамодулятором я, наверное, перестарался Зато, можно все, что хочешь нарулить.
Посмотреть можно тут
Сейчас я борюсь с дрожанием фронта выходного сигнала. Проблема в том, что выходной сигнал генерируется в прерывании. В это - плохо. Любая секция кода, в которой прерывания запрещены вызывает сбой фронта. Ширина импульса и частота при этом не сбивается, но фронта дрожат, и это можно услышать, если прислушаться.
Я очень долго думал, как это побороть, и, таки придумал. Это можно сделать на объединении таймеров в stm32. Собственно, завтра попробую это закодить, и, если получится, i3 станет еще лучше
Я очень долго думал, как это побороть, и, таки придумал. Это можно сделать на объединении таймеров в stm32. Собственно, завтра попробую это закодить, и, если получится, i3 станет еще лучше
Беда подкралась незаметно, так и не придумал, как разумными методами побороть дрожание фронта. Были такие варианты
1. Использовать два таймера в чейне. Первый считает до неого значения, при совпаденнии счетчика с этим значением, запускается второй и выдает импульс, а в это время пересчитывается следующее время срабатывания. Недостатки у такого способа - много неопределенностей. Что будет, если нужно отработать два события с интервалом в 3мкс? Кроме того, сложные расчеты в прерывании - не хорошо, большая загрузка процессора. Хотя, точное время выхова прерывания уже не так критично.
2. Использовать два таймера и DMA. При этом, основной потом расчитывает время срабатывания таймера, а DMA передает эти времена таймерам. В этом варианте есть проблема с задержкой от сигнала включения ноты до того, как DMA дойдет до этого сигнала. Хотя, может, получится в тупую пересчитывать, нужно провести эксперимент.
4. Перейти на другой контроллер (типа stm32l151rb). Оказалось, что я зря пропустил low power контроллеры, в них а разы больше таймеров, чем в том, что я использую сейчас, и по цене они даже дешевле. Этот вариант самый хороший для решения задачи, но самый плохой для меня, потому, как моя текущая плата теперь ни на что не годится
Как-то так
1. Использовать два таймера в чейне. Первый считает до неого значения, при совпаденнии счетчика с этим значением, запускается второй и выдает импульс, а в это время пересчитывается следующее время срабатывания. Недостатки у такого способа - много неопределенностей. Что будет, если нужно отработать два события с интервалом в 3мкс? Кроме того, сложные расчеты в прерывании - не хорошо, большая загрузка процессора. Хотя, точное время выхова прерывания уже не так критично.
2. Использовать два таймера и DMA. При этом, основной потом расчитывает время срабатывания таймера, а DMA передает эти времена таймерам. В этом варианте есть проблема с задержкой от сигнала включения ноты до того, как DMA дойдет до этого сигнала. Хотя, может, получится в тупую пересчитывать, нужно провести эксперимент.
4. Перейти на другой контроллер (типа stm32l151rb). Оказалось, что я зря пропустил low power контроллеры, в них а разы больше таймеров, чем в том, что я использую сейчас, и по цене они даже дешевле. Этот вариант самый хороший для решения задачи, но самый плохой для меня, потому, как моя текущая плата теперь ни на что не годится
Как-то так
Попробуй сначала вынести самую последнюю часть сигнала где уже всё посчитано на какой-нибудь отдельный таймер, чтобы в тупую всё пересчитать. или, если не получится, переходи на другой контроллер.
Ухх, куча док прочитана. Вот правду говорят - после даташита читай эррату, а эррана на stm32l очень даже грозная. И из-за одной ошибки stm32l не подойдет для прерывателя - он может не запуститься, если тактируется от внешнего источника.
Еще мне лютобешенно понравислась ошибка в эрате - бутлоадер не работает. Хотя, в даташите написано, что он есть
Но ничего, я, вроде, придумал, как выкрутиться и с тем контроллером, что сейчас, правда придется немного попаять и перелопатить кучу кода Но ничего, нам не привыкать Когда сделаю - отчитаюсь
Еще мне лютобешенно понравислась ошибка в эрате - бутлоадер не работает. Хотя, в даташите написано, что он есть
Но ничего, я, вроде, придумал, как выкрутиться и с тем контроллером, что сейчас, правда придется немного попаять и перелопатить кучу кода Но ничего, нам не привыкать Когда сделаю - отчитаюсь
Усе, ацкий кусок по переделке выходной части доделан. Теперь она совершенно няшная, практически полностью все делает в аппаратуре и не загружает процессор. И никакие критические секции не страшны. Закодить пришлось довольно много, но оно, вроде, работает. Плата обрасла МГТФом. Вообщем, все как положено.
Звук стал немного лучше - реально слышно, что прерыватель быстрее отрабатывает ноты.
Так как на контроллере не хватало ножек, пришлось убрать регулировку контраста, ну и хрен с ним
Похоже, все ножки контроллера будут задействованы. Контроллер побольше ставить не хочется - мета на плате не хватит.
Вот так и живем
Звук стал немного лучше - реально слышно, что прерыватель быстрее отрабатывает ноты.
Так как на контроллере не хватало ножек, пришлось убрать регулировку контраста, ну и хрен с ним
Похоже, все ножки контроллера будут задействованы. Контроллер побольше ставить не хочется - мета на плате не хватит.
Вот так и живем
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей