KSP все о нем

я потому спросил, что вот же кучу лет не могу подружить левую готовую клавиатуру баяна Ефимова с электробаяном роланд FR3X - нужен очень хитрый скрипт между ними..)
 
я потому спросил, что вот же кучу лет не могу подружить левую готовую клавиатуру баяна Ефимова с электробаяном роланд FR3X - нужен очень хитрый скрипт между ними..)
А если экспортировать семплы, собрать свой инструмент и если надо скрипт? Думаю там всё схематично по семплам. Вобще мне Native Instruments Accordions 2 больше нравится, Ефимовский я не распаковывал. А вот из Accordions 2 я вынул все семплы левой руки и закачал в MODX :)
 
  • Haha
Реакции: «G~Li†ch»
Если получается распознавать аккорд (что нетривиально),
Напишите чуть более подробно, я новичок, нибумбум. Вот скрипт с аккордами, но там всё идёт на графический объект
My own chords scripted in KSP
Я от этих логических команд только запутываюсь.
Кстати, лучшая шпаргалка по KSP - https://www.nilsliberg.se/ksp/scripts/tutorial/
жаль что мало. Зато просто и понятно.
Если получается распознавать аккорд (что нетривиально),
Хотя бы два аккорда направить на клавиатуру, Мажор/Минор, чтобы реально ноты нажимались C1 и C2 (не аккорд, а нота)
В руке аккорд, а в нажатии одна нота... разной октавы.

---
Не сразу понял что делает оригинальный скрипт. Крутилкой выбирается исполняемый аккорд. Ровно обратное нужно мне :)
Ну, почти. И без крутилки.
 
Последнее редактирование:
Код:
on init
message("")
set_script_title("Chord")
set_ui_height(2)

declare !chord_names[2]
!chord_names[0] := "Maj"
!chord_names[4] := "min"

declare %chord_types[2*4] := (...
4, 7, 0, 0,...
3, 7, 0, 0)

declare $chord_types

end on

on note

if ($chord_types #5)

play_note($EVENT_NOTE,$EVENT_VELOCITY,0,-1)
else
play_note($EVENT_NOTE + 12,$EVENT_VELOCITY,0,-1)
end if

end on

:rolleyes:
 
@semiono.spb, Прошу прощения, времени сейчас нет от слова совсем. Поэтому помочь особо не могу, тем более, что Kontakt в принципе нет желания ковырять уже...
Но распознавалку аккордов я писал. Только не довёл инструмент до готового состояния. Где-то там всё есть)
 
  • Like
Реакции: semiono.spb
PS
Если получается распознавать аккорд (что нетривиально),
Это как "немаловероятно", я чесно говоря не сразу понял, что вопрос-то непростой как кажется.
Но архиважный, потому то это фактически самоиграй на уровне One Man Band, vArranger2, за которыми
все охотятся и которые глюковаты немеренно.
 
Подскажите, какие бывают скрипты или способы сборки? Creator Tools - это для чего, для удобства?
Дело в том что некоторый код выдаёт ошибку, например:
Код:
define MAX_CHORD_NOTES := 3      // Three note chord detection
define OCTAVE := 12     // According to this script, the minor loop samples are placed on the second lowest octave
и как я догадываюсь это не предназначено напрямую вбивать в Kontakt Script Editor окно?
Видимо в сборке "проектов" используются инклюды? Нужно ли это или просто так удобней?
 
@semiono.spb, этот проект собирался под SublimeKSP
Но вообще, как ни старайся, на KSP писать всё равно неудобно. Очень многословно, широко и в больших проектах возникают конфликты имён. Он предполагался как маленький лёгкий скриптовый язык для простенькой логики. А то, что на нём ваяют конторы в итоге получается монструозным, как по самому коду, так и по ресурсам.

Creator Tools — это попытка сделать заплатку и написать свою IDE для разработки. Она может подключаться к контакту для удобного дебага скриптов и более лёгкого управления инструментом. Но в итоге выглядит тоже достаточно мрачно, особенно на фоне HISE, который изначально собирался как IDE.
 
  • Like
Реакции: semiono.spb
Можно распознавать аккорды через «окно», или в лоб, но тогда надо разделять зону распознавания и зону игры.
Если разпознаём через окно:
⋅ при первом выполнении on note открываем «окно» (допустим, $window_opened := 1) и запускаем счётчик (wait(1500-3000)).

⋅ Во время окна собираем все нажатые (%NOTE_HELD) ноты в массив.

⋅ Потом, когда окно закрывается, сортируем ноты так, чтобы получился аккорд. Можно начать просто с того, чтобы сортировать по звуковысотности и смотреть, какие там получаются интервалы. Я сортировал так, чтобы попытаться выстроить аккорд по терциям и уже потом выяснять, что это такое.

⋅ потом играем то, что получилось. А на следующий on note опять запускаем счётчик.

Но вообще мне ближе вариант без окна, когда мы при каждой нажатой ноте распознаём аккорд в зоне распознования, а играем отдельными клавишами.

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

@V_ad_im , для того, чтобы подружить твой баян с левой клавиатурой нужно сначала миди-монитором снять все свои клавиши и понять, какие они сообщения отправляют. А потом в мульти-скрипте (или может быть даже в JSFX) написать для них маппинг. В самом простом случае это будут два массива. В первом — нота с твоего баяна, а во втором — нота на Ефимовском. По идее, за вечер можно сварганить.
 
Код:
on init
  message("")
  make_perfview
  set_ui_height(4)
  declare ui_value_edit $Chrd_Wait(1, 100, 1)
  declare $i
  declare $note_counter := 0
  declare %note_array[3]
  declare $new_ncb
  declare %intervals[2]
  declare !note_name[12]
  !note_name[0] := "C "
  !note_name[1] := "Db"
  !note_name[2] := "D "
  !note_name[3] := "Eb"
  !note_name[4] := "E "
  !note_name[5] := "F "
  !note_name[6] := "Gb"
  !note_name[7] := "G "
  !note_name[8] := "Ab"
  !note_name[9] := "A "
  !note_name[10] := "Bb"
  !note_name[11] := "B "
  $Chrd_Wait := 50
end on

on note
  ignore_event($EVENT_ID)
  message("")
  $new_ncb := $NI_CALLBACK_ID
  $i := 0
  $note_counter := 0
  while ($i<12 and ($note_counter<3))
    if (%KEY_DOWN_OCT[$i]=1)
      %note_array[$note_counter] := $i
      inc($note_counter)
    end if
    inc($i)
  end while
  wait($Chrd_Wait)
  if ($new_ncb=$NI_CALLBACK_ID and ($note_counter=3))
    sort(%note_array,0)
    $i := 0
    while ($i<2)
      %intervals[$i] := %note_array[$i+1]-%note_array[$i]
      inc($i)
    end while
    select (%intervals[0])
      case 3
        select (%intervals[1])
          case 5
            play_note(%note_array[2],$EVENT_VELOCITY,0,-1)
            message(!note_name[%note_array[2]] & " | major chord")
          case 4
            play_note(12+%note_array[0],$EVENT_VELOCITY,0,-1)
            message(!note_name[%note_array[0]] & " | minor chord")
        end select
      case 4
        select (%intervals[1])
          case 3
            play_note(%note_array[0],$EVENT_VELOCITY,0,-1)
            message(!note_name[%note_array[0]] & " | major chord")
          case 5
            play_note(12+%note_array[2],$EVENT_VELOCITY,0,-1)
            message(!note_name[%note_array[2]] & " | minor chord")
        end select
      case 5
        select (%intervals[1])
          case 4
            play_note(%note_array[1],$EVENT_VELOCITY,0,-1)
            message(!note_name[%note_array[1]] & " | major chord")
          case 3
            play_note(12+%note_array[1],$EVENT_VELOCITY,0,-1)
            message(!note_name[%note_array[1]] & " | minor chord")
        end select
    end select
  end if
end on

