jtol

delaunay tree - Olivier Pasquet - 2012nested rhythmic trees representation generated by jtol and visualized by rhino for 完璧な回

 

— For the latest version : download jtol from github.

—— For bach 0.7.8.1 and max 7.1.0: download jtol release 01012016.
—— For bach 0.7.4b and max 6.1.7: download jtol release 29062014.
—— For bach 0.7b and max 5.1.9: download jtol release 07052013.

Jtol is built and used by jt rinker and olivier pasquet. It is a library dedicated to real-time pattern generation and can be applied to architectural design, music, dance; everything requiring constructed evolution in space and time.
It deals with multi-scaling and multi-dimensions where rhythm is considered to be a skeleton onto everything else is attached (pitches, params…).

Jtol was first programmed in python in max with the help of bertrand nouvel. It gathered data structures similar to the jitter library but with a nested architecture.
A newer version is now using the bach library and still runs in max. It has nevertheless been programmed in order to always be able to easily get rid of the bach library. It is inspired by libraries like athenaCL, numpy, scipy, abjad, pyevolve, pwgl and open music. Some purely generative music devices will soon come for max for live. Releases are laborious; so feel free to use it and debug it.

Here are some possible interests for jtol:

ENP-like notation in max, nested tree system for rhythm
beat repetitions, looped based generators
braid theory, tessellation
cellular automata and multi-agent systems
chaos
sieves
permutative, serial functions
multi-order markov chains
multi-set
quantization, interpolation and extrapolation
pitch functions
genetic algorithms

 

______________________________________________________________________________________________________________________________________________________
EXAMPLES

+++ jtol.bach.ratio

jtol.bach.ratio gives rational values from a tree representation. Inspired by ENP notation, it is very pretty and convenient for rhythmic musical structures where durations are filled in rational ways.
Ratios are nested with parenthesis in order to make a multilevel tree.

Each ratio before a new parenthesis level is the total duration for what is inside this parenthesis.
For instance, simple musical tuplets would be expressed this way:
• ( 1 ( 1 1 1 ) ) => ( 1/3 1/3 1/3 ) => ( 0.333 0.333 0.333 ) (Σ 1)
• ( 1 ( 1 1 ( 1 1 1 ) ) ) => ( 1/2 1/6 1/6 1/6 ) => ( 0.5 0.1667 0.1667 0.1667 ) (Σ 1)
There is a very close relation with spatial tessellations like voronoi‘s one where the delaunay triangulation would be practical.

delaunay triangulation - Olivier Pasquet - 2012

 

jtol.bach.ratio - Olivier Pasquet - 2012

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.henon

jtol.bach.henon is one of the available generators. As an example, this one performs the henon map, a non-linear two-dimensional discrete deterministic dynamical system.

jtol.bach.henon - Olivier Pasquet - 2012

For most generators, each parameter can be a scalar, a vector or a tree. This allows a cell-by-cell and a step-by-step control for the generated forms.

 

jtol_bach_henon - Olivier Pasquet - 2012 jtol_bach_henon - Olivier Pasquet - 2012


 

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.play

jtol.bach.play converts ratios from jtol.bach2score to millisecond timings and outputs corresponding time-delayed bangs when a ‘play’ message is received.

jtol.bach.play - Olivier Pasquet - 2012

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.dur

jtol.bach.dur gets all durations of a jtol tree.

jtol.bach.dur - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.2score

jtol.bach2score gathers a time tree representation for bach.score. Time signature is calculated from incoming tree and note value.

jtol.bach2score - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.reduce

jtol.bach.reduce reduces the depth of trees. For instance, if we have the following tree:
( 2 1 ( 1 2 1 ( 1 1 ( 1 1 1 ) ) ) 1 1 1 ( 1 1 ( 2 1 ) ) )
=> ( 2 1 ( 1 2 1 ( 1 1 ) ) 1 1 1 ( 1 1 ) )
=> ( 2 1 ( 1 2 1 ) 1 1 1 )
=> ( 2 1 1 1 1 )
A reduction of deepness is very convenient for playing with the degree of complexity of a rhythm. Questions relative to tempo and scale similarity (starting point for fractals) rise from this process. Nevertheless, it is a question of tiling.
Raphael Robinson wrote an interesting paper about aperiodical hierarchical tilings in 1996.
hierarchical tiling - Olivier Pasquet

