July 27, 2025

циклы звука

в 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.

эти 2 значения эквивалентны:

  • 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.

pulu скриптит:

// 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, запустите этот паттерн: