циклы звука
в Tidal циклы используют не BPM(beats per minute(удары в минуту)), а определённую единицу измерения - CPS(cycles per second(циклы в секунду)). в Tidal время циклично, а не линейно. типа: по окончанию одного цикла, следует новый. время же отсчитывается всё меньшими и меньшими CPS(напр. 1/3 от цикла).
не очень удобно по началу, но при понимании, что вы делаете - это очень легко и юзабельно. во всех современных секвенсорах, время линейно. условно: есть начало и конец. в Tidal звук идёт от начала к концу, потому что вы будете знать, что произойдёт через X циклов или уже знаете, что было X циклов назад.
разделение цикла
вот условный шаблон для понятия:
тут мы делим цикл на 4 равные части, по одной на каждую из вызванных звуков. но:
теперь цикл делится на 3 равные части! выполните код и вы заметите, как он замедлится.
вы можете накладывать друг на друга паттерны, которые делят цикл на отдельные части. это, буквально, = тому, что Tidal подходит для исследования полиритмии и ритмических сложностей:
визуализация циклов
такж Tidal может визуализировать вывод заданного кода. tidal-vis вщ преобразует текстовые шаблоны в их визуальный аналог.
в логах(the ghci window) вы увидите:
такж можно использовать функцию drawLine для визуализации вывода паттерна в логах консоли.
конверт между BPM и CPS
оч важная тема, потому что конвертить из других проектов придётся часто(синхр с другим проектом/устройством). функция setcps юзается для для изменения количества CPS. по умолчанию - 0,5625.
setcps 0.5625: Cycles per second, десятичный формат.setcps (135/60/4): Cycles per second, дробный формат.
представление количества циклов в секунду дробями имеет преимущество в том, что оно более понятно для восприятия и лучше соответствует тому, как темп обычно выражается в ударах в минуту (BPM). Диапазон темпа в техно составляет 120–140 BPM. Диапазон темпа в хаусе — 115–130 BPM. если бы мы хотели задать быстрый темп для проекта на Tidal, мы бы сделали следующее:
в примере первая часть дроби 130/60 означает, что BPM составит 130 в минуту. 130 — это количество ударов, а 60 — продолжительность минуты (60 секунд). вторая часть дроби /4 означает, что на каждый цикл в Tidal приходится 4 удара. вы можете изменить это значение, чтобы изменить частоту ваших циклов.
всплывающее(поп-ап) окно
вы можете использовать библиотеки графического интерфейса SuperCollider для создания небольшого окна. оно будет показывать, условное, время в Tidal.
// start superdirt first
(
var clockMods, clockBeats, screenW, screenH, clockW, clockH, clockX, clockY, resizable, border;
clockMods = [4,6];
clockBeats = 4;
screenW = 1440;
screenH = 900;
clockW = 120;
clockH = 22;
clockX = screenW - clockW;
clockY = screenH - 1;
resizable = false;
border = false;
~clockText = StaticText()
.string_("[clock]")
.font_(Font.defaultMonoFace)
.align_(\center)
.stringColor_(Color(1,1,1))
.minHeight_(20);
~updateClock = { |cycle|
var text, beat;
text = clockMods.collect { |m| "" ++ (cycle.floor.asInteger.mod(m) + 1) ++ "/" ++ m; }.join(" ");
beat = (cycle.mod(1)*clockBeats).round.asInteger + 1;
text = text ++ " " ++ clockBeats.collect { |i| if(i < beat, ".", " "); }.join;
~clockText.string_(text);
};
~clockWindow = Window("clock", Rect(clockX, clockY, clockW, clockH), resizable, border)
.background_(Color(0.3,0.3,0.3))
.layout_(
HLayout(
~clockText
).margins_(0!4)
);
~clockWindow.alwaysOnTop_(true);
~clockWindow.visible_(true);
SynthDef(\tick, { |cycle|
SendReply.kr(Impulse.kr(0), "/tick", [cycle]);
FreeSelf.kr(Impulse.kr(0));
}).add;
OSCdef(\tick, { |msg|
var cycle;
#cycle = msg[3..];
Routine {
{ ~updateClock.(cycle); }.defer;
}.play(SystemClock);
}, "/tick");
)
после запуска скрипта в SuperDirt, запустите этот паттерн: