миди секвенсер

Аватара пользователя
Skinny
Member
Сообщения: 665
Зарегистрирован: 01 авг 2016, 14:09
Репутация: 660

Re: миди секвенсер

Сообщение Skinny »

спасибо за советы)
mrf писал(а): 05 сен 2022, 19:26 перезапись проще организовать проигрыванием старого "файла" одновременно записывая новый из входа + сообщений старого.
вот это кстати очень крутая идея, и логичная..
не всё мне пока что понятно, например вся юсби тема, надо потихоньку изучать :geek:
3125Гц максимальная частота поступления минимальных квантов миди протокола в стандартном миде порту
в принципе по сути тогда пофигу что использовать, прерывания, дма или чего угодно на такой скорости - довольно медленно все равно, никакой разницы не будет в реальности)


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

получается note off пропишется в самом начале паттерна, а не в его конце.
в результате будет note on и тут же note off. звук заткнётся не начавшись)) если отквантовать то они просто на один и тот же тик упадут.

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

что делать опять же с такими нотами, зашедшими за границу паттерна, обрезать нафиг, "note off" всегда на конец паттерна выставлять?

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


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

короче, больше непонятного чем понятного)
вот у меня на этом всё застряло по большому счету. ну и еще пару мелочей.
Аватара пользователя
SGA
Member
Сообщения: 739
Зарегистрирован: 26 ноя 2017, 15:13
Репутация: 660
Старый ник: SGA

Re: миди секвенсер

Сообщение SGA »

"note off" всегда на конец паттерна выставлять?

Вот это бы мне точно в полиенде пригодилось... Ручками делать приходится.
Все есть.
Аватара пользователя
Skinny
Member
Сообщения: 665
Зарегистрирован: 01 авг 2016, 14:09
Репутация: 660

Re: миди секвенсер

Сообщение Skinny »

в SU700 делаю длинные ноты ровно в размер паттерна (например для проигрывания длинного сэмпла) - квантизацию врубаю и при записи нажимаю пэд слегка раньше чем реально начнется, а отпускаю слегка позже. он ноту вписывает тогда точно в длину. концы нот там не квантуются, так что это единственный способ конец ноты ровно на конец паттерна попасть, не лазя в меню..
Аватара пользователя
mrf
Member
Сообщения: 331
Зарегистрирован: 15 окт 2014, 17:54
Репутация: 316
Откуда: Екатеринбург

Re: миди секвенсер

Сообщение mrf »

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

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

не знаю что лучше.. изначально прорабатывал еще более сложную схему с динамическим выделением и сортировкой (потому что у меня нота была одним событием с параметром длительности, а не двумя), но там как-то сложно и путано получилось и я задолбался и теперь в сомнениях, попробовать еще раз переписать или переделать на попроще..
Аватара пользователя
mrf
Member
Сообщения: 331
Зарегистрирован: 15 окт 2014, 17:54
Репутация: 316
Откуда: Екатеринбург

Re: миди секвенсер

Сообщение mrf »

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

эндпоинты это если грубо то аналог уарта, только информация передается блоками, и с определенным форматом, и только когда оба участника обмена готовы. то есть если я с хоста не могу принять данные, потому что предыдущие еще обрабатываются, я просто ничего не делаю, и хост терпеливо ждет. когда стану готов, то освобождаю эндпоинт, и хост засылает мне новый блок. точно также с передачей - отсылаю блок, а хост его прочитает когда захочет, а может вообще не прочитать, если никакой DAW не запущено. это стандартный BULK обмен, довольно удобно.
формат у миди - 32 бита, младшие 8 - код сообщения и номер виртуального кабеля (возможно 16 кабелей к примеру для многопортового миди-юсб конвертора), а остальные это стандартные 3 миди байта. здесь лучше посмотреть стандарт, там это одна небольшая табличка из которой все становится понятно и которая и является основой для всего моего миди-стека сегодня (https://www.usb.org/sites/default/files/midi10.pdf стр.16). обычный размер блоков - 64 байт, можно до 16 сообщений передать за раз

ну и дескрипторы. в них можно разобраться, а можно просто выдрать из любого синта (хотя все равно немного придется разобраться, чтобы понять что выдирать), и просто переделать пару строк - имя производителя, устройства. в них как раз описывается функционал и номера эндпоинтов, так что их инициализация должна соответствовать этому описанию. Для просмотра синтов могу посоветовать Thesycon’s descriptor dumper (https://www.thesycon.de/eng/usb_descriptordumper.shtml) - он не просто показывает коды, но и немного декодирует.

помимо этого у юсб классов есть еще Class Requests (например, для юсб-аудио это включение/отключение аудиопотоков), но для миди они не нужны.

ну и на гитхабе много проектов - LXR, PreenFM, Midibox mios32, TinyUSB.. надеюсь это краткое описание поможе лучше их понять.
Аватара пользователя
Skinny
Member
Сообщения: 665
Зарегистрирован: 01 авг 2016, 14:09
Репутация: 660

Re: миди секвенсер

Сообщение Skinny »

спасибо)) инфы об этих вещах реально не очень много в интернете.

"All-Notes-Off" кстати практически никакие железки в реальности не поддерживают, ну из того что есть у меня - ничего) и это в инете тоже упоминается, если посмотреть например как в midi-ox сделано, то оно просто отсылает целую пачку "note off" всех нот на всех каналах. целый блок огромный. это требует аж доли секунды сам особой. но надежный метод, точно затыкает всё)) и кстати возможно полезная функция была бы в любом секвенсоре, типа как midi panic
но естественно не на паттерне.
походу таки лучше держать в памяти сколько и каких нот было включено, в принципе это обычно не сильно много, несложная задача.

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

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


и как думаю над реализацией - всё-таки если нота зашла за конец паттерна, думаю надо обрубать её искусственно и проставлять note off на конец паттерна. ибо нех. так всё просто и логично, а заходящие хвосты можно просто релизом и ревером сделать. и паттерны один с другим нормально срастаются)
да, это типа ограничение, хотя пока хз, может и придумаю потом как обойтись без этого и нормально паттерны склеивать с отчасти совпадающим контентом. типа приоритет нового паттерна над старым, в случае если есть неоднозначная трактовка.
Аватара пользователя
tofik
Member
Сообщения: 304
Зарегистрирован: 28 авг 2013, 07:38
Репутация: 230
Откуда: Sosnoviy Borstch
Контактная информация:

Re: миди секвенсер

Сообщение tofik »

что если преднамеренно перед ноте он всегда ноте оф отправлять. Чтобы не наслаивались ноты.

А по поводу лайв записи тут как я вижу 2 варианта: с кнопочкой овердаб. Которая выбирает промеж "запись поверх"/"запись вместо".
Второй вариант слои на отдельные кнопочки. И манипулировать.
Можно совместить 1 и 2 варианты. И получить несколько слоев с кнопкой овердаб. С возможностью мерджить эти слои и роутить на разные каналы. Слои эти ещё чтобы могли бы быть разной длительности. С делителем скорости. И конечно рандомайзером.
Спектралис ванлав
Аватара пользователя
nampuapx
Member
Сообщения: 223
Зарегистрирован: 10 сен 2013, 22:07
Репутация: 77

Re: миди секвенсер

Сообщение nampuapx »

Ну рассуждения правильные, одним словом - архитектура.
Изображение
Ответить