jtol.bach.reduce - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.setdur

jtol.bach.setdur sets a duration to a tree or its tree branches.

jtol.bach.setdur - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.delay

jtol.bach.delay delays a III or bang.

jtol.bach.delay - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.length

jtol.bach.length gets total size of a tree eg. the number of notes.

jtol.bach.length - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.totdur

jtol.bach.totdur gets total duration of a jtol tree.

jtol.bach.todur - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.musicmaker

jtol.bach.musicmaker builds repetitive trees patterns from simple atoms. Inspired by Sébastien Gaxie OM patch.

jtol.bach.musicmaker - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.humanize

jtol.bach.humanize randomizes durations. Random values are rationals in order to be integrated in a proper rhythmic notation for further processes.

jtol.bach.humanize - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.swing

jtol.bach.swing builds shuffle rhythms similar to notes inégales from Baroque, Classical or Jazz music. A rhythmic tree is stretched according to a “grid” giving stretch ratios. A “grid random” only randomizes stretched durations and not others. A “overall random” randomizes, humanizes, all durations. Random values are rationals in order to be integrated in a proper rhythmic notation for further processes.

jtol.bach.swing - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.simplify

jtol.bach.simplify simplifies or corrects a rhythm tree.

jtol.bach.simplify

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.slice

jtol.bach.slice splits a tree in two.

jtol.bach.slice - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.randratio

jtol.bach.randratio generates rational ratios.

jtol.bach.randratio - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.scramble

jtol.bach.scramble scramble the order of a tree.

jtol.bach.scramble - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.slicer

jtol.bach.slicer replaces notes within a range of duration range by another duration. This allows the building of “trills” and other repetitions. The initial overall duration is always kept.

jtol.bach.slicer - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.change

jtol.bach.change will output a given III only if it is different from the stored III and will reset the stored number to that differing input III.

jtol.bach.change - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.rep

jtol.bach.rep repeats a tree n times.

jtol.bach.rep - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.rev

jtol.bach.rev reverses a tree.

jtol.bach.rev - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.2athenacl

jtol.bach.2athenacl converts jtol rhythmic trees to athenaCL rhythmic representation.

jtol.bach.2athenacl - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.scale

jtol.bach.scale rescales incoming bach data the same way zmap would do it for max data.
It does not crop at limits like zmap but rather like scale.

jtol.bach.scale - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.nth

jtol.bach.nth gives the nth branch within a tree representation.

jtol.bach.nth - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.oneperm

jtol.bach.oneperm return the next permutation of a tree.

jtol.bach.oneperm - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.ssort

jtol.bach.ssort is a simple sort for trees.

jtol.bach.ssort - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.timesig

jtol.bach.timesig gets the time signature from tree representation.

jtol.bach.timesig - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.iter

jtol.bach.iter iters through branches.

jtol.bach.iter - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.lifo

jtol.bach.lifo is a stack on which the last arrived data is outputted first.

jtol.bach.lifo - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.fifo

jtol.bach.fifo is a stack on which the first arrived data is outputted first.

jtol.bach.fifo - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.decomposenoi

jtol.bach.decomposenoi and jtol.bach.redecomposenoi are gathering sub-trees for doing processes at one particular depth of tree. Same as jtol.bach.recompose but without index outlet.

jtol.bach.decomposenoi - Olivier Pasquet

______________________________________________________________________________________________________________________________________________________
+++ jtol.bach.recomposenoi

jtol.bach.decomposenoi and jtol.bach.redecomposenoi are gathering sub-trees for doing processes at one particular depth of tree. Same as jtol.bach.recompose but without index outlet.

jtol.bach.recomposenoi - Olivier Pasquet