Cakewalk Application Language (CAL)_Создание, применение, проблемы

  • Автор темы Автор темы Dan3D
  • Дата начала Дата начала
Originally posted by Serg196
спасибо за скрипт про склейку.
Это не мне! Это мне здесь дали
http://forum.cakewalk.com/tt.asp?forumid=12

[ADDED=Vovchik]1130611002[/ADDED]
Serg, отличный скрипт! Вот только... Не сочти за наглость, но нельзя ли сделать так, чтобы еще и клип при этом разрезался?
 
А у меня чёт не работает скрипт для склейки нот, наверное я что-то не так делаю, я скопировал текст скрипта в notepad сохранил с расширением CAL а Сонар пишет «cal error 004 Unknown procedure». Может быть, если не тяжело готовый скрипт выложите?
 
Dimson
1. Скопировать текст скрипта в нотепад.
2. В начале каждой строки добавить по одному пробелу.
3. Сохранить.
И будет все ЩЛ.

[ADDED=Serg196]1130617708[/ADDED]
Блин, чет у меня вложения не получвется вложить....

Vovchik
нельзя ли сделать так, чтобы еще и клип при этом разрезался?
Сам думал об этом...
Штатными средствами - нельзя. Если только исхитриться как-нибудь...
 
Vovchik
Кстати, а что ты имеешь в виду под параболическими темпами?
В смысле, нелинейное изменение от одного темпа до другого? Или действительно по параболе?
Для чего это может понадобиться?
 
Попробую объяснить. Я давно заметил, что замедление или ускорение, нарисованные линией, звучат немузыкально, неестественно. Тогда я пытался вставлять ряд изменений темпа пункт за пунктом, добиваясь натурального звучания. Так вот при этом всегда получается, что огибающая значений изменения темпа представляет собой некую кривую.

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

tempocurve.gif


А здесь - фрагмент с ускорением наподобие Чардаша Монти или цыганочки с выходом.

tempocurve2.gif


Какая это кривая, я сказать не могу, не знаю.

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

(PS. И всё-таки возможность рисования нелинейных изменений темпа я видел когда-то в Digital Performer) :biglaugh:
 
Vovchik
В общем-то, нарисовать такой скрипт не слишком сложно. Но. Единственный известный способ изменения темпа - это применение функции FitToTime (а также недокументированной FitToTime40), которые, как оказалось, 5-й сонар неправильно выполняет. Потому смогу заняться только после получения давно одидаемой посылки с энтой самой пятеркой.
 
Serg196, большое тебе спасибо за понимание и участие! В твоем лице я наконец встретил квалифицированного, не побоюсь этого слова, - каловеда. Англоязычные ресурсы на эту тему как правило устаревшие, форум неактивен, а выйти на разработчиков почему-то никак нельзя, где они спрятаны - неизвестно.
Так что запасаемся терпением и ждем.
:beer:
 
Vovchik
не побоюсь этого слова, - каловеда
Ну, спасибо! Наконец-то я узнал, кто же я на самом деле :biggrin:

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

;===============================================
скрипт см. ниже
;=================================================

Первоначально скрипт спрашивает, на сколько можно наезжать на предыдущую ноту, затем, как далеко можно наезжать на следующую (в процентах от длительности текущей ноты), а в конце требует указать номер трека, куда все это безобразие, собственно, и будет переноситься.
Если ноты наезжают друг на друга, то для правильного определения нужных нот следует поиграться с первыми двумя параметрами.
Недостаток скрипта - перенесенные ноты каждая оказывается в своем собственном клипе, поэтому после выполнения скрипта неплохо бы сделать Bounse to clip.
Еще один недостаток - скрипт делает очень много операций, в результате чего очередь Undo может переполниться, что приведет к невозможности полной отмены всего того, что этот скрипт натворит. Потому перед его применением лучше сохранить проект (в крайнем случае сделать копию трека).

Цитата от Vovchik:

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

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

explode1.gif


Путем подбора процентов перекрытия нот удалось отделить длинные ноты от коротких, но при этом кое-где верхний и нижний голоса поменялись местами:

explode2.gif


Иными словами, скрипт в этом случае иногда ошибается в выборе нот для переноса, выделяя вместо верхнего голоса нижний.
 
Да, действительно.
А так:

;=================================================
(do
(int bac_step 20)
(int fw_step 30)

(dword from_ish From)
(dword thru_ish Thru)
(dword from_tec From)
(dword thru_tec Thru)
(dword nota_len)
(int note_key)
(int ntrk 1)

(getInt bac_step "Percent back " 0 99)
; (= fw_step bac_step)
(getInt fw_step "Percent forward " 0 99)

(getInt ntrk "Track number " 1 256)
(-- ntrk)
(++ bac_step)
(++ fw_step)

(while (|| (<= from_tec thru_ish) (!= nota_len -1))
(do
(ResetFilter 0 1)
(SetFilterRange 0 0 TRUE 0 127)
(= From from_tec)
(= Thru thru_tec)

(= nota_len -1)
(forEachEvent
(if (== Event.Kind NOTE)
(if (== nota_len -1)
(do

(= from_tec Event.Time)
(= nota_len Note.Dur)
(= note_key Note.Key)
)
(do
(if (&& (== Event.Time from_tec) (> Note.Key note_key))
(if (> Note.Dur nota_len)
(= nota_len Note.Dur)
)
)
(if (< Event.Time (+ from_tec nota_len))
(do
(if (&& (> Note.Key note_key) (<= (+ Event.Time Note.Dur) (+ from_tec (+ nota_len (/ (* nota_len fw_step) 100 )))))
(do
(= note_key Note.Key)
(= nota_len Note.Dur)
(= from_tec Event.Time)
)
)
)
)
)
)
)
) ;tyl forEach

(ResetFilter 0 1)
(= From from_tec)
(= Thru (+ from_tec nota_len))
(SetFilterRange 0 0 TRUE note_key note_key)
(EditCut40 TRUE FALSE FALSE FALSE FALSE)
(EditPasteToTrack from_tec 1 FALSE TRUE FALSE FALSE FALSE ntrk)
(+= from_tec (- nota_len (/ (* nota_len bac_step) 100 )))


)
)
)
;===================================================

PS. если я - каловед, то ты тогда кто, калотестер, что ли? :biggrin:
 
Ну вот, совсем другое дело! Как мне не хватало этой функции при работе над оркестровками, особенно в струнной и медной группах.
В нотаторах, в кубовском в том числе, это называется explode. Я скрипт так и назвал - Explode.cal и посадил на ALT+X.

если я - каловед, то ты тогда кто
Мммм... эээ... кроме как калоед, и не назовешь :eek:
 
Сегодня мне понадобилось склеить соприкасающиеся ноты в нескольких сотнях аккордов. Попробовал применить на практике вышеописанный скрипт для склейки нот и обнаружил, что скрипт имеет по меньшей мере три недостатка при применении его в массовом порядке:
1. Выделять необходимо только ноты одной тональности;
2. Склеиваются только две из выделенных нот, даже если все они соприкасаются друг с другом;
3. После обработки выделение не сохраняется.
Потому попробовал написать собственный вариант скрипта для склейки нот, лишенный указанных недостатков.
Скрипт существует в двух вариантах. Первый из них склеивает в выделенном фрагменте все ноты одной тональности в одну большую ноту (расстояние между ними может превышать более 1000 тактов); этот вариант предназначен для быстрой склейки нескольких нот, его я повесил на комбинацию, рекомендованную Vovchik'ом (Ctrl + G). Второй вариант предназначен для массового объединения нот в большом фрагменте (ради чего, собственно, все и было задумано), его я повесил на комбинацию Shift + Ctrl + G. Второй вариант скрипта предварительно запрашивает, какой прормежуток может быть между склеиваемыми нотами (только пустой промежуток, то есть от конца первой ноты до начала второй). Значение этого промежутка может быть в трех вариантах:
1. Значения от 1 до 32767 означают расстояние между нотами в 1/32 целой ноты.
2. Если первым знаком поставить "-" (дефис, он же минус), то значение будет интерпретироваться как модуль расстояния в тиках, уменьшенный на единицу. То есть, -1 будет означать 0 тиков (нет промежутка), -2 будет означать промежуток в 1 тик и т.д. Максимальное значение -32768.
3. Если указать в качестве промежутка 0, то склеиваться будут только те ноты, которые налагаются друг на друга.
По умолчанию указано значение -1, то есть при отсутсвии промежутка между нотами они будут склеены.

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

Скрипты в архиве ZIP залил сюда: webfile.ru/670320 (будет доступен до 11.12.2005)

Туда же положил 4 маленьких скриптика (написанные по ходу дела), предназначенные для транспонирования выделенного фрагмента на полутон и октаву соответсвенно вверх и вниз (назначенные на key binding эти скрипты также значительно упростили мне жизнь) а также немного модифицированный скрипт для разрезки нот. Теперь для разрезания не обязательно выделять ноты; если нет выделенных нот, то будут разрезаны все ноты, "попавшие под нож", то есть, находящиеся под курсором (но только в текущем треке).

Просьба всех заинтересованных лиц протестировать вышеописанные калы, все замечания и предложения просьба помещать в этот топик.
 
Serg196
Как всегда на высоте. Great job! :beer:
Оба скрипта для склейкт нот работают безупречно. Второй хорош в тех случаях, когда имеется несколько фрагментов, отстоящих друг от друга. Внутри фрагментов ноты склеиваются, а между фрагментами - нет. Честно говоря, я не пробовал не умолчательные настройки второго скрипта, - они несколько запутанны. :frown:

Разрезательный кал - тоже ОК.

Транспонирующие скрипты действительно весьма полезны, я пользуюсь ими давно. Правда, выглядят они несколько иначе:

Транспорт на полтона вверх

(EditTranspose40 1 FALSE )

Транспорт на октаву вверх

(EditTranspose40 12 FALSE )

Транспорт на полтона вниз

(EditTranspose40 -1 FALSE )

Транспорт на октаву вниз

(EditTranspose40 -12 FALSE )

FALSE означает, что транспонирование хроматическое. Если нужно диатоническое - надо FALSE заменить на TRUE.
 
Vovchik
не пробовал не умолчательные настройки второго скрипта, - они несколько запутанны.
А ничего запутанного - если нужно склеить ноты, между которыми есть промежутки, вбиваешь максимально возможный размер этого промежутка (в 1/32 целой ноты), и все. Те ноты, между которыми помежуток меньше указанного, сольются в одну, а иначе останутся не склеенными.
Скрипты для траспонирования, приведенные тобой - действительно лучшее решение, поскольку выполняются быстрее (должны, по крайней мере). Спасибо. :beer:

P.S. Кстати, у меня создается стойкое ощущение, что кроме нас с тобой (да, может быть, эпизодически еще Tarzan'а) больше никто калами не пользуется?
 
Ну почему же, надеюсь, что нет. CAL - это мощный инструмент, расширяющий возможности секвенсера, и игнорировать его просто неразумно. Другое дело, что для свободного владения этим языком нужно всё-таки иметь навыки программирования. Или (как это делаю я обычно) брать готовый скрипт в качестве образца и незначительно его видоизменять, подгоняя под свои нужды. Но это касается простейших вещей. Например, вышеприведенные транспонирующие скрипты получены с помощью программки CAL Editor (я где-то давал ссылку). Там просто выбираешь из меню, какую фунцию вставить, и подставляешь нужные цифры.
 
Вариант этого же скрипта, который выделяет ноты, а не переносит их на другой трек.
замечание: скрипт орудует с велосити нот, потому для корректной работы скрипта нужно, чтобы в выделенном фрагменте не было нот с велосити равным единице (что на практике, по-видимому, бывает не часто).
Кроме того, скрипт учитывает выделение нот по высоте: будут выделены высшие ноты из выделенных.
 
Большое спасибо! Скрипт выделяет верхний голос, всё нормально, но... Зачем-то вставляет 1-й контроллер (модуляция) на каждую ноту верхнего голоса, со значением, равным велосити этих нот. :Dontknow: Это так задумано?
 
Ну вот, другое дело!
Я назвал его SelectUpperLine. Работа над стринг- и брасс партиями существенно упрощается.

После НГ подкину еще одну идею, идет? :beer:
 
Черт возьми, Vovchik, вспомнил про засаду, из-за которой я и хотел модифицировать скрипт: он не очень корректно обращается с контроллерами.
Выложил исправленную версию (см пост 46)

[ADDED=Serg196]1135446499[/ADDED]
После НГ подкину еще одну идею, идет?
Можно прямо щас. Для предварительного переваривания. :smile:

[ADDED=Serg196]1135447114[/ADDED]
Анекдот. выделять мелодию пока еще не приходилось. А вот сейчас понадобилось выделить бас (типа). Пришлось скрипт модифицировать (благо всего-то в двух местах заменить "<" на ">").
В дополнение к первому:

[ADDED=Serg196]1135447280[/ADDED]
Кстати, если раздражают запросы скрипта про какие-то проценты, то можно их убрать, поставив точку с запятой перед строками вида
(GetInt ... ), которые в количестве двух штук имеются где-то в первых строках скрипта. Тогда значения будут по умолчанию 20 и 30 % соответсвенно (их, впрочем, тоже можно изменить).
 
Ну конечно выделять бас удобнее. Логичнее растаскивать голоса сверху вниз.

А идея касается работы с партиями ф-но и электропиано, или даже гитары, т.е. с теми, где применяется 64-й контроллер (педаль). Если партия прописана с педалью, то возможны всякие нежелательные явления при воспроизведенииостановке типа зависания нот. Кроме того, при копировании фрагментов такой партии легко получить фразы, где нет "снятия педали". Поэтому хорошо было бы имитировать педаль путем изменения длительностей нот. Другими словами, удлинять ноты, которые находятся между нажатием и снятием педали (127 и 0 значения 64-го контроллера). При этом еще надо, чтобы одноименные ноты не перекрывались. А сам контроллер уничтожить.

Наверно, плохо объяснил. Кто знаком с Кубейсом, знают, что там подобная функция вшита в меню Functions > Pedals to note lenght.
 

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