• Stars
    star
    111
  • Rank 314,510 (Top 7 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Toolbox full of Algorithmic Composition methods

Total Serialism

A Toolbox full of Algorithmic Composition methods

🙏 Support Total Serialism by becoming a Patron

Visit the Total Serialism Documentation for interactive examples.

total-serialism is a set of methods used for procedurally generating and transforming number sequences (mainly in the form of arrays). This library does not output anything else then numbers, but can therefore be nicely integrated with frameworks like P5js, ToneJS, Node4Max, and any other javascript based project you want to generate arrays for. This library focusses mainly on algorithmic composition of music, but is absolutely not limited to only that and will be useful for any project that involves generation and manipulation of arrays and numbers. The library is a result of my research in algorithmic composition, livecoding and electronic music and was first prototyped with Max/MSP in the Mercury livecoding environment. It is now also used in the web based Mercury Playground

This library is a work in progress. I'm always interested in receiving inspiration, suggestions, enhancements, literature and more. Feel free to file an issue here or make a pull request and I will gladly look into it!

📋 Table of Content

👾 Newest features

Binary & Spacing

Generative rhythmical patterns of 1's and 0's by converting a number to binary or using the integer value as spacing between onsets

const Gen = require('total-serialism').Generative;

Gen.binary(358);
//=> [1, 0, 1, 1, 0, 0, 1, 1, 0]

Gen.space(2, 3, 2)
//=> [1, 0, 1, 0, 0, 1, 0]

n-Order Markov Chain

This is an identical approach to the MarkovChain while also offering the possibility of training to create n-order chains. In theory, longer chains preserve the original structure of the model, but won't generate as diverse outputs. Thanks to James Bradbury

const Rand = require('total-serialism').Stochastic;

let pattern = [1, 2, 3, 1, 2, 4, 1, 2, 5, 2, 3, 4];
// make a MarkovChain instance and optionally train with array
// an optional second argument sets the order of the markov (default=2)
let markov = new Rand.DeepMarkov(pattern, 2);

// view the transition table (stored as Map())
// Keys are stored as stringis derived via JSON.stringify()
console.log(markov.table);
// Map(7) {
//   '[1,2]' => [ 3, 4, 5 ],
//   '[2,3]' => [ 1, 4 ],
//   '[3,1]' => [ 2 ],
//   '[2,4]' => [ 1 ],
//   '[4,1]' => [ 2 ],
//   '[2,5]' => [ 2 ],
//   '[5,2]' => [ 3 ]
// }

// set the state of the model used as initial value
markov.state([1, 2]);

// generate an array of 10 values 
markov.chain(10);
// => [ 2, 3, 1, 2, 5, 2, 3, 4, 1, 2 ]

Chord progressions

Generate chord progressions as 2d-array's of semitones from an array of Roman Numerals and an optional root note.

const TL = require('total-serialism').Translate;

// Convert a chord progression from roman numerals to semitones
TL.chordsFromNumerals(['I', 'IIm', 'IVsus2', 'V7', 'VIm9'], 'c');
// => [[ 0, 4, 7 ],
//     [ 2, 5, 9 ],
//     [ 5, 7, 0 ],
//     [ 7, 11, 2, 5 ],
//     [ 9, 0, 4, 7, 11 ]] 

Support for n-dimensional arrays

Most of the transform, translate and utility functions now support calculations with n-dimensional arrays.

const TL = require('total-serialism').Translate;
const Mod = require('total-serialism').Transform;

TL.noteToMidi(['c4', ['eb4', 'g4', 'a4'], ['a3', 'f4']]);
//=> [ 60, [ 63, 67, 69 ], [ 57, 65 ] ] 

Mod.clone(['c', ['e', 'g']], ['4', '5', '#3']);
//=> [ 'c4', [ 'e4', 'g4' ], 'c5', [ 'e5', 'g5' ], 'c#3', [ 'e#3', 'g#3' ] ]

TL.relativeToMidi([[-12, -9, -5], [0, 4, 7], [2, 5, 9]], 'c4');
//=> [ [ 36, 39, 43 ], [ 48, 52, 55 ], [ 50, 53, 57 ] ] 

Stat.compare(['c', ['e', 'g']], ['c', ['e', 'g']]);
//=> true 

Mod.flatten([1, [2, 3, [ 4 ], 5], 6]);
//=> [ 1, 2, 3, 4, 5, 6 ] 

Mod.lookup([0, [1, 1, [2, 3], 0], 2], ['c4', 'e4', 'f4', 'g4']);
//=> [ 'c4', [ 'e4', 'e4', [ 'f4', 'g4' ], 'c4' ], 'f4' ] 

cellular automaton

Generate an Elementary Cellular Automaton class. This is an one dimensional array (collection of cells) with states that are either dead or alive (0/1). By following a set of rules the next generation is calculated for every cell based on its neighbouring cells.

const Algo = require('total-serialism').Algorithmic;
const Rand = require('total-serialism').Stochastic;

let ca = new Algo.Automaton();
// feed with 40 randomly generated values 0-1
ca.feed(Rand.coin(40));
// set the rule with a decimal representation
ca.rule(120);
// generate the next generation and store in array
let gen = ca.next();

// create multiple generations in a forloop
let gens = [];
for (let i=0; i<10; i++){
	gens.push(ca.next());
}
Util.draw(gens);

//  ██  ████ ████ █  ███ █    █  ██    █ ██
// ████ █  ███  ██ █ █ ██ █    █ ███    ███
//    ██ █ █ ██ ███ █ ████ █    ██ ██   █  
//    ███ █ █████ ██ ██  ██ █   ██████   █ 
//    █ ██ ██   ████████ ███ █  █    ██   █
// █   ███████  █      ███ ██ █  █   ███   
//  █  █     ██  █     █ █████ █  █  █ ██  
//   █  █    ███  █     ██   ██ █  █  ████ 
//    █  █   █ ██  █    ███  ███ █  █ █  ██
// █   █  █   ████  █   █ ██ █ ██ █  █ █ ██

Scale tuning

Use the new TL.Scala() class to import a .scl file (Scala tuning format) to work with custom tuning systems apart from the Western 12-TET (Equal Temperament) tuning or use one of the tunings from a database with over 5000 tunings from Stichting Huygens-Fokker.

const { Scala } = require('total-serialism').Translate;

// Create an instance of a Scala class
let scl = new Scala();

scl.scalaToFreq([60, 63, 67, 69, 72, 81, 36, 48]);
//=> [ 261.63, 311.13, 392.00, 440.00, 523.25, 880.00, 65.41, 130.81 ]

// Get the entire list of names from the library
scl.names;
// [ '05-19',
//   '05-22',
//   '05-24',
//   '06-41',
//   '07-19',
//   '07-31',
//   '07-37',
//   '08-11',
//   '08-13',
//   '08-19', ... and 5000 more]

Random clave patterns

Use the Rand.clave() to generate binary beats with clave patterns

const { clave } = require('total-serialism').Stochastic;

clave(16, 4);
//=> [ 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1 ] 
//=> █   █ █   █  █ █

clave(16, 3, 1);
//=> [ 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1 ] 
//=> █  █  ██  █ █  █

🚀 Install

Install in node_modules

$ npm install total-serialism
// entire package
const Srl = require('total-serialism');
// subset of library
const Gen = require('total-serialism').Generative;
// specific method from one of the libraries
const { random, drunk } = require('total-serialism').Stochastic;

Import es5 version

// entire package
const Srl = require('total-serialism/build/ts.es5.js');
// subset of library
const Algo = require('total-serialism/build/ts.es5.js').Algorithmic;

Include in html

Include latest or specific version of bundled minified es5 through url in index.html

<script src="https://unpkg.com/total-serialism/build/ts.es5.min.js"></script>

<script src="https://unpkg.com/[email protected]/build/ts.es5.min.js"></script>

Use in a html <script> like so:

// entire package
const Srl = TotalSerialism;
// subset of library
const Rand = TotalSerialism.Stochastic;

🔭 Content

The library consists of a few subsets:

  • Generative : Basic methods that generate arrays of number sequences, such as methods that generate an ascending array of numbers evenly spread between a low and high value.
  • Algorithmic : These are also generative methods, but are in general more complex algorithms, such as a euclidean rhythm generator, lindenmayer string expansion, cellular automaton, fibonacci sequence, pisano periods and more.
  • Stochastic : Methods for procedurally generating number sequences based on various types of randomness, such as white noise (uniformly distributed), rolling a die, flipping a coin and more. Also includes a n-order Markov Chain.
  • Transform : Methods that transform arrays. Think of methods such as reversing, palindrome, duplicating, inversing, interleaving and more.
  • Statistic : A set of methods from Statistics and Probability Theory that allow for analysis of number sequences for statistical purposes. For example getting the average value or the most common value from an array.
  • Translate : Translate between different notation systems and tunings with Scala. For example convert midi values to frequency, or note names to midi integers. Or use a relative semitone notation system and convert to midi. Map values in an Array to a specified scale, and output the relative values in the specified scale, root and octave.
  • Utility : Basic arithmetic and methods necessary to run functions in the libraries above. But can also be of help in your own algorithmic processes.

📟 Usage

The entire library

const Serialism = require('total-serialism');

Or an individual section

const Gen  = require('total-serialism').Generative;
const Algo = require('total-serialism').Algorithmic;
const Mod  = require('total-serialism').Transform;
const Rand = require('total-serialism').Stochastic;
const Util = require('total-serialism').Utility;

🎮 In Action

The following links redirect to p5.js sketches coded in the p5 browser editor. These sketches demonstrate some of the methods from this library, used in both sound (for algorithmic composing) and visuals. The sketches use the ts.es5.min.js bundled minified version of this package. See install for instructions on how to include the minified version in the index.html and script.

A simple synth with a generative melody the notes are generated through chaining of a few methods. Using: Gen.spreadInclusive(), Mod.duplicate(), Util.add()

A simple arpeggiator with a melody generated from multiple periods of a scaled sine function. The period of the function changes over time. using: Gen.sine()

A simple bass synthesizer with a 4 note progression, using euclidean rhythm generators to make a rhythm by adding 2 arrays of euclidean rhythms together. Using: Algo.euclid(), Util.add()

A arpeggiator that uses a generated melody from multiple periods of a scaled cosine function and plays a rhythm generated by a hexadecimal value. Using: Algo.hexBeat(), Gen.cosine()

Inspiration & Bibliography

This library is inspired by the composition techniques named Serialism and Total Serialism. The technique approaches the parameters that make up a piece of music as individual series of values. These parameters are (but not limited to) pitch, duration/rhythm and velocity/dynamics.

Serialism originated from the twelve-tone technique, described in 1919 by Josef Hauer in his published work "Law of the twelve tones". This technique starts out with a randomly ordered set of the twelve chromatic notes. From there on out you can apply transformations on this set, such as reverse/retrograde, inverse, transpose, and combinations between those.

For many of the functions programmed much inspiration was gained from Laurie Spiegels paper on "Manipulation of Musical Patterns" (1981) in which she suggests to "extract a basic "library" consisting of the most elemental transformations which have consistently been successfully used on musical patterns, a basic group of "tried-and-true" musical manipulations." Specifically the stretch and expand methods were inspired by Laurie Spiegels writings in this paper. Stretch is a method that is "inserting a smooth ramp between discretely separated values" and expand is an interpretation of "Extension beyond that which already exists in such a way as to preserve continuity with it, to project from it"

The euclidean rhythm generator was inspired by the famous paper by Godfried Toussaint.

The clave rhythm generator was inspired by another paper by Godfried Toussaint.

Inspiration for the sequencing also came from the Live Coding scene and current programming languages available such as Tidal, Extempore, SonicPi and more. In Live Coding the Serialism technique is very common when programming music. In many cases the rhythms, melodies, and other musical expressions are expressed in arrays that are iterated based on the timing of the system.

The inspiration for usage of Integer Sequences came from composers such as Iannis Xenakis, who used the fibonacci formula in his piece Nomos Alpha and referred to the technique as Fibonacci Motion. Also Xenakis referred to the usuage of set theory for composition as Symbolic Music.

The Online Encyclopedia of Integer Sequences is a great resource for number sequences that can be derived from a wide variety of mathematical functions. A famous sequence is the Fibonacci sequence. An interesting approach used with integer sequences in algorithmic composition is applying a modulo operation. For the fibonacci sequence this results in the Pisano periods.

The Hexadecimal rhythm generator was inspired by a workshop by Steven Yi at the International Conference on Live Coding 2020 at the University of Limerick, Ireland.

Some methods from the Transformational and Stochastic library are inspired by objects or functions in the Max/MSP programming environment. Such as the urn, spread and spreadInclusive methods.

The collatz conjecture algorithm was inspired by a Numberphile and Coding Train video on youtube. The conjecture allows for very organic graphs when drawing the even-odd numbers in sequence as small rotations in angles of lines.

The Infinity Series is based on the work by composer Per Nørgård. The method takes its name from the endlessly self-similar nature of the resulting musical material, comparable to fractal geometry. Mathematically, the infinity series is an integer sequence. A great explanation can be found here:

Some other interesting resources and papers that have been used for some of the methods within this library.

🤓 Missing Something?

This library is a work in progress, and I'm always interested to receive inspiration, suggestions, enhancements, literature and more. Feel free to file an issue here and I will gladly look into it!

🔋 Powered By

Total Serialism is a result of research in algorithmic composition with the Mercury live coding environment.

📄 License

The MIT License

Copyright (c) 2020 Timo Hoogland

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

More Repositories

1

mercury

A minimal and human-readable language and environment for the live coding of algorithmic electronic music.
Max
221
star
2

max-pd-converter

A node script that converts MaxMSP patches to PureData and vice versa
Max
60
star
3

mercury-playground

The Mercury live coding environment running in the browser
JavaScript
36
star
4

wave-terrain-synthesis

A package of abstractions for polar, cartesian wavetable lookup and terrain wavetable generation
Max
30
star
5

av-toolbox

A toolbox full of abstractions to help create your realtime audiovisual works in MaxMSPJitter
Max
25
star
6

th.scala

Explore alternative and microtonal tuning systems with this small package of abstractions for Max
Max
25
star
7

gl-pix-shaders

A small library of various pixel shaders for texture processing in Jitter OpenGL
Max
21
star
8

jit.underworld

Gateway to non-realtime HiRes rendering of audioreactive jitter visuals with synchronised sound
Max
17
star
9

codevember-2019

A project filled with patches/code from the codevember 2019 challenge
Max
12
star
10

live-coding-101

Everything you need for the Live Coding 101 Workshop!
12
star
11

th.euclid

Generate euclidean rhythms as lists or at signal rate
Max
12
star
12

reverb-yafr-mods

A package containing modifications on the famous yafr2 reverb from Max
Max
11
star
13

th.gl.texteditor

A multi-line texteditor in the Max Jitter OpenGL window for interaction with your patch in a Livecoding-like style.
Max
11
star
14

ascii-art

Convert a grayscale movie/image (as texture) to ascii characters in Max-Jitter
Max
8
star
15

poly-recursion

Dynamically build a chain of DSP with poly~ objects inside poly~ objects
Max
8
star
16

vowel-formants-graph

An exploration of different vowel formant datasets with interactive synthesis in p5
JavaScript
7
star
17

circular-wavetable

A wavetable scanner using polar coordinate system, controlling rotation, radius, and modulation on radius
Max
6
star
18

th.gl.texturefolder

This abstraction allows you to load an entire folder into named textures
Max
6
star
19

emoji4max

Probably the least useful package for Max8, but lots of fun.
Max
6
star
20

simplex-noise-loop

A few examples on how to create GIF noise loops with Jitter in Max
Max
6
star
21

sample-scatter-scrubber

Plot and scrub through a set of samples in 3D space organized based on their spectral description
Max
6
star
22

th.clockwarp

Create rhythms, subdivisions, probabilities and warping out of a single phasor~
Max
5
star
23

total-serialism-n4m

A node-for-max example using the total-serialism package
Max
5
star
24

risset-rhythm-effect

A patch demonstrating the Risset Rhythm Effect, an endlessly speeding drumloop
Max
5
star
25

th.comp

A mono Dynamic Range Compressor for Max with side-chain functionality
Max
5
star
26

image-scraper-n4m

Scrape images from Google and use them as textures on Multiple gridshapes in Jitter
Max
5
star
27

gridshape-raymarcher

A raymarcher shader for gridshape geometry in the Max Jitter environment
Max
5
star
28

osc-midi-bridge

A simple server and browser page to forward OSC messages and MIDI using socket.io and webmidi
HTML
5
star
29

misc-max-abstractions

Various max abstractions helpful during patching
Max
5
star
30

strange-attractor-synth

A synthesizer using strange attractors in signal domain for modulation
Max
4
star
31

th.clave

Generate random clave patterns for algorithmic composition
Max
4
star
32

th.lfo

A small lfo abstraction with selectable waveshapes
Max
4
star
33

max-meetup-nl

A collection of patches and code from the Max User Meetup NL
Max
4
star
34

mercury-workshop

A repository with references, cheatsheet, exercises and more helpful references for when giving a Mercury workshop/course.
4
star
35

soularis

A 3-dimensional sequencer analogues to a solar-system
Max
4
star
36

th.gl.commandline

A commandline text-editor in the Max Jitter OpenGL window for interaction with your patch in a Livecoding-like style.
Max
4
star
37

gl.shadermappings

Quick access to all included shaders in the Max8 application
JavaScript
4
star
38

strange-attractors

Strange Attractor Particle Systems in OpenGL through a glsl vertex shader with transform feedback
Max
4
star
39

n4m-p5

A small example for sending osc between Node4Max and p5.js
Max
4
star
40

th.gl.videogrid

Display a video/texture in the jit.world on a fixed grid
Max
4
star
41

mercury-app

The Mercury web playground wrapped in a standalone electron app
JavaScript
3
star
42

mercury-lang

Package that parses Mercury code and returns a JSON formatted parse tree
JavaScript
3
star
43

integer-sequences

A package with abstractions to generate integer sequences in Max
Max
3
star
44

mc-utilities

A package containing various abstractions that can be used with mc in Max8
Max
3
star
45

list-objects

A small package containing various abstractions for list processing and statistical analysis
Max
3
star
46

th.cross3

Get the average amplitude values from an audio signal over 3 different frequency bands.
Max
2
star
47

abstraction

An installation demonstrating abstraction through interaction with code
Max
2
star
48

motion-silhouette

A OpenGL jitter patch that transforms the webcam input to a black and white motion image
Max
2
star
49

dynamic-scene-loading

Dynamically load multiple jitter patches and process through dynamic chain of pixel-shaders in poly
Max
2
star
50

sample-cleaner

Batch process a folder of samples in different ways with ffmpeg
JavaScript
2
star
51

th.pitchshift

A mono time domain pitch shifter abstraction for Max
Max
2
star
52

pass-comparators

Max abstractions that pass a value to the output if the condition is true, else the output is blocked.
Max
2
star
53

th.gl.cornerpin

jit.gl.cornerpin wrapped in an abstraction that automatically exposes corner coordinates to pattrstorage
Max
2
star
54

th.midiglide

Keep track of currently held midi-notes and glide pitch back to previous note on release of latest pressed midi-note.
Max
2
star
55

mercury-pulsar

Live code electronic music with Mercury via the Pulsar editor
JavaScript
1
star
56

gl.check

Small abstraction that checks which GL engine is used in MaxJitter (gl2/gl3) and asks to switch
Max
1
star
57

th.linden

Generate lindenmayer system string expansions with custom rules for algorithmic composition
Max
1
star
58

tmhglnd.github.io

Github pages repository
1
star
59

th.getkey

return a bang or bool on keydown or keyup strokes of a specified character
Max
1
star
60

coding-encounters

A collective effort to map out creative coding events, meetups, workshops, exhibitions, venues, residencies, etc.
JavaScript
1
star