Перемещение клипов

  • Автор темы Автор темы Vovchik
  • Дата начала Дата начала
Vovchik
у меня есть еще пара-тройка идей насчет калов
Интересно-интересно, что ты еще задумал :smile:
Если серьезно, у меня, наконец-то, появилось хоть немного свободного времени. Так чта-а...
Насчет лесенки в кале (ну е-мае, неужели не могли как-нить по другому сократить!!!), так вот, если лень, совершенно необязательно выстраивать лесенкой. Достаточно вставить по одному пробелу в начале строки - дело в том, что переносы строк интрепретатором кала не учитываются совершенно.

[ADDED=Serg196]1130604872[/ADDED]
да, про странности - забыл сразу предупредить, что перед применением скрипта должна быть обязательно использована функция Apply trimming - это особенности CAL, тогда никаких странностей не будет. (Apply trimming применять необходимо только к выделяемым клипам).
 
Ну хорошо, продолжим :smile:
Сонар открывает миди файл формата 0 в виде одного клипа, в котором свалены в кучу все каналы. Для разделения каналов по трекам существует CAL, но работает он как-то криво. Например, барабаны попадают на трек с форсированным 16-м каналом. В общем, что-то не так. А скрипт такой был бы полезен многим сонаристам.

===================

;
; SPLITCHN.CAL
;
; This takes the current track and splits it by channel into 16 other tracks.
; It is up to the user to:
; - position the cursor on the desired track to be split
; - make sure only that track is selected
; - set From and Thru to cover whatever portion of it they wish split
;

(do
(include "need20.cal") ; Require version 2.0 or higher of CAL

(int nTrk 1)

(getInt nTrk "First destination track?" 1 256)
(-- nTrk) ; CAL uses 0..255

(int nChannel 0) (while (< nChannel 16)
(do
; Provide some progress information on the message line
(message "Channel " (+ 1 nChannel) " --> Track " (+ 1 nTrk))

; Set the event filter 0 to include everything
(ResetFilter 0 1)
; Restrict item 10, Channel, to be in the range nChannel..nChannel
(SetFilterRange 0 10 TRUE nChannel nChannel)
; Now use that to cut the events meeting the criteria
(EditCut From Thru TRUE TRUE FALSE FALSE FALSE FALSE)
; Paste them to the destination track, nTrk
(EditPasteToTrack From TRUE FALSE TRUE FALSE FALSE FALSE nTrk)

; Give track an informative name
(TrackName (format "Split Chan " (+ 1 nChannel)) nTrk)
; Set the forced channel, although that's redundant because all the events
; in the track have that channel
(TrackChannel nChannel nTrk)
; Un-mute the track
(TrackActive TRUE nTrk)

(++ nChannel)
(++ nTrk)
)
)
)
 
Vovchik
Насколько я понял, этот трабл происходит в том случае, если разделение треков делать на новые (несуществующие треки). То есть, существуют два выхода из этой ситуации, либо предварительно создать 16 мидитреков, на которые потом разбить существующий трек, либо откорректировать скрипт до следующего состояния:
;==================================================
(do
(int trk01 0)
(int trk02 0)
(int trk03 0)
(int trk04 0)
(int trk05 0)
(int trk06 0)
(int trk07 0)
(int trk08 0)
(int trk09 0)
(int trk10 0)
(int trk11 0)
(int trk12 0)
(int trk13 0)
(int trk14 0)
(int trk15 0)
(int trk16 0)
(int ch_m)
(int nTrk -1)
(int nChannel 0)

(forEachEvent
(switch Event.Chan
0 (= trk01 1)
1 (= trk02 1)
2 (= trk03 1)
3 (= trk04 1)
4 (= trk05 1)
5 (= trk06 1)
6 (= trk07 1)
7 (= trk08 1)
8 (= trk09 1)
9 (= trk10 1)
10 (= trk11 1)
11 (= trk12 1)
12 (= trk13 1)
13 (= trk14 1)
14 (= trk15 1)
15 (= trk16 1)
)
)

(while (< (++ nTrk) 16)
(switch nTrk
0 (if (== trk01 1) (++ ch_m))
1 (if (== trk02 1) (++ ch_m))
2 (if (== trk03 1) (++ ch_m))
3 (if (== trk04 1) (++ ch_m))
4 (if (== trk05 1) (++ ch_m))
5 (if (== trk06 1) (++ ch_m))
6 (if (== trk07 1) (++ ch_m))
7 (if (== trk08 1) (++ ch_m))
8 (if (== trk09 1) (++ ch_m))
9 (if (== trk10 1) (++ ch_m))
10 (if (== trk11 1) (++ ch_m))
11 (if (== trk12 1) (++ ch_m))
12 (if (== trk13 1) (++ ch_m))
13 (if (== trk14 1) (++ ch_m))
14 (if (== trk15 1) (++ ch_m))
15 (if (== trk16 1) (++ ch_m))
)
)
(= nTrk 1)
(getInt nTrk "First destination track?" 1 256)
(-- nTrk)

(while (< nChannel 16)
(do
(= ch_m 0)
(switch nChannel
0 (if (== trk01 1) (= ch_m 1))
1 (if (== trk02 1) (= ch_m 1))
2 (if (== trk03 1) (= ch_m 1))
3 (if (== trk04 1) (= ch_m 1))
4 (if (== trk05 1) (= ch_m 1))
5 (if (== trk06 1) (= ch_m 1))
6 (if (== trk07 1) (= ch_m 1))
7 (if (== trk08 1) (= ch_m 1))
8 (if (== trk09 1) (= ch_m 1))
9 (if (== trk10 1) (= ch_m 1))
10 (if (== trk11 1) (= ch_m 1))
11 (if (== trk12 1) (= ch_m 1))
12 (if (== trk13 1) (= ch_m 1))
13 (if (== trk14 1) (= ch_m 1))
14 (if (== trk15 1) (= ch_m 1))
15 (if (== trk16 1) (= ch_m 1))
)

(if (== ch_m 1)
(do
(message "Channel " (+ 1 nChannel) " --> Track " (+ 1 nTrk))
(ResetFilter 0 1)
(SetFilterRange 0 10 TRUE nChannel nChannel)
(EditCut From Thru TRUE TRUE FALSE FALSE FALSE FALSE)
(EditPasteToTrack From TRUE FALSE TRUE FALSE FALSE FALSE nTrk)
(TrackName (format "Split Chan " (+ 1 nChannel)) nTrk)
(TrackChannel nChannel nTrk)
(TrackActive TRUE nTrk)
)
)
(++ nChannel)
(++ nTrk)
)
)
)

