MK Slicer - lua скрипт для быстрой нарезки, квантования, триггеринга и не только (1 онлайн

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
@Mr_Tsonts, @Archchie, ребята, спасибо за багрепорты и пожелания! Сейчас много работы, как освобожусь, обязательно гляну.

@Archchie, про даблклик хорошая идея, ещё была мысль ставить/удалять маркеры по даблклику и без меню - это упростило бы работу. Но. Я не владею искусством даблклика :) Я делал несколько заходов (классика с измерением времени между кликами), но ничего не получалось - у исходного скрипта Евгена структура заметно отличается от готовых примеров даблклика, что я встречал. Так что, пока отложено в долгий ящик.
 
Последнее редактирование:
  • Like
Реакции: Archie's и Mr_Tsonts

Aleksandr Oleynik

Well-Known Member
16 Янв 2007
26.360
20.064
113
62
Киев
у исходного скрипта Евгена структура заметно отличается от готовых примеров даблклика, что я встречал. Так что, пока отложено в долгий ящик.
Попробую вспомнить и помочь. Я ведь свои скрипты с GUI делал каркас по шаблонам Жени.
Но тоже сейчас, не смотря на карантин, завал с работой.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Kokarev Maxim, Второй третий пункт не так уж и важны, это так мелочи, а вот первый и четвертый пункты мне кажется очень важны и нуждаются в исправлении.
 
  • Like
Реакции: Kokarev Maxim

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
Готово. Скрипт на проверке, думаю, завтра утром уже будет доступен. Уже в РеаПаке.

1.3.5
+ Исправлен баг конфликта опции "Toggle trim behind items when editing" с MIDI Sampler.
+ Теперь скрипт помнит положение окна с последней сессии.
+ MIDI Sampler не создаёт ноты, достигнув самой высокой (G9, 127). Лишние сэмплеры, так же, не добавляются.
+ Правый клик вставляет/удаляет маркеры мгновенно, без дополнительных меню.

На данный момент поправлены все мои "хотелки", и большая часть пожеланий пользователей.
Есть вещи, о которых часто просят, но это не будет (пока?) изменено.
Что на данный момент невозможно: управление слайдерами колесом мыши, любые фичи с выделением области, квантование без привязки к сетке (SWS Groove tool и подобное).
Что реально, но тяжело в реализации и отложено в дальний ящик: пресеты, МИДИ Сэмплер на новом треке.
 
Последнее редактирование:

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
+ MIDI Sampler не создаёт ноты, достигнув самой высокой (G9, 127). Лишние сэмплеры, так же, не добавляются.
То что все семплы не добавляются, это конечно плохо.
В режиме семплирования с миди происходит какой то неадыкват, если там присутствует миди айтем.
И если миди айтем короче оригинала wave, то оригинал рубится по началу миди айтема, а в миди айтеме после позиции разреза оригинала начинается что то непонятное.
Было:
178299


Стало:

178300
А если миди айтем равен или длиннее оригинала, то тогда миди айтем вообще не создается и семплеры не добавляются, а оригинал кромсается весь по маркерам.
Было:

178301


Стало:

178302


Что на данный момент невозможно:
любые фичи с выделением области
А почему невозможно ?
Я так понимаю, у тебя выделяется область по выделенным айтемам и затем происходит анализ аудио - правильно ?
А что мешает во время запуска скрипта или при нажатии на кнопку "Get Item" запустить экшен "Item: Split items at time selection"
или написать функцию аналогичную этому экшену, айтемы порежутся по выбору времени и за пределами выбора времени снимется выделение с айтемов ну и затем скрипт продолжит работу но уже по выбору времени. После запуска экшена проверить, есть ли выделенные айтемы в выборе времени и если есть, то продолжить работу скрипта, а если нету, то reaper.MB("Нету выделенных элементов в выборе времени")и ломаем скрипт return.

Что реально, но тяжело в реализации и отложено в дальний ящик:
Сэмплер на новом треке.
Тут тоже в строке 3586, там где ошибка была в прошлой версии из за Trim, ты создаешь новый айтем, так вот перед функцией CreateNewMIDIItemInProj нужно создать новый трек и в этом треке уже создавать новый айтем и на него добавлять семплеры.
в строке 3584, перед функцией CreateNewMIDIItemInProj добавляешь этот код
JavaScript:
      local nmb = reaper.GetMediaTrackInfo_Value(track,"IP_TRACKNUMBER");
      reaper.InsertTrackAtIndex(nmb-1,false);
      track = reaper.GetTrack(nmb-1,0);
и миди айтем начнет добавляться на новом треке.
И семплеры добавляешь уже на этот новый созданный трек а не на предыдущий.
Как добавить семплер на созданный трек, думаю сам разберешься, ведь ты же сам добавлял эту функцию. Я не знаю где там что в скрипте.
И если с этим сможешь разобраться, и уже смог разобраться, как не добавлять ноты и семплеры по достижению 127 ноты, то думаю и дальше разберешься, что бы по достижению ноты 127, аналогично создать новый трек и продолжить на нем.

Ну и надо бы исправить глюк, который в начале сообщения.
А так скрипт клевый получается, если конечно не забросишь и будешь стараться эти баги убирать.
 
Последнее редактирование:

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
То что все семплы не добавляются, это конечно плохо.
Ну, я стараюсь разбирать функционал с точки зрения пользователя, и логика здесь такая: если пользователь попробует сэмплировать огромный трек, его компьютер не сдохнет от огромного количества сэмплеров в fx рэке. На практике даже 128 нот - это дофига: в моих тестах любой 4-х тактовый луп имел значительно меньше звуков. Если сэмплировать материал большей длительности - здесь у меня уже появляются вопросы - а имеет ли материал настолько большое число уникальных звуков, чтобы для этого создавать новые сэмплеры? Опять же, если сильно нужно, пользователь сможет сделать это частями.

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

А почему невозможно ?
Я так понимаю, у тебя выделяется область по выделенным айтемам и затем происходит анализ аудио - правильно ?
А что мешает во время запуска скрипта или при нажатии на кнопку "Get Item" запустить экшен "Item: Split items at time selection"
или написать функцию аналогичную этому экшену, айтемы порежутся по выбору времени и за пределами выбора времени снимется выделение с айтемов ну и затем скрипт продолжит работу но уже по выбору времени. После запуска экшена проверить, есть ли выделенные айтемы в выборе времени и если есть, то продолжить работу скрипта, а если нету, то reaper.MB("Нету выделенных элементов в выборе времени")и ломаем скрипт return.
Насколько я помню, скрипт при инициализации сохраняет область, и, потом, при выполнении некоторых функций, востанавливает сохранённое. К сожалению, в sws всего один слот для сохранения/восстановления выделенной области, поэтому любые выделения не могут быть сохранены, ибо в работе постоянно восстанавливаются до сохранённого при инициализации.

Ну и на счёт создания айтема на новом треке - пока это выглядит очень сложно. Изначально, это скрипт Михаила, прикрученный Антоном к скрипту Евгена :D Так что, я в той области не хозяин :)
 
  • Like
Реакции: Archie's

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
и логика здесь такая: если пользователь попробует сэмплировать огромный трек, его компьютер не сдохнет от огромного количества сэмплеров в fx рэке
Ну тут смотря какой комп у кого! У кого то пентиум один из 98 года стоит и у него на трех семплерах комп сдыхать начнет, но ты же не сделал ограничения в три семплера.
На практике даже 128 нот - это дофига: в моих тестах любой 4-х тактовый луп имел значительно меньше звуков. Если сэмплировать материал большей длительности - здесь у меня уже появляются вопросы - а имеет ли материал настолько большое число уникальных звуков, чтобы для этого создавать новые сэмплеры? Опять же, если сильно нужно, пользователь сможет сделать это частями.
Здесь я полностью согласен, что на практике это в основном дофига и это может и не когда не потребуется, но все же я думаю что нужно все делать по возможности до конца и что бы все работало во всех случаях. Конечно можно и по частям это сделать, а можно и вообще вручную все это сделать. Меня вот например не напряжет четырех тактовый луп разобрать на семплы и в ручную, а вот если вокал на чепы (Vocal Chops) разбивать (и не только), то вот тут и может потребоваться более 127 нот.
Это как: На практике при написании аранжировки более двухсот треков редко бывает, так для чего тогда делать больше 200 треков, но программы не вводят же ограничения на все это, так вот, скрипт - это такая же, только маленькая программка .
И кстати скрипт использует не все 127 нот, а только 104 ноты, обрати внимания на это.
Конечно каждый последующий трек создавать при достижении 127 нот на треке, это может и слишком уже, но вот мне кажется, что при нажатии на кнопку "миди" скрипт должен проверить и если семплов более 127, то выдать предупреждение о том, что в айтеме более 127 семплов, что они не влезают в клавиатуру и не создавать в этом случае вообще не чего.
Слайсер не предназначен для работы с МИДИ и по возможности выдаёт ошибку каждый раз, если перед нажатием кнопки выделен миди айтем. Эти примеры - удачная попытка обмануть скрипт и мои защиты. Возьму на заметку.
Это я знаю. В том то и дело что миди айтем не был выделен, а был как положено выделен аудио. Я же тебе даже картинки сделал в предыдущем сообщении до и после.
К сожалению, в sws всего один слот для сохранения/восстановления выделенной области, поэтому любые выделения не могут быть сохранены, ибо в работе постоянно восстанавливаются до сохранённого при инициализации.
Ну в sws не один слот для сохранения/восстановления выделенной области, а пять и для чего использовать sws экшены для этих целей, если это легко решается при помощи апи.
PHP:
    local function SaveTimeSelection_Slot(slot);
        local startLoop,endLoop = reaper.GetSet_LoopTimeRange(0,0,0,0,0);
        reaper.SetExtState('SaveTmSl_Slt','SvTmSl_'..slot,startLoop..'&'..endLoop,false);
    end;
   
   
    local function RestoreTimeSelection_Slot(slot);
        local ExtState = reaper.GetExtState('SaveTmSl_Slt','SvTmSl_'..slot);
        if ExtState == '' then return end;
        startLoop,endLoop = ExtState:match('(.+)&(.+)')
        reaper.GetSet_LoopTimeRange(1,0,startLoop,endLoop,0);
    end;
   
    SaveTimeSelection_Slot(1); -- Slot может быть хоть цифрой, хоть строкой.
   
    RestoreTimeSelection_Slot(1);
Ну и на счёт создания айтема на новом треке - пока это выглядит очень сложно. Изначально, это скрипт Михаила, прикрученный Антоном к скрипту Евгена :D Так что, я в той области не хозяин :)
Плохо конечно. К примеру у тебя дорожка на которой вставлен луп, который ты хочешь почепить, и на этой дорожке уже куча эффектов и семплеры добавляются после всех эффектов - это нормально ? Как по мне , то семплеры должны добавится перед всеми эффектами, в первых позициях, а не после, а лучше на новом треке.

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

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

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
И не подумай что я какой то зануда))), я просто тестю и указываю на некоторые недочеты, которые по возможности желательно бы исправить, если ты тоже видишь в этом недочет. Что бы добиться идеального скрипта.)))
И не принимай близко к сердцу, я знаю по собственному опыту что это реально бесит, когда вылезают все новые и новые баги, которые все сложнее и сложнее решать.
Это ты мне так мстишь, я понял :D

Да всё норм. Я понимаю, что с критикой и отзывами (какими бы они ни были), скрипт обрастает улучшениями и удобными фичами.

На счёт сохранения/восстановления области - я сейчас не вспомню, почему всё именно так, как в скрипте. С api хорошая идея, надо попробовать.

По поводу MIDI Sampler. Он не задумывался вообще. Когда-то я его не стал выкидывать из оригинального слайсера Антона, ибо посчитал эту фичу неплохим бонусом к основному функционалу. Как видишь, оставив его, я оставил и все баги/особенности чужого кода. В итоге получается, что сейчас есть не самая ключевая фича, которая требует приличных вложений времени в освоение и доработку. Мотивация к этому у меня очень низкая.
 
  • Like
Реакции: Mr_Tsonts и Archie's

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
Похоже, я соврал :D Как оказалось, часть проблем была актуальна для Destructive версии плагина, а к текущей версии проблемная часть кода стала бесполезной.
В работе МИДИ Сэмплера одна мелочь пока остаётся - если на айтем наслаивается другой и его старт дальше, чем старт основного, при работе МИДИ Сэмплера исходный айтем будет с разрезом в районе старта второго айтема. Обычным Heal разрез не клеится, пока оставляю как есть.

До вечера тестирую, ночью или к утру будет доступна.

Предварительный список изменений:
1.4
+ Запуск и действия слайсера не влияют на Loop Selection*
+ Переработана и улучшена защита от некорректных действий или двойного нажатия на кнопки.
+ Теперь скрипт корректно распознаёт waveform у muted айтемов.
+ Теперь MIDI Sampler создаёт новый трек.
+ Теперь MIDI Sampler копирует FX, Routing, Mute/Solo, Volume, Pan и Width c оригинального трека.
+ Исправлено некорректное поведение MIDI Sampler при наложении айтемов.

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

Если вдруг кто захочет присоединиться к тестированию или просто получить плагин раньше срока, прикрепляю в аттач. До вечера если чего напишете критичного, постараюсь сразу поправить.
 

Вложения

  • Like
Реакции: Slick, Landre и Archie's

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Супер! Браво! Молодец!
В работе МИДИ Сэмплера одна мелочь пока остаётся - если на айтем наслаивается другой и его старт дальше, чем старт основного, при работе МИДИ Сэмплера исходный айтем будет с разрезом в районе старта второго айтема. Обычным Heal разрез не клеится, пока оставляю как есть.
Плохо конечно, но это уже мелочи незначительные, на которые можно забить, не желательно конечно,но можно.
Если есть желание, то в "семпере" можешь добавить запрос на копирование эффектов с оригинального трека, т.е. копировать или не копировать эффекты или забайпасить не забайпасить - что легче.
Еще по возможности можешь исправить, что бы семплеры/ноты создавались с первой ноты, а не с 24.
Запуск и действия слайсера не влияют на Loop Selection
Плохо конечно, что не получается сделать, что бы все работало по выбору времени, т.е. что бы скрипт обрабатывал только то, что находится в выборе времени. А хотелось бы.
Теперь скрипт корректно распознаёт waveform у muted айтемов.
А вот это мне кажется лишнее и нужно убрать. Или нет? Если айтем mute, то и в нем значит тишина и нечего с ним значит делать не нужно.
Теперь MIDI Sampler копирует FX, Routing, Mute/Solo, Volume, Pan и Width c оригинального трека.
Для Routing тоже можно добавить запрос копировать или нет.
Volume, Pan и Width можно и не копировать, хоть это и не принципиально.

Еще если на треке есть миди айтем, не важно пересекаются они с оригиналом wave или нет, то при добавлении стрейч маркеров миди айтем сдвигается к позиции оригинала, но это не всегда. Закономерности я так и не выявил.

А так уже все супер, до идеала чуть-чуть осталось. Молодец! Скрипт суперский!
 
Последнее редактирование:

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
Если есть желание, то в "семпере" можешь добавить запрос на копирование эффектов с оригинального трека, т.е. копировать или не копировать эффекты или забайпасить не забайпасить - что легче.
Да, думал об этом. Для всяких пользователей uad и слабых компьютеров может быть полезно.

Плохо конечно, что не получается сделать, что бы все работало по выбору времени, т.е. что бы скрипт обрабатывал только то, что находится в выборе времени. А хотелось бы.
Погоди. Конкретно то, о чём я писал в изменениях - раньше скрипт сбрасывал area selection при некоторых действиях, юзерам было неудобно. Теперь, если в проекте есть выделение, скрипт на него не влияет.
А работа с областью - ну, что-то в этом есть, но исторически сложилось, что Слайсер основан на работе с айтемами. Менять идеологию - это менять всё полностью.

А вот это мне кажется лишнее и нужно убрать. Или нет? Если айтем mute, то и в нем значит тишина и нечего с ним значит делать не нужно.
Там всё довольно интеллектуально работает. Если юзер выберет несколько айтемов - после автоматического glue его muted айтемы превратятся в тишину, а обычные просканируются. Если заглушён только один айтем и выбран он, то и по нему можно работать. Здесь логика такая - если юзер выделяет заглушённый айтем и запускает скрипт, это может указывать только на то, что он не хочет получить пустое окно скрипта :) Mute потом легко снять при необходимости, ну и глушёный айтем в мультитреке может быть Guide айтемом, которого не должно быть слышно.

Еще по возможности можешь исправить, что бы семплеры/ноты создавались с первой ноты, а не с 24.
Да это ж контролируемая фича. Если ноты стартуют с 0, то с клавиатуры средних или малых размеров ими неудобно играть, постоянно нужно транспонировать. Сейчас по умолчанию стоит +2 октавы. Это меняется в MIDI_Base_Oct = 2 -- (Start note for Export to MIDI Sampler. 0 = C-1, 1 = C0, 2 = C1, etc), в User Area скрипта.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Для всяких пользователей uad и слабых компьютеров может быть полезно.
Да не только, не всегда нужны эффекты с оригинального трека или роутинг. Может ты не допонял о чем я, я об этом
178430
178431

Погоди. Конкретно то, о чём я писал в изменениях - раньше скрипт сбрасывал area selection при некоторых действиях, юзерам было неудобно. Теперь, если в проекте есть выделение, скрипт на него не влияет.
Я не об этом!
Я вот о чем - вот в этой ситуации я хочу в слайсере увидеть вот это, а не вот это, что бы слайсер обрабатывал только то, что находится в выборе времени. Самый простой способ, это при запуске скрипта или при нажатии Get Item применить экшен "Item: Split items at time selection" , т.е. не просто применить, а проверить, есть ли выделенные айтемы в выборе времени и если есть, то применить, а если нет, то не применять этот экшен.
Там всё довольно интеллектуально работает. Если юзер выберет несколько айтемов - после автоматического glue его muted айтемы превратятся в тишину, а обычные просканируются.
Ну все правильно вот гиф (только на ней маркеры не добавились, об этом ниже*) в скрипте отобразился только реальный звук и по нажатию на Markers, маркеры должны добавится только в первый и третий айтем.
Хоть это и не принципиально, мне это точно не мешает, просто высказываю свою точку зрения, как должно быть правильнее. Если трудно - то забей.
Да это ж контролируемая фича. Если ноты стартуют с 0, то с клавиатуры средних или малых размеров ими неудобно играть, постоянно нужно транспонировать. Сейчас по умолчанию стоит +2 октавы. Это меняется в MIDI_Base_Oct = 2 -- (Start note for Export to MIDI Sampler. 0 = C-1, 1 = C0, 2 = C1, etc), в User Area скрипта.
Да - это я прекрасно понимаю, что с малых клавиатур играть не удобно и для малых клавиатур 2 октавы так же мало, нужно 4, а если нот много!?
Мне кажется будет правильнее параметр "MIDI_Base_Oct" убрать из User Area скрипта и прописать простое условие
проверить количество маркеров и
если маркеров < 67 то MIDI_Base_Oct = 4
в противном случае
если маркеров > 67 и < 79 то MIDI_Base_Oct = 3
в противном случае
если маркеров > 79 и < 91 то MIDI_Base_Oct = 2
в противном случае
если маркеров > 91 и < 103 то MIDI_Base_Oct = 1
в противном случае
если маркеров > 103 то MIDI_Base_Oct = 0



* При выделении группы айтемов, скрипт склеивает айтем,
по нажатию на markers восстанавливает айтемы в исходное состояние, но маркеры не добавляет.​
по нажатию на midi все создается, но склеенный айтем не восстанавливается.​
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Мне кажется, что было бы удобнее, если в User Area была возможность установки включенного/выключенного мониторинга на треке, создаваемого скриптом.
 

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
Офигеть, я не неделю выпал :D Похоже, айтемы невозможно корректно обрабатывать, когда они пересекаются: к примеру, heal вообще не срабатывает, даже если наслоенный айтем не выделен. Я оставил багрепорт, но не уверен, возможно ли это поправить и поправят ли вообще.
Самое главное сейчас - скрипт не пытается склеить айтемы, если они слегка наслаиваются на не выделенные. Только ради этого пришлось полностью переделать принцип взаимодействия с Reset и тестить всё заново. Ну и повышенная скорость старта на длинных айтемах - на эти две вещи было потрачено больше всего времени, но оно того стоило.

Прямо сейчас аппрувнули:

1.4
+ Запуск и действия слайсера не сбрасывают Loop Selection.
+ Переработана и улучшена защита от некорректных действий или двойного нажатия на кнопки.
+ Всплывающее окно подсказки на старте, если это необходимо.
+ Доработана система не-деструктивной склейки айтемов.
+ Теперь скрипт корректно распознаёт waveform у muted айтемов.
+ Теперь MIDI Sampler создаёт новый трек.
+ MIDI Sampler копирует FX (User Defined), Routing, Mute/Solo, Volume, Pan и Width c оригинального трека на новый.
+ Исправлено некорректное поведение функций Slice и Markers при наслаивании айтемов.
+ Теперь айтемы не меняют свою позицию, если стартуют не строго с начала такта.
+ Исправлено некорректное поведение MIDI Sampler при наслаивании айтемов.
+ Увеличена скорость инициализации, на длинных айтемах окно открывается без задержки.
+ Увелчена скорость просчёта волноформы и связанных операций примерно на 20%.
+ Максимальная длительность аудио увеличена до 5 мин (300с).
+ Множество мелких изменений, оптимизация и очистка кода.

@Archchie, спасибо за идеи, но не забывай про главные принципы скрипта. Это быстрый инструмент для комфортной работы, действия которого основаны на айтемах. Если что-то вызывает лишние действия или не предсказуемо для пользователя - я это отсекаю. У меня у самого есть куча идей, но их никогда не будет в этом скрипте.
Про запоминание размера окна идея крутая, но сейчас это выглядит довольно сложно. Я сходу нашёл переменные, что за него отвечают, но там всё значительно сложнее, чем позиция окна или дока.

@Mr_Tsonts, опа. Не подумал про это, у меня любой трек создаётся с активным мониторингом, так что я не заметил изменений. Может ли так быть, что дело просто в заданных дефолтных настройках для новых треков в самом Рипере?
 
  • Like
Реакции: Landre

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
@Kokarev Maxim, у меня тоже по дефолту треки создаются со включенным мониторингом, но слайсер создаёт, почему-то, с выключенным. Я поэтому и написал. Собственно, мало ли, кому как удобнее, тот так и настроит себе. Вот установка нижней ноты для расстановки сэмплов действительно нужная опция, за это спасибо.
 

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Самое главное сейчас - скрипт не пытается склеить айтемы, если они слегка наслаиваются на не выделенные.
Так можешь glue использовать. Конечно с glue помедленнее будет работать, если айтемов много (пока все отрендерится), но зато все склеется. А вот если совместить heal и glue, то это может ускорить весь процес, т.е. сначала применяешь heal, а затем glue и glue уже доклеивает то, что не смог восстановить heal. Вот написал функцию для склейки соприкасающихся стык в стык айтемов, можешь её и применить.
PHP:
    local function GlueCracksInItems();
   
       local sel_item = {};
       local function Save_Selected_Items();
          for i = 1, reaper.CountSelectedMediaItems(0) do;
             sel_item[i] = reaper.GetSelectedMediaItem(0,i-1);
          end;
       end;
       ---
       local function Restore_Selected_Items();
          for i=1,#sel_item do;
             pcall(reaper.SetMediaItemSelected,sel_item[i],1);
          end;
       end;
       ---
       local function compare(x,y);
          local floatShare = 0.0000001;
          return math.abs(x-y)<floatShare;
       end;
       ----
      
       reaper.PreventUIRefresh(1);
       reaper.Undo_BeginBlock();
      
       local lastX;
       ::restart::;
       local pos2,track2,item2;
       local itT = {};
       local itT2 = {};
       Save_Selected_Items();
       for i = reaper.CountSelectedMediaItems(0)-1,0,-1 do;
          local item = reaper.GetSelectedMediaItem(0,i);
          local pos = reaper.GetMediaItemInfo_Value(item,'D_POSITION');
          local End = reaper.GetMediaItemInfo_Value(item,'D_LENGTH')+pos;
          ::last::;
          if compare(End,(pos2 or-1))and track2 == track and not lastX then;
             if not itT2[tostring(item)]then;
                itT2[tostring(item)]=true;
                itT[#itT+1]=item;
             end;
             if not itT2[tostring(item2)]then;
                itT2[tostring(item2)]=true;
                itT[#itT+1]=item2;
             end;
             if i == 0 then lastX=1 goto last end;
          else;
             if #itT >= 2 then;
                reaper.SelectAllMediaItems(0,0);
                for t = 1,#itT do;
                    reaper.SetMediaItemInfo_Value(itT[t],'B_UISEL',1);
                end;
                reaper.Main_OnCommand(40257,0);--Glue items
                Restore_Selected_Items();
                goto restart;
             else;
                itT = {};
             end;
          end;
          pos2 = pos;
          track2 = track;
          item2 = item;
       end;
      
       reaper.PreventUIRefresh(-1);
       reaper.Undo_EndBlock("Glue cracks in items",-1);
       reaper.UpdateArrange();
    end;
Всплывающее окно подсказки на старте, если это необходимо.
Вообще не понял о чем речь.

MIDI Sampler копирует FX (User Defined), Routing, Mute/Solo, Volume, Pan и Width c оригинального трека на новый.
Routing не копируется!
Про запоминание размера окна идея крутая, но сейчас это выглядит довольно сложно. Я сходу нашёл переменные, что за него отвечают, но там всё значительно сложнее, чем позиция окна или дока.
Да там все проще простого!)) Функция dock() возвращает док , x y (позицию) и w h (размер) окна.
local dock,win_x, win_y, win_w, win_h = gfx.dock(-1,-1,-1,-1,-1);
И ExState для сохранения в помощь. Все тоже самое, что и с позицией.
@Archchie, спасибо за идеи, но не забывай про главные принципы скрипта. Это быстрый инструмент для комфортной работы, действия которого основаны на айтемах. Если что-то вызывает лишние действия или не предсказуемо для пользователя - я это отсекаю. У меня у самого есть куча идей, но их никогда не будет в этом скрипте.
Вот именно, что я об этом не забываю, а вот ты мне кажется забыл!
По поводу копирования роутинга в режиме семплирования я писал о добавлении окна с запросом, но ты не придал этому значения.
Сейчас роутинг не копируется (хотя ты пишешь что копируется) и если мне нужны эффекты с оригинального трека, то мне их надо вручную скопировать. Или если скрипт будет копировать роутинг, (ты это уже делал в скрипте), то тогда если мне не нужны эффекты с оригинального трека, то мне нужно все эти fx удалить в ручную. Это же быстрее - Правда, чем нажать кнопку да-нет?), хотя это решается в пару строк кода!
По поводу Выбора времени тоже не придал значения. Есть допустим у меня 3-х минутное аудио и мне нужно поправить или сэмплировать или ... буквально несколько тактов и для этого мне нужно вручную все порезать, затем выделить и только потом применить скрипт. Это тоже же быстрее чем выставить выбор времени и применить скрипт. Правда?
Я не знаю, может ты не понял о чем я здесь говорил:
Самый простой способ, это при запуске скрипта или при нажатии Get Item применить экшен "Item: Split items at time selection" , т.е. не просто применить, а проверить, есть ли выделенные айтемы в выборе времени и если есть, то применить, а если нет, то не применять этот экшен.
То вот сделал скрипт, все проверки о которых я писал, уже присутствуют в скрипте, т.е. просто тупо применяешь скрипт перед запуском скрипта и/или перед нажатием на кнопку "Get Item" и будет все работать в выборе времени, если в нем присутствуют айтемы иначе все будет так как сейчас.
Archie_Item; Split items by time selection,unselect with items outside of time selection if there is selection inside.lua
Про
"MIDI_Base_Oct" убрать из User Area скрипта и прописать простое условие
Тоже не придал значения, Если большой элемент, то проще открыть файл скрипта и изменить значения "MIDI_Base_Oct", это тоже быстрее чем скрипт это сам сделает на автомате.
И вообще в Gui скрипте все настройки из "User Area" можно, т.е. нужно вынести во всплывающее меню.
Вот видишь, а ты говоришь что это я забыл о том что "Это быстрый инструмент для комфортной работы".

Ладно - раз говоришь что этого не будет никогда в скрипте, то больше не буду здесь писать и тестить.(
Просто можно сделать "Ай - так пойдет", а можно сделать "идеально".
Не нужно сдаваться при первых же трудностях. Если что то не получается или не знаешь или не умеешь, то можешь спросить здесь, По возможности кто нибудь обязательно поможет, наверное.

P.S. В режиме сэмплирования трек не тот выделяется!
 
Последнее редактирование:

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
***
По поводу копирования роутинга в режиме семплирования я писал о добавлении окна с запросом, но ты не придал этому значения.
Сейчас роутинг не копируется (хотя ты пишешь что копируется) и если мне нужны эффекты с оригинального трека
Речь о копировании роутинга и/или эффектов, а то непонятно там написал. Роутинг, эффекты, все в кучу на перемешал.
 
Последнее редактирование:

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
@Archchie, это лишнее, нет причин для эмоций и тем более каких-то обид. Призываю придерживаться профессиональной этики и отнестись уважительно к чужому труду.

По порядку:

Запоминание размера окна - готово.

Работа с выделенной областью - не в ближайшее время. Прошедшую неделю я по 14 часов в день сидел над той частью кода, приводя её в порядок и многократно тестируя. Сейчас не самое лучшее время, чтобы заниматься этим снова. И это не просто разрез по выделенной области - мне ещё нужно придумать, как вести себя при работе с мультитреком, некоторыми условиями в работе и как это всё отменять по Reset.

Роутинг и мониторинг проверил на Portable версии. Работает точно так же, как и ожидалось. Я не знаю, что здесь сказать. Если будет больше багрепортов, буду действовать.

Нижняя нота в МИДИ Сэмплере фиксирована. Это удобно. Если она будет менять свою позицию, то с каждым сэмплированным фрагментом у пользователя с миди клавиатурой будет сюрприз и поиск первой ноты в паттерне с пробегом по клавиатуре и транспонированием.
Я за предсказуемое поведение.
Если вдруг нужен большой размер паттернов - есть настройка, дропающая старт до первой ноты. Если и этого недостаточно - без проблем можно сэмплировать частями.

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

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

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

В ближайших планах (частично готово):

1.4.1
+ Ноты в Миди Эдиторе теперь имеют короткие имена.
+ Скрипт запоминает размер окна с последней сессии.
+ Добавлено меню с User Settings. Теперь все настройки под руками, без редактирования скрипта.
 
  • Like
Реакции: Archie's, Alx_g и Landre

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Archchie, это лишнее, нет причин для эмоций и тем более каких-то обид. Призываю придерживаться профессиональной этики и отнестись уважительно к чужому труду.
Да нет ни каких эмоций и тем более обид.;) Я всегда уважительно отношусь к чужому труду, и скрипт суперский, молодец. Просто написал, что раз не принимаешь мои замечания во внимания, то не буду больше писать и тестить (ведь скрипт новый и совсем сырой еще и ведется тестирование, на которое ты не реагируешь), значит пусть будет - как будет, как ты считаешь нужным. А все остальное, это так подсказки и советы что быстрее, а что не быстрее.
Работа с выделенной областью - не в ближайшее время. Прошедшую неделю я по 14 часов в день сидел над той частью кода, приводя её в порядок и многократно тестируя. Сейчас не самое лучшее время, чтобы заниматься этим снова. И это не просто разрез по выделенной области - мне ещё нужно придумать, как вести себя при работе с мультитреком, некоторыми условиями в работе и как это всё отменять по Reset.
Начну с конца:
Как по мне, то кнопку Reset вообще нужно убрать, она и сейчас неадекватно работает! Если несколько айтемов выделяем и запускаем скрипт, то скрипт склеит их все и всё, больше ничего не восстановит. Если применить скрипт затем кликнуть по аранжу т.е. снять выделения с айтемов, то восстановления не будет. Если так же несколько выделенных айтемов на треке, после запуска скрипта айтемы склеются и если применить семплер и после создания миди нажать на Reset, то также сброс не произойдет, т.е. вообще ничего не произойдет, ни трек с миди не удалится, ни склеенный айтем не восстановится. И еще множество случаев, при которых восстановления не произойдет. Здесь лучший способ применить ctrl+z. Так что мне кажется что кнопку Reset нужно выбросить из скрипта вообще или переименовать её в undo и привязать к ней только экшен "Edit: Undo".
Что касается мультитреков, то здесь у тебя все работает только по выделенным айтемам, не смотря сгруппированы они или нет, за исключением добавления маркеров, так что в функцию добавления маркеров нужно добавить одно условие в пару строк, "если айтем выделен, то добавить маркеры"
PHP:
sel = reaper.GetMediaItemInfo_Value(item,'B_UISEL');
if sel == 1 then;
    доьавить маркеры
end;
Все, теперь скрипт снимающий выделения за выбором времени, если есть выделения в выборе времени перед запуском скрипта и перед нажатием Get Item. Archie_Item; Split items by time selection,unselect with items outside of time selection if there is selection inside.lua
По поводу 14 часов в день, да это действительно много времени занимает, я знаю, но почему ты вопросы не задаешь, если что то не знаешь или не получается или функцию не можешь найти или сделать. Я уверен что ты порой на решение простой какой нибудь задачи (которая простая и решенная, но ты просто об этом не знаешь) тратишь часы, а потом вообще забиваешь на это, как взять вот с размерам окна, ты говоришь что искал и нашел какие то переменные, но там все сложно и я забил, хотя все оказалось очень просто, правда же? так что если что то не получается, не знаешь, задал вопрос и дальше пытаешься сам решить, если кто то знает, то обязательно подскажет, не стесняйся и задавай вопросы не важно простые, не простые, задал вопрос, задал второй, задал третий, даже если тебе ответили только на один вопрос из 5 или даже 10, то это все равно ускорит уже твой процес, так что не стесняйся задавать вопросы!

Роутинг и мониторинг проверил на Portable версии. Работает точно так же, как и ожидалось. Я не знаю, что здесь сказать. Если будет больше багрепортов, буду действовать.
Вот тебе гиф:
Мониторинг да работает, потому что это в настройках рипера настраивается, а вот роутинг нет! Так же Portable версия!!!
111.gif
Нижняя нота в МИДИ Сэмплере фиксирована. Это удобно. Если она будет менять свою позицию, то с каждым сэмплированным фрагментом у пользователя с миди клавиатурой будет сюрприз и поиск первой ноты в паттерне с пробегом по клавиатуре и транспонированием.
Я за предсказуемое поведение.
Если вдруг нужен большой размер паттернов - есть настройка, дропающая старт до первой ноты. Если и этого недостаточно - без проблем можно сэмплировать частями.
Не буду настаивать, но ни каких сюрпризов у пользователя с поиском первой ноты не будет и не сочиняй, потому что всегда будет первая нота на четвертой октаве, но а если сэмплов сильно много, то соответственно все въезжает в низ для того, что бы влезли другие ноты это более предсказуемо и понятно, чем половина нот вообще не добавятся и вот именно вот это я считаю уже не предсказуемо потому что место есть, а нот нет - странная какая та работа получается.
На счёт роутинга и эффектов и дополнительных окошек. Сейчас принцип такой: по одному нажатию кнопки пользователь получает слайсенный фрагмент без изменений в звуке, ибо обработка и посылы копируются. Всё остальное - на совести пользователя. И пока я не столкнулся с workflow, при котором жизненно необходимы какие-то изменения.
Да жизненно необходимых изменений вообще нету, можно и ничего не переделывать!
А насчет посылов, то у меня порой на треке целая куча посылов, и на семплере они порой действительно не нужны и их придется ручками удалить.
На счет эффектов такая же беда, порой на треке куча обработки, которая не нужна на семплере и приходится вручную удалять, хотя можно сделать запрос копировать или нет.
Лишние окошки для подтверждения действий - это ад для юзера. Одному фича пригодится, а сто человек будут каждый раз запинаться об то, что можно отключить в опциях.
В каких опциях ? Лазить в скрипт постоянно?
Можно добавить туда же в скрипт в "User Area" переменную которая 0 не копировать, 1 копировать, 2 показать окно для выбора (для эффектов уже есть такая "MIDISamplerCopyFX" только третье положение ей добавить и все, ну и такую же для роутинга). У тебя практически автоматом эта переменная создастся, когда ты запрос пропишешь и этот запрос оборачиваешь в условия "если 3, то запустить запрос".
Так для справки: Окно запроса вызывается функцией "val = reaper.MB("Messages","title",1);"
P.S. В режиме сэмплирования трек не тот выделяется!
Гиф
111.gif
Версию 1.4.1 Не тестил - Не нашел.
 

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
Уже в РеаПаке.

1.4.1
+ Ноты в Миди Эдиторе теперь имеют короткие имена.
+ Скрипт запоминает размер окна с последней сессии.
+ Добавлено меню с User Settings.
+ Исправлено некорректное выделение трека после работы MIDI Sampler.
+ Улучшена точность установки/удаления маркеров при малом размере окна: область захвата теперь адаптивна к масштабу.
+ Упрощено зуммирование старта и конца вейвформы.
+ Плей курсор снапится по старту вейвформы, если клик близко к левому краю окна.
+ Auto scroll view.
+ Better font scaling (Tips on the Start screen).
+ Максимальный горизонтальный зум по клавишам теперь соответствует максимальному по колесу мыши.
+ Теперь скрипт может работать с выделенной областью, беря при инициализации айтем(ы) с выделенного трека.
+ Айтемы разрезаются при работе с мультитреком, если они имеют длину, отличающуюся от длины айтема при инициализации.

Работа с областью выделения:


Меню и сброс масштаба:

Арчи, спасибо ещё раз за скрипт по формуле "из герц в значение". Теперь буду знать, что к тебе ещё и по математике можно обращаться :D Удивительным образом его получилось успешно прикрутить как ответную часть к инопланетной формуле Евгена учитывая её неточность :)

По обсуждаемым правкам:
Работу с областью добавил. Правда, работает только при запуске скрипта или по кнопке Get Item, в таких условиях я смог её воткнуть малой кровью и не ломая всего остального. Берёт айтем(ы) из выделенной области + выделение трека. Если нет выделения, работает по старинке, по айтемам.
Копирование роутинга не работает в некоторых условиях. Похоже, это проблема на стороне sws, там всё выполняется в две строки экшнов, ломаться нечему.
Выделение трека после Сэмплирования остаётся на оригинальном треке. Это удобно с выделением области - не нужно раз за разом переключаться с нового трека, если нужно сэмплировать несколько кусков.

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

Кстати, прямо сейчас, сходу, есть пара вопросов:
Этот GUI Евгена не позволяет визуально менять слайдеры "на лету"? Как я понимаю, код выставляет значения и прорисовывает их только при инициализации, а во время работы скрипта слайдеры двигаются только мышкой, скрипт так не сможет? Ответ на этот вопрос повлияет на судьбу функции "Пресеты".
То есть, я уже сейчас могу прикрутить назначение слайдерам определённых значений, но слайдеры сдвинутся до этих значений только после полного перезапуска скрипта.

И ещё. Есть ли команды в api для копирования/вставки sends/returns? Я нашёл Get/SetTrackSendInfo_Value, но он ведь только c существующими сэндами и их параметрами работает, а копировать/добавлять сэнды не умеет?
 
Последнее редактирование:

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Арчи, спасибо ещё раз за скрипт по формуле "из герц в значение". Теперь буду знать, что к тебе ещё и по математике можно обращаться :D Удивительным образом его получилось успешно прикрутить как ответную часть к инопланетной формуле Евгена учитывая её неточность
Я так и не понял, для чего ты мою первую функцию переделал под Евгена? Я же написал тебе там, что удали эту формулу Евгена и замени моей функцией. И еще раз повторю, что не рекомендую так использовать, потому что две функции сделаны по разным формулам могут выдавать разные результаты. А мои в любом случае при любых обстоятельствах вернут один и тот же результат в обе стороны.
Что касается математики, то я тоже в ней не силен, так написанную формулу просто перевел в код.))
Работу с областью добавил. Правда, работает только при запуске скрипта или по кнопке Get Item, в таких условиях я смог её воткнуть малой кровью и не ломая всего остального. Берёт айтем(ы) из выделенной области + выделение трека. Если нет выделения, работает по старинке, по айтемам.
Что касаемо выбора времени, то зря ты не рассмотрел скрипт,
Archie_Item; Split items by time selection,unselect with items outside of time selection if there is selection inside.lua
я специально под твою задачу его писал, со всеми проверками, что бы тебе не надо было проверять есть выбор времени или нет выбор времени, но ты стал делать с помощью экшенов, вот смотри - ты делаешь так: Снимаешь выбор времени со всех айтемов и далее выбираешь айтемы в выборе времени, а представь вот такую ситуацию
179008

И вот в этой ситуации у тебя снимется выделения и далее ничего не произойдет!
Я же все это в том скрипте предусмотрел, т.е. тот скрипт разрежет айтемы или снимет выделения за приделами выбора времени только в том случае, если есть выделенный айтем в выборе времени.
Т.е. с моим скриптом работало бы так: Если есть выделенный айтем в выборе времени, то тогда работало бы по выбору времени, а если нет, то как обычно и не смотря на то, что есть выбор времени или нет.
И вообще ты там что то нагородил непонятное, то что сделал, что скрипт теперь отталкивается от выделенного трека, вообще не удобно!
Если нету выделенных айтемов, то все равно скрипт сработает на выделенном треке, хотя ничего не должно произойти, если вообще нету выделенных треков, то скрипт режет весь проект по выбору времени, и еще проклеивает это все для чего то, без разбора, создавая кучу ненужных файлов.
Я же говорил, что тупо примени мой скрипт перед запуском скрипта и перед нажатием на Get Item и больше ничего не делай в этой области, ну и в функцию добавления маркеров условие добавить про выделение и все, а ты огород какой то нагородил)).
Копирование роутинга не работает в некоторых условиях.
Копирование роутинга вообще кусками какими то копируется, то только первый посыл скопируется, то третий, то вообще не одного. Короче загадочно это работает.
Этот GUI Евгена не позволяет визуально менять слайдеры "на лету"? Как я понимаю, код выставляет значения и прорисовывает их только при инициализации, а во время работы скрипта слайдеры двигаются только мышкой, скрипт так не сможет? Ответ на этот вопрос повлияет на судьбу функции "Пресеты".
Я не знаком с ООП, но сделать это можно, причем легко, потому что все функции уже готовы в скрипте. Это нужно либо Евгена просить, что бы он подсказал, либо читать эту тему, там все описывается по такому же принципу, как у Жени , я так и не добрался до изучения той темы, или Lokasenna можно спросить, он шарит в этом лучше всех.
То есть, я уже сейчас могу прикрутить назначение слайдерам определённых значений, но слайдеры сдвинутся до этих значений только после полного перезапуска скрипта.
Ну в таком случае можешь поступить так: эту функцию прописываешь в функции loop и отслеживаешь какой нибудь переменной, например "RESTART", т.е. в начале скрипта пишешь local RESTART, затем при вызове пресета или в том условие, когда изменил все слайдеры, короче - думаю понял прописываешь RESTART = true
и в функции loop:
PHP:
       if RESTART == true then;
           local scriptFile = debug.getinfo(1,'S').source:gsub("^@",''):gsub("\\",'/');
           ..................  -- Функция Запомнить размер
           gfx.quit(); -- закрываем gui окно
           dofile(scriptFile); -- запускаем скрипт по новой
           RESTART =nil -- сбрасываем переменную (не обязательно, так на всякий случай)
           return; -- ломаем функцию loop (defer) в ранее запущенном скрипте
      end
Где "Функция Запомнить размер" вставить функцию из скрипта которая при выходе запоминает размер и положение окна.
И ещё. Есть ли команды в api для копирования/вставки sends/returns? Я нашёл Get/SetTrackSendInfo_Value, но он ведь только c существующими сэндами и их параметрами работает, а копировать/добавлять сэнды не умеет?
PHP:
    ---------------------------------------------------
    local function copyReceiveTrack(track,desttrIn,i);
        if i>reaper.GetTrackNumSends(track,-1)-1 then return end;
        local t={'P_SRCTRACK','I_MIDIFLAGS','I_DSTCHAN','I_SRCCHAN','I_AUTOMODE',
              'I_SENDMODE','D_PANLAW','D_PAN','D_VOL','B_MONO','B_PHASE','B_MUTE'};
        local t2 = {};
        for j = 1,#t do;
            t2[j] = reaper.GetTrackSendInfo_Value(track,-1,i,t[j]);
        end;
        local SendNew = reaper.CreateTrackSend(t2[1],desttrIn);
        for j = 2,#t do;
            reaper.SetTrackSendInfo_Value(t2[1],0,SendNew,t[j],t2[j]);
        end;
    end;
    ---------------------------------------------------


    ---------------------------------------------------
    local function copySendTrack(track,desttrIn,i);
        if i>reaper.GetTrackNumSends(track,0)-1 then return end;
        local t={'P_DESTTRACK','I_MIDIFLAGS','I_DSTCHAN','I_SRCCHAN','I_AUTOMODE',
              'I_SENDMODE','D_PANLAW','D_PAN','D_VOL','B_MONO','B_PHASE','B_MUTE'};
        local t2 = {};
        for j = 1,#t do;
            t2[j] = reaper.GetTrackSendInfo_Value(track,0,i,t[j]);
        end;
        local SendNew = reaper.CreateTrackSend(desttrIn,t2[1]);
        for j = 2,#t do;
            reaper.SetTrackSendInfo_Value(desttrIn,0,SendNew,t[j],t2[j]);
        end;
    end;
    ---------------------------------------------------




    -- Пример ==================================================


    -----------------------------------------
    track = reaper.GetSelectedTrack(0,0);--трек с которого копировать
    desttrIn = reaper.GetSelectedTrack(0,1);--трек на который копировать
    ------------------------------------------




    local CountSend = reaper.GetTrackNumSends(track,0);
    for i = 1,CountSend do;
        copySendTrack(track,desttrIn,i-1);
    end;


    local CountReceives = reaper.GetTrackNumSends(track,-1);
    for i = 1,CountReceives do;
       copyReceiveTrack(track,desttrIn,i-1);
    end;

    -- ========================================================

