Сравнение Strudel и Tidal
Эта страница посвящена существующим пользователям tidal, предоставляя обзор всех различий между Strudel и Tidal.
Язык
Strudel написан на JavaScript, в то время как Tidal написан на Haskell.
Пример
Это различие наиболее очевидно при взгляде на синтаксис:
iter 4 $ every 3 (||+ n "10 20") $ (n "0 1 3") # s "triangle" # crush 4
Можно было бы выразить этот pattern в Strudel так:
iter(4, every(3, add.squeeze("10 20"), n("0 1 3").s("triangle").crush(4)))
- Оператор
$не существует, поэтому функцияiterдолжна обернуть все в скобки. - Пользовательские операторы типа
||+являются явными вызовами функций, в данном случаеadd.squeeze - Оператор
#заменен цепочкой вызовов функций# crush 4=>.crush(4)
В отличие от Haskell, JavaScript не имеет возможности определять пользовательские инфиксные операторы или изменять значение существующих.
Прежде чем вы отвергнете Strudel как громоздкое чудовище из скобок, посмотрите на этот альтернативный способ написать вышеприведенное:
n("0 1 3").every(3, add.squeeze("10 20")).iter(4).s("triangle").crush(4)
Переупорядочив вызовы, скобки гораздо менее вложены.
В качестве общего правила можно сказать, что все, что Tidal делает с $, меняется местами в Strudel:
iter 4 $ every 3 (||+ n "10 20") $ (n "0 1 3")
становится
n("0 1 3").every(3, add.squeeze("10 20")).iter(4)
Проще говоря, foo x $ bar x становится bar(x).foo(x).
Операторы
Пользовательские операторы tidal являются обычными функциями в strudel:
| функция | tidal | strudel |
|---|---|---|
| add | |+ n | .add(n) |
| subtract | |- n | .sub(n) |
| multiply | |* n | .mul(n) |
| divide | |/ n | .div(n) |
| modulo | |% n | .mod(n) |
| left values | |< n | .set(n) |
Приведенный выше список отображает только операторы, где структура берется из left.
Для каждого из них также существует вариант right и both.
Поскольку это направленное мышление работает только с кодом, strudel называет их in / out / mix:
| направление | tidal | strudel |
|---|---|---|
| left | |+ n | .add.in(n) |
| right | +| n | .add.out(n) |
| both | |+| n | .add.mix(n) |
Вместо + / add, вы можете использовать любой из доступных операторов из первого списка.
Совместимость функций
Этот issue отслеживает, какие функции Tidal реализованы в Strudel. Список может быть не на 100% актуальным и, вероятно, также упускает некоторые функции полностью.. Не стесняйтесь искать функцию, которую вы ищете, в исходном коде. Если вы найдете функцию, которой нет в списке, пожалуйста, сообщите!
Параметры управления
Как видно из примера, оператор # (сокращение для |>) также является просто вызовом функции в strudel.
Итак, note "c5" # s "gtr" становится note("c5").s('gtr').
Этот файл перечисляет все доступные параметры управления. Обратите внимание, что не все из них работают в Webaudio Output в Strudel. Если вы найдете параметр управления tidal, которого нет в списке, пожалуйста, сообщите!
Звук
Tidal обычно используется вместе с Superdirt / Supercollider для генерации звука. Хотя Strudel также имеет способ взаимодействия с Superdirt, он стремится предоставить автономную среду live coding, которая полностью работает в браузере.
Аудиоэффекты
Многие эффекты SuperDirt были переработаны в Strudel с использованием Web Audio API. Вы можете найти список доступных эффектов здесь.
Сэмплер
Сэмплер Strudel поддерживает подмножество сэмплера Superdirt. Кроме того, samples всегда загружаются из URL, а не с диска, хотя это может быть возможно в будущем.
Выполнение
REPL Strudel еще не поддерживает блочное выполнение.
Вы можете использовать именованные операторы и _ для отключения:
$: n("[0 .. 8]*8/9").scale("C:minor:pentatonic")
_$: s("bd*4").bank('RolandTR909')Темп
Темп Strudel - 1 cycle в секунду, в то время как tidal по умолчанию использует 0.5625.
Вы можете получить тот же темп, что и в tidal, с помощью:
note("c a f e").fast(.5625);
Далее: REPL