Wondering what’s next for npm?Check out our public roadmap! »

    total-serialism

    1.15.0 • Public • Published

    Total Serialism

    Visit the Total Serialism Documentation for interactive examples.

    total-serialism is a set of methods used for procedurally generating and transforming number sequences. This library is mainly designed with algorithmic composition of music in mind, but can surely be useful for other purposes that involve 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.

    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

    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.

    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.

    // Create an instance of a Scala class
    let scl = new TL.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]

    Expand and stretch array

    Expand an array by analyzing its internal structure

    Rand.seed(3141);
    Rand.expand(30, [0, 9, 7, 3, 5, 0, -1]);
    
    //=>  9.00 ┤╭╮      ╭╮                    
    //    6.80 ┤│╰╮     ││                    
    //    4.60 ┤│ │╭╮   ││                    
    //    2.40 ┤│ ╰╯│   │╰─╮             ╭─╮  
    //    0.20 ┼╯   ╰─╮╭╯  │             │ │╭ 
    //   -2.00 ┤      ╰╯   ╰╮   ╭─╮      │ ╰╯ 
    //   -4.20 ┼            │   │ │    ╭╮│    
    //   -6.40 ┤            ╰╮  │ │    │╰╯    
    //   -8.60 ┤             │╭╮│ ╰─╮  │      
    //  -10.80 ┤             ╰╯╰╯   │╭╮│      
    //  -13.00 ┤                    ╰╯╰╯      

    Stretch an array by interpolating between array values

    Mod.stretch([0, 12, 3, 7], 30);
    
    //=> 11.69 ┼        ╭─╮                   
    //   10.52 ┤        │ ╰╮                  
    //    9.35 ┤       ╭╯  ╰─╮                
    //    8.18 ┤      ╭╯     ╰╮               
    //    7.01 ┤     ╭╯       ╰╮           ╭─ 
    //    5.84 ┤    ╭╯         ╰╮       ╭──╯  
    //    4.68 ┤   ╭╯           ╰─╮  ╭──╯     
    //    3.51 ┤  ╭╯              ╰──╯        
    //    2.34 ┤ ╭╯                           
    //    1.17 ┤╭╯                            
    //    0.00 ┼╯ 

    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;

    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/total-serialism@1.6.12/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 generation, lindenmayer string expansion, cellular automata, fibonacci sequence, pisano periods and more.
    • Stochastic : Methods for procedurally generating number sequences based on various types of randomness, such as white noise (evenly distributed), rolling dice, flipping a coin and more. Also includes Markov Chain.
    • Transform : Methods that transform the array in some fashion. 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/dynamic.

    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 and the hexadecimal rhythm generator was inspired by Steven Yi's implementation in the CSound livecoding environment and a workshop given by him during the ICLC 2020 in Limerick.

    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.

    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.

    Install

    npm i total-serialism

    DownloadsWeekly Downloads

    61

    Version

    1.15.0

    License

    MIT

    Unpacked Size

    9.97 MB

    Total Files

    5139

    Last publish

    Collaborators

    • avatar