Код:
on init
declare ui_label $chord_name(2, 1) {{{{{Note + mode{{{}
declare ui_button $start
declare !note_names[12]
!note_names[0] := "C"
!note_names[1] := "C#"
!note_names[2] := "D"
!note_names[3] := "D#"
!note_names[4] := "E"
!note_names[5] := "F"
!note_names[6] := "F#"
!note_names[7] := "G"
!note_names[8] := "G#"
!note_names[9] := "A"
!note_names[10] := "A#"
!note_names[11] := "B"
declare $do
declare $dom
declare $i
declare $j
declare const $NUM_CHORDS := 5
declare %chords[$NUM_CHORDS*12]
$i := 0
while ($i<=11)
declare %_notes[4]
%_notes[0] := ($i+0) mod 12
%_notes[1] := ($i+4) mod 12
%_notes[2] := ($i+7) mod 12
%_notes[3] := -1 mod 12
sort(%_notes,0)
%chords[0*12+$i] := sh_left(%_notes[0],0)+sh_left(%_notes[1],4)+sh_left(%_notes[2],8)+sh_left(%_notes[3],12)
%_notes[0] := ($i+0) mod 12
%_notes[1] := ($i+3) mod 12
%_notes[2] := ($i+7) mod 12
%_notes[3] := -1 mod 12
sort(%_notes,0)
%chords[1*12+$i] := sh_left(%_notes[0],0)+sh_left(%_notes[1],4)+sh_left(%_notes[2],8)+sh_left(%_notes[3],12)
%_notes[0] := ($i+0) mod 12
%_notes[1] := ($i+2) mod 12
%_notes[2] := ($i+7) mod 12
%_notes[3] := -1 mod 12
sort(%_notes,0)
%chords[2*12+$i] := sh_left(%_notes[0],0)+sh_left(%_notes[1],4)+sh_left(%_notes[2],8)+sh_left(%_notes[3],12)
%_notes[0] := ($i+0) mod 12
%_notes[1] := ($i+4) mod 12
%_notes[2] := ($i+7) mod 12
%_notes[3] := ($i+10) mod 12
sort(%_notes,0)
%chords[3*12+$i] := sh_left(%_notes[0],0)+sh_left(%_notes[1],4)+sh_left(%_notes[2],8)+sh_left(%_notes[3],12)
%_notes[0] := ($i+0) mod 12
%_notes[1] := ($i+4) mod 12
%_notes[2] := ($i+7) mod 12
%_notes[3] := ($i+11) mod 12
sort(%_notes,0)
%chords[4*12+$i] := sh_left(%_notes[0],0)+sh_left(%_notes[1],4)+sh_left(%_notes[2],8)+sh_left(%_notes[3],12)
inc($i)
end while
declare !chord_names[$NUM_CHORDS]
!chord_names[0] := ""
!chord_names[1] := "m"
!chord_names[2] := " sus2"
!chord_names[3] := "7"
!chord_names[4] := " maj7"
declare $played_chord
declare %played_notes[12]
end on

on note
ignore_event($EVENT_NOTE)
ignore_event($EVENT_ID)
$i := 0
while ($i<num_elements(%played_notes))
%played_notes[$i] := -1
inc($i)
end while
$j := 0
$i := 0
while ($i<=11)
if (%KEY_DOWN_OCT[$i]=1)
%played_notes[$j] := $i
inc($j)
end if
inc($i)
end while
%_notes[0] := %played_notes[0] mod 12
%_notes[1] := %played_notes[1] mod 12
%_notes[2] := %played_notes[2] mod 12
%_notes[3] := %played_notes[3] mod 12
sort(%_notes,0)
$played_chord := sh_left(%_notes[0],0)+sh_left(%_notes[1],4)+sh_left(%_notes[2],8)+sh_left(%_notes[3],12)
$played_chord := search(%chords,$played_chord)
%_notes[0] := %played_notes[0] mod 12
%_notes[1] := %played_notes[1] mod 12
%_notes[2] := %played_notes[2] mod 12
%_notes[3] := %played_notes[3] mod 12
sort(%_notes,0)


if ($played_chord # -1)
set_text($chord_name,!note_names[$played_chord mod 12] & !chord_names[$played_chord/12])

else
set_text($chord_name,"")


end if
if ($played_chord mod 12 >= 0 and $played_chord/12 = 0 )
$do := play_note(0,$EVENT_VELOCITY,0,-1){{{{{{{{{{{{{{Loop Major}
change_tune($do,$played_chord mod 12 * 100000,0){{{{{{{{{{{{{Pitch Bend}
else

if ($played_chord/12 = 1)
$do := play_note(24,$EVENT_VELOCITY,0,-1) {{{{{{{{{{{Loop Minor}
change_tune($do,$played_chord mod 12 * 100000,0) {{{{{{{{{{{{{Pitch Bend}
end if
end if

end on
Нашёл два практически готовых кода, порадовался, прямо сразу готовое решение!
Но на этом всё и закончилось. В первом примере, я так понял проверяется терция
на мажор или минор, далее видимо чекается что ноты три. То есть здесь что-то
продолжить невозможно. Либо надо написать ещё больше строк чем сам код :)
Второй пример кажется замечательный, я сам склоняюсь к тому, что надо изначально
описать аккорды, а потом их сравнивать. Но здесь используется change_tune, на что
поначалу я даже не обратил внимание. Ну, это даёт нехилые искажения, хотя работает :)
Интересно эти две идеи можно склеить в одну или лучше всё снова написать?
 
  • Like
Реакции: PianoIst
Тогда буду его копать, ато думал там тоже лабиринт без выхода. Отлично!
 
Код:
on init
  declare const none := -1
  declare const chord_major := 24 + 12*2 
  declare const chord_minor := 24 + 12*3
  declare const chord_7     := 24 + 12*4
 
  declare current_chord := none
  declare new_chord
  declare base_note
  declare velocity[128]
  declare id
end on

function find_chord(base_note, chord)
  declare n
  chord := none
  for n := 0 to 11
    if KEY_DOWN_OCT[n] = 1 and KEY_DOWN_OCT[(n + 4) mod 12] = 1 and KEY_DOWN_OCT[(n + 7) mod 12] = 1
      base_note := n
      chord := chord_major
    end if
    if KEY_DOWN_OCT[n] = 1 and KEY_DOWN_OCT[(n + 3) mod 12] = 1 and KEY_DOWN_OCT[(n + 7) mod 12] = 1
      base_note := n
      chord := chord_minor
    end if
    if KEY_DOWN_OCT[n] = 1 and KEY_DOWN_OCT[(n + 10) mod 12] = 1
      base_note := n
      chord := chord_7
    end if
  end for 
end function

function maybe_change_chord
  { find the played chord }
  find_chord(base_note, new_chord)
 
  { if it's different from the current chord }
  if new_chord # current_chord
    { turn of previously played chord }
    note_off(id)
    current_chord := new_chord
    
    { play new chord }
    if new_chord # none     
      id := play_note(new_chord + base_note, velocity[base_note], 0, 0)     
    end if
  end if 
end function

on note 
  { save last used velocity for this note }
  velocity[EVENT_NOTE] := EVENT_VELOCITY
 
  { don't let the incoming note through to playback }
  ignore_event(EVENT_ID)
 
  { check for chord change }
  maybe_change_chord
end on

on release
  { check for chord change }
  maybe_change_chord
end on
Вот ещё программа кому интересно, как раз для аккордеона. :)
 
По идее, за вечер можно сварганить.
если б там было так просто, давно бы уже назначил..))

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

А в режиме выборки отсылается по одной ноте, но один из рядов дублируется, как в правой клавиатуре - и, соответственно, один ряд становится недоступен для назначения аккордов..


Это японцы не доделали. Проще скопить на более старшую модель, в которой есть специальный режим для таких случаев, предназначенный на отсыл сигнала в самоиграйки - как раз то, что хочет semiono.spb
ля-до-ми и в ответ аккорда/апликатуры должна нажаться нота ля первой октавы.
Затем, если нажать аккорд ля-до(диез)-ми, то дожна нажаться нота ля второй октавы.
 
Последнее редактирование:
  • Sad
Реакции: PianoIst
я потому спросил, что вот же кучу лет не могу подружить левую готовую клавиатуру баяна Ефимова с электробаяном роланд FR3X - нужен очень хитрый скрипт между ними..)
А как можно красиво детюнить аккордеон? Мне кажется French Musette из контактовских библиотек недостаточно расстроен.
У них вообще отдельным патчем French Musette.nki идёт с небольшим детюном, впринципе он идентичен обычному аккордеону
в ямахе PSR итп. А Musette как регистр в патче Accordion вообще не расстроен никак. Может я чего-то не понимаю?
А в чём тогда Musette заключается, если он такой же как Clarinet итп. Мне хочется что-то французского или итальянского.
Сам я пробовал расстроить два слоя одних и тех же звуков в Kontakt, но какое-то дребезжание получается, некрасиво.
Может какие-то сереты есть? Я даже три слоя подумал исползовать и с разведением по панораме, вроде бы читал,
что они три голоса используют в розлив. Интересно как можно что-то получше сделать. Библиотеки какие-то вялые.

Мой детюн больше похож на баян «Дебют», такое же дребезжание, какой-то хардовый розлив. :)
Может надо амплитудную модуляцию ещё накатить...

Сейчас снова послушал Ефимова, у него видимо скриптом сделано, кнопочка есть, впринципе неплохо звучит,
но скромно. Скрипт засекречен и добавить тюнинга собственно невозможно, а хотелось бы.
 
Последнее редактирование:
Нашёл хороший регистр в Sonokinetic, он не особо расстроен, но ближе к правде, и по рисунку волны видно что вибрато по динамике,
наверное в этом секрет. Интересно как это на акустике происходит, не трясёт же всёвремя исполнитель мех, наверное хитро корпус
так отражает, ровненькое AEG вибрато. :)
Скрипт там без защиты, аккорды распознаёт, правда огромный, я не вникал, но пригодится.
 
Я вот смотрю как правильные синтезаторы устроены, там просто добавляешь количество голосов в детюн и тут же их по панораме разводишь, всё легко одной крутилкой практически, например: Serum и другие.
В Kontakt я этого в эффектах не нашёл, писать скрипт что ли? Уже бы было среди скриптов, но что-то нету. Странно. Вручную прибавлять центы
к каждой группе, смещать панораму и смотреть что будет как-то неудобно. В синтах наверное какой-то алгоритм предусмотрен для этих целей.
 
В синтах наверное какой-то алгоритм предусмотрен для этих целей.
Ну в синтах GUI для пользователя\композитора. В Kontakt — для «разработчика»... Жить от этого легче не становится, учитывая прожорливость контакта...
 
  • Like
Реакции: semiono.spb
Ребят, нужен мультискрипт который дублирует конкретный СС на все каналы всех портов Контакта, но при этом остальные CC проходили стандартно по своему каналу.
@PianoIst, я пробовал твой remapper, это почти то, что нужно, но несколько иначе это работает, он либо клонирует все CC (что мне не нужно), либо только избранные( что мне нужно) но при этом он не пропускает другие CC, ну и работает корректно только в К5, в 6ом уже подглючивает.
Я нашёл вот такой простенький скрипт
Код:
on init
  set_script_title("Copy CC# to another Ch.")
  declare ui_value_edit $CC_num1(-1, 127, 1)
  set_text($CC_num1,"Orig CC#")
  declare ui_value_edit $Copy_Ch1(1, 16, 1)
  set_text($Copy_Ch1,"Copy to Ch.")
  declare ui_value_edit $CC_num2(-1, 127, 1)
  set_text($CC_num2,"Orig CC#")
  declare ui_value_edit $Copy_Ch2(1, 16, 1)
  set_text($Copy_Ch2,"Copy to Ch.")
  make_persistent($CC_num1)
  make_persistent($Copy_Ch1)
  make_persistent($CC_num2)
  make_persistent($Copy_Ch2)
  move_control($CC_num1,1,1)
  move_control($Copy_Ch1,2,1)
  move_control($CC_num2,4,1)
  move_control($Copy_Ch2,5,1)
end on

on midi_in
  if ($MIDI_COMMAND=$MIDI_COMMAND_CC and ($MIDI_BYTE_1=$CC_num1))
  set_midi($Copy_Ch1-1,$MIDI_COMMAND,$MIDI_BYTE_1,$MIDI_BYTE_2)
  end if
  if ($MIDI_COMMAND=$MIDI_COMMAND_CC and ($MIDI_BYTE_1=$CC_num2))
  set_midi($Copy_Ch2-1,$MIDI_COMMAND,$MIDI_BYTE_1,$MIDI_BYTE_2)
  end if
end on

Это почти то что нужно, но тут дублируется CC с одного канала на конкретный другой канал. В целом можно по идеи прописать вручную все каналы на которые продублировать, но не понимаю как прописывать каналы других портов.
 
@Sunshineman, это рыба. Я очень давно не писал в контакт, так что не помню, как там порты выбираются. Если тебе надо прямо во все каналы на всех портах посылать — то, скорее всего, в цикле надо указать не < 16, а < 64.

Но вообще такой DDOS сообщениями CC — плохая практика, потому что ты это ощутишь на производительности: все инструменты, включая те, которые не делают ничего — начнут что-то делать постоянно. Крутилки двигать, LFO пересчитывать и т.п.

Обычно реализуется "подбор" CC при игре на новом канале. Но это чуть длиннее, и без дебага я боюсь что-то писать. Если ночью живой буду и без работы — попробую.
Код:
on init
  set_script_title("Copy CC# to all Ch.")
  declare ui_value_edit $CC_num1(-1, 127, 1)
  set_text($CC_num1,"Orig CC#")
  make_persistent($CC_num1)
  move_control($CC_num1,1,1)
  declare $i := 0
end on

on midi_in
  $i := 0
  while ($i < 16)
      if ($MIDI_COMMAND=$MIDI_COMMAND_CC and $MIDI_BYTE_1=$CC_num1)
          set_midi($i,$MIDI_COMMAND,$MIDI_BYTE_1,$MIDI_BYTE_2)
      end if
  end while
end on
 
Но вообще такой DDOS сообщениями CC — плохая практика, потому что ты это ощутишь на производительности: все инструменты, включая те, которые не делают ничего — начнут что-то делать постоянно. Крутилки двигать, LFO пересчитывать и т.п.
Это я понимаю, но мне это нужно для управления позициями микрофонов, я пользуюсь отдельными патчами на каждую артикуляцию и приходится каждый раз что бы покрутить позиции включать твой ремапер и включать клонирование.
 
@Sunshineman,
Код:
on init
  set_script_title("Copy CC# to all Ch.")
  declare ui_value_edit $CC_num1(-1, 127, 1)
  set_text($CC_num1,"Orig CC#")
  make_persistent($CC_num1)
  move_control($CC_num1,1,1)
  declare $i := 0
end on

on midi_in
  $i := 0
  while ($i < 16)
      if ($MIDI_COMMAND=$MIDI_COMMAND_CC and $MIDI_BYTE_1=$CC_num1)
          set_midi($i,$MIDI_COMMAND,$MIDI_BYTE_1,$MIDI_BYTE_2)
      end if
  end while
end on

Этот скрипт действительно ddосит Контакт, ремапер как-то полайтоыее работает.
 
@Sunshineman, Orchestraltools?
Я верю, что здесь есть готовое решение (на Goggle Drive есть мульти контакта)
Да, но не только они, вообще для любых библиотек с множеством патчей и микрофонных позиций.
Это там у тебя мультипатчи с разведёнными по разным аудио каналам позициями?
 
@Sunshineman, в Berlin Brass точно есть.
Я, кажется, с тех пор, как завёл этот репозиторий, ничего особо не трогал. Там по умолчанию должны быть включены Tree. А через мульти-скрипт переключаться на другие позиции.
В папке Effects на GitHub есть OT Midi mapper — JSFX для переключения позиций перед рендером.

Но, во-первых, там всё намертво прибито к OrchestralTools, во-вторых, я столкнулся с проблемой, что при переключении позиции весь purge слетает, и, пока проект рендерится в новой позиции — оперативка успевает забиться до предела, и всё падает. В общем, мне оказалось экономнее в итоге сразу по-джентельменски на разные каналы вывести Tree и Close и запуржить.

А вообще, конечно... хотелось бы какой-то более человеколюбивый софт... Но это ж писать надо... Вот в HISE можно вполне по MIDI управлять purge. Но на HISE толком инструментов ещё нет) Есть, но нишевые, не мейн-стрим)
 
@Sunshineman, в Berlin Brass точно есть.
Я, кажется, с тех пор, как завёл этот репозиторий, ничего особо не трогал. Там по умолчанию должны быть включены Tree. А через мульти-скрипт переключаться на другие позиции.
В папке Effects на GitHub есть OT Midi mapper — JSFX для переключения позиций перед рендером.

Но, во-первых, там всё намертво прибито к OrchestralTools, во-вторых, я столкнулся с проблемой, что при переключении позиции весь purge слетает, и, пока проект рендерится в новой позиции — оперативка успевает забиться до предела, и всё падает. В общем, мне оказалось экономнее в итоге сразу по-джентельменски на разные каналы вывести Tree и Close и запуржить
Я ещё не смотрел как у тебя там устроено, но понял из твоих слов, что нужно лезть в мультискрипт чтобы рулить позиции микро.
Собственно я так и делаю на данный момент, только использую твой же ремапер, включаю его в нужный момент, настраиваю и выключаю. Не особо удобно, по этому и стал искать возможность, как бы так сделать, что бы только определённые СС были клонированы на все миди каналы Контакта. Вообще я нашёл один способ, через Host Automation Контакта, но конечно времени на каждый инструмент придётся потратить прилично, я начал этим заниматься но в процессе как раз и стал задумываться о скрипте, который бы всё упростил. Способ такой

223900
 

Сейчас просматривают