По поводу всплывающих окон при копировании тоже можешь подумать еще
Это будет выглядеть примерно вот так
PHP:
    if MIDISamplerCopyFX == 3 then
        mb = reaper.MB('Копировать или нет','Help',1);
        if mb == 1 then
            MIDISamplerCopyFX == 1 --copy
        else
            MIDISamplerCopyFX == 0 --no copy
        end
    end
Ну и соответственно в меню параметр "show Help Win" и если параметр включен, то к параметру copy добавляем # , т.е. делаем не активным
Ну и по условию для нот тоже можешь еще подумать.
----------------
Сильно не тестил, так что первое заметил, написал.

P.S. Авто скролл ты добавил, при первом запуске работает, но после первого прослушивания, если нажать стоп и передвинуть курсор в аранже, то в скрипте волна все равно останется в конце, т.е. можно сказать что авто скролл уже не работает. Вед курсор должен преследовать волну в любых случаях.
 
Последнее редактирование:

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Периодически пытаюсь использовать этот скрипт и у меня возник вопрос - если я разрезал айтем и хочу поработать над какой-то его частью, зачем он мне его клеит обратно?
 

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
Я так и не понял, для чего ты мою первую функцию переделал под Евгена?
А она висит на слайдерах фильтров в основном скрипте, я просто не стал трогать то, что уже работает. Это выглядит не правильно с точки зрения теории, но если даёт нужный результат и он легко достигается, то почему бы и нет.

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

Авто скролл ты добавил, при первом запуске работает, но после первого прослушивания, если нажать стоп и передвинуть курсор в аранже, то в скрипте волна все равно останется в конце, т.е. можно сказать что авто скролл уже не работает. Вед курсор должен преследовать волну в любых случаях.
Я сделал процесс удобнее, но, как и некоторые другие фичи, это будет работать только в пределах скрипта и пока он в фокусе.


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

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
Посмотри на гифки в моём предыдущем сообщении. Обработка айтема по частям происходит быстро и без лишних движений, определяется только область.
Я это все прекрасно понимаю и тот скрипт я не просто так тебе написал, я тоже сразу рассматривал идею с экшеном "Split items at time selection", но экшен чучуть не так работает, потому что он затачивался под свои нужды. Например: Если нет выделенных айтемов, то тот экшен режет весь проект, если есть выделенные айтемы и разрез не произошел, то ничего не сделает, вот по этому я и написал этот скрипт конкретно под твою задачу.
 

Mr_Tsonts

Well-Known Member
18 Апр 2019
1.656
1.341
113
56
Киев
Версия же последняя, 1.4.1?
Скрипт умеет работать только с одним айтемом. Если выделено несколько, он их склеит.
Версия последняя, айтем выделен один, но он является уже отрезанным от первоначального и скрипт клеит его обратно к следующему айтему, который тоже является частью от первоначального. То есть, я разрезал айтем изменил границы, попытался обработать одну из частей и скрипт тут же приклеил эту часть к другой половине. Выделена была одна только часть.
ПЫ.СЫ. Стоп))))) Сейчас не хочет повторить мне то что делал вчера. Сейчас работает корректно. Может, глюк какой... Или я чего-то... Ещё поисследую. Но пока отмена моей проблемы. Сорри.
 
Последнее редактирование:

Kokarev Maxim

ex cool
13 Май 2007
5.306
4.425
113
44
Барнаул
recording-studio.ru
Оставил в итоге я оба варианта работы с выделениями. Сколько тестировал, так и не смог жёстко оставить только один. По дефолту айтемы нужны (это более предсказуемо в работе), а поведение "трек+область" опционально.
В остальном - багфиксы и разные мелочи.

1.4.3
+ Скрипт теперь имеет on/off toggle статус с изменением состояния кнопки в тулбаре.
+ Исправлено: в некотрых случаях действие кнопки Reset влияло на выделение айтемов.
+ Исправлено: некорректное поведение скрипта, если в выделенной области не было айтемов.
+ Исправлено: некорректное поведение скрипта, если выделено несколько треков.
+ Исправлено: ошибка MIDI Sampler, если в скрипт не загружено аудио.
+ AutoScroll: повторный Play возвращает фокус к Плей курсору.
+ Изменено поведение скрипта при Time Selection (Опционально).
+ Исправлено некорректное копирование Routing в режиме Sampler.
 
  • Like
Реакции: Snjuk, Archie's и Landre

Archie's

Well-Known Member
24 Окт 2017
1.936
1.296
113
@Kokarev Maxim, Не тестил, но первое что бросилось в глаза при первом запуске - это если айтем нарезан и если на некоторых весят эффекты, то при выделении этих нескольких айтемов и применение скрипта, скрипт уничтожает все эффекты на айтемах или наоборот применяет эти эффекты ко всем айтемам, в зависимости от того, как расположены айтемы. А происходит это из за того что скрипт применяет Heal. В этом случае нужно применять всегда glue. что бы эффекты применялись, а не уничтожались без применения.
Кнопка reset также не будет восстанавливать эффекты, что еще раз доказывает, что она бесполезна. Кнопку ресет надо либо убирать, либо полностью ее перерабатывать. У тебя сейчас все восстановления происходит по выделенным айтемам и это совсем не правильно, потому что эти айтемы уже могут быть не выделены.
AutoScroll: Ты же сделал, что бы скрипт отслеживал курсор редактирования и при нажатии на плей скролил волну в скрипте к курсору. А почему не догадался сделать что бы скрипт еще и отслеживал плей курсор. Например у тебя зациклен этот айтем и дойдя плей до конца айтема, айтем начнет проигрываться по новой, а волна в скрипте останется в конце и не прыгнет в начало.
 

Snjuk

Active Member
11 Июн 2014
265
126
43
43
Житомир UA
Здравствуйте, Как сделать чтобы при нарезке миди не открывались окна семплеров? Спасибо
 

Сейчас онлайн (Пользователей: 0, Гостей: 1)