;==================================================

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

;===============
(pause VERSION)
;===============

и сообщи, что он там в ответ набормочет (а именно - версию интерпретатора CAL).
 
Скрипт разделитель каналов прекрасно работает! Гениально. (Пришлось вставить пробелы в начала строк, но не везде)
:super2:

(5-й Сонар, в 4 не пробовал)


Запустил "version" - он пробормотал "100".
 
Vovchik
Хм. И в третий, и в четвертый сонары уверяют меня, что у них такая же версия - 10.0. Весьма странно...
Еще одна просьба: ты где-то упоминал (не могу найти, где), что у тебя были какие-то скрипты для изменения темпа, которые отказались работать в 5-м сонаре. Так вот, если скрипт не очень большой, ты не мог бы его здесь выложить? Дело в том, что мне попалось описание недокументированных функций, которые якобы работают только в третьем сонаре. В том числе в них присутсвуют и функции получения данных темпа и управления им. Если это не те же самые функции, то можно попробовать вычислить размер выделенного фрагмента даже в том случае, если тем на его протяжении изменяется.
 
Здесь четыре скрипта, взаимосвязанных. Они должны лежать вместе

http://webfile.ru/603617

Судя по описанию, можно задать изменение темпа в процентах. Это может быть очень нужно, если темп в сонге постоянно меняется. Клиент просит изменить общий темп на 5 единиц, и как это сделать? Штатным способом Сонара это можно сделать только методом проб и ошибок, а это не есть хорошо, когда клиент дышит в затылок. "Что, не получается?" (убив бы)

Беда в том, что вышеприведенные скрипты в 5-ке не работают как обещано.
 
Конечно, помогает, но это два разных подхода. Fit to time укладывает материал в новую временную протяженность, какой темп при этом получится - неизвестно. Выложенные выше скрипты действуют наоборот - задаешь новый темп в процентах, получаешь новую Tempo Map. Напомню, что речь идет о проекте, где темп всё время меняется. Не зря чувак сочинил эти скрипты, вот только они в 5-ке не пашут. Связаться с ним пока не удалось - мыло молчит, может, устарело. Буду пробовать еще.

А твои инверсии аккордов - шедевр! Вещь незаменимая при транспонировании пэдовых или гитарных партий на кварту или квинту.
 
По поводу изменения темпа: Пока 5-го сонара у меня нет, могу только предполагать, что причиной неработоспособности скрипта является неадекватная реакция 5-го сонара на недокументированную функцию FitToTime40, которая используется в скрипте.
Могу предложить следующий временный выход из ситуации: поскольку функция FitToTime40 выполняться не желает, то можно использовать себя в качестве внешней функции (этакий симбиоз человека и пограммы :smile:). Для этого в Scltmpo%.cal нужно внести следующие изменения (для краткости все комментарии я похерил):

;=====================================================

(do
(dword tb TIMEBASE)
(dword tbd 0)
(dword a 0)
(dword b 0)
(dword c 0)
(dword d 0)
(dword e 0)
(dword n 1)
(word wPercent 100)
(word wStretch 0)
(dword dMul 0)
(word wNumerator 0)
(word wDenominator 1)
(dword dNewThru 0)
(if (== wStretch 0)
(getInt wPercent "Scale tempo to what percentage of current tempo?" 10 1000)
)
(= dMul (- Thru From))
(= wDenominator wPercent)
(= wNumerator 100)
(include "XFRACTIO.CAL")
(include "YFRACTIO.CAL")
(= dNewThru (+ dL32Quot From))

(= a (tick From))
(= Now From)
(switch a
(tick (+ Now (/ tb 8)))
(do
(= tbd (/ tb 8))
(= d 32)
)
(tick (+ Now (/ tb 4)))
(do
(= tbd (/ tb 4))
(= d 16)
)
(tick (+ Now (/ tb 2)))
(do
(= tbd (/ tb 2))
(= d 8)
)
(tick (+ Now tb))
(do
(= tbd tb)
(= d 4)
)
(tick (+ Now (* tb 2)))
(do
(= tbd (* tb 2))
(= d 2)
)
(tick (+ Now (* tb 4)))
(do
(= tbd (* tb 4))
(= d 1)
)
)
(= Now From)
(+= Now tbd)
(while (!= (beat From) (beat Now))
(do
(+= Now tbd)
(+= n 1)
)
)
(= e (+ 1 dL32Quot))
(= c (- e (* tbd (/ e tbd))))
(= b (- (/ e tbd) (* n (/ (/ e tbd) n))))
(= a (/ (/ e tbd) n))
(++ a)
(++ B)
)
NIL
(do
(pause "New thru= " a ":" b ":" c)
(= Now From)
)

;=====================================================

Порядок работы с новой версией следующий:
1. Выделить нужный фрагмент;
2. Запустить скрипт;
3. Указать ему необходимый поцент изменения темпа;
4. скрипт выдаст новое значение правой границы, которое необходимо запомнить;
5. Выполнить команду Fit To Time, в которой в поле New Thru указать ранее запомненное значение (предварительно выбрав формат ввода M:B:T).
 
Спасибо! Всё работает, но есть маленькое "но"...

(вот зануда!)

Допустим, сонг начинается в темпе 100, потом есть несколько замедлений/ускорений. Запускаю скрипт, указываю 110 процентов, делаю fit to time - и получаю начальный темп что-то около 108 с десятыми. То есть попасть в нужный темп не удается. Боюсь, что это обстоятельство снижает полезность данного скрипта.

По идее, лучше было бы оперировать не процентным изменением темпа, а абсолютным, то есть прибавлять/вычитать определенное число от всех пунктов tempo map.

Боюсь, что мечта эта несбыточна, поскольку, если правильно понял, возможности CAL очень ограничены во всём, что касается работы с темпом.
 
Vovchik
Ты все правильно понимаешь. Увы! :frown:
Возможно, точность повысится, если применять вычисление нового темпа не для всего выделенного фрагмента, а последовательно разбив его на небольшие фрагменты. Но, думаю, вручную это будет намного проблемнее, чем посто подбор значений. Так что - "ждите ответа..."
 
Кстати, нашел информацию о том, что в третьем какеволке встроенный фекальный интерпретатор имел команды для установки и получения темпа, управления маркерами, вставку и удаление треков и другую байду. Впрочем, что это я? - это сейчас интерпретатор, скорее, фекальный, чем тогда. Спрашивается, в какую сторону развивается программа?
А по поводу скрипта для вычисления темпа:
1. появилась у меня небольшая идейка;
2. Что мне непонятно - неужели у тебя раньше этот скрипт работал нормально? Я, собственно, в нем заменил только функцию применения команды Fit To Time на небольшую процедурку, которая переводит количество тиков, передаваемое этой функции как параметр New Thru, в такты/биты/тики?
 
Спрашивается, в какую сторону развивается программа
Гонка вооружений в аудио департменте диктует. Cal был сильнейшей и уникальной фичей кейка, сейчас он, похоже, в опале, а жаль.
неужели у тебя раньше этот скрипт работал нормально?
В том-то и дело, что нет, по крайней мере, в Сонарах.
 
Vovchik
То есть, он и сейчас работает, но работает неправильно? То есть, точно так же выставляет 108 с копейками вместо 110, если темп неровный?
Или же интерпретатор выдает ошибку?
Если верно 1-е, то это можно поправить прямо сейчас.
А если 2-е, то - по получении мною 5-го сонара.
 
Нет, НЕ работает, ни в 4, ни в 5. Спрашивает "stretch audio?" Оставляю "0", пишу процент, ОК,- "invalid value".
(на всякий случай уточню, что речь идет о "Scltmp%")
 

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