Max/Msp/Jitter

Basic

Max
Object Oriented Programming
Shortcut
ToolBox
Mathematics
Physics
Probability
External Object
MIDI
DMX

Advanced

Psychoacoustics
mxj (Java Class Object)
Arduino
OSC

DSP/Synthesis

Recording & Playback
Time Stretching & Pitchshifting (ableton Live)
Wavetable Synthesis
White Noise (Joji Yuasa)
Sampleing & Processing (Autechre)
Scratching (Grandmaster Flash)
Glitch (Oval)
Theremin (Léon Theremin)
Comb Filter (Paul Lansky)
Auto Tune (Perfume)
Harsh Noise (Merzbow)
Vocal Chop (Prefuse73)
Blur (Akihiko Matsumoto)
Freeze (Jean-François Charles)
FM Synthesis (John Chowning)
Granular Synthesis (Iannis Xenakis)
Phase Vocoder (Charles Dodge)
Convolution (R.Luke Dubois)

Composition

Algorithmic Composition (David Cope)
Chaos Theory (Edward Lorenz)
Genarative music (Brian Eno)
Phasing (Steve Reich)
Markov Chain (Gregorian Chant)
Parallel Organum (Musica enchiriadis)
Shepard Tone (Jean-Claude Risset)
Spectral Technic (Tristan Murail)
12Tone Serial technic (Webern)
Data Mapping (Guido Da Arezzo)
Schenker Theory (Heinrich Schenker)
Tonal Harmony (Jean-Philippe Rameau)
Tintinnabuli (Arvo Pärt)
monome (Brian Crabtree and Kelli Cain)
Golden Mean (John Chowning)
Analog Sequencer (Robert Moog)
Pitch-class Set Theory (Allen Forte)
Irregular Rhythm(Igor Stravinsky)
Iso Rhythm (Philippe de Vitry)
Rhythmic Mode (Notre Dame School)
Graphic Score (Morton Feldman)
Tone Cluster (Ligeti)
Brown Noise (Leonin)
Fibonacci Series (Bartok)
Fractal (Charles Dodge)
Stochastic technic (Xenakis)

Video

Chromakey (Peter Campus)
Transition

Openmusic

Operation

Spectral Harmony (Tristan Murail)
New Complexity (Brian Ferneyhough)
12 Tone operation (Arnold Schoenberg)
Contour Inversion
Morphing

RTcmix

Basic

RTcmix
Unix Command
Unix Directory
Emacs Command

Synthesis/DSP

Additive Synthesis
Subtractive Synthesis
FM Synthesis
Delay
Flange
Comb Filter
AM Synthesis
Granular Synthesis
Phisical Modeling Synthesis
Waveshape Synthesis
Wavetable Synthesis
Stochastic Synthesis
PVOC

Probability / 確率理論

作曲において偶然性という概念はモーツアルトのダイスによる作曲法から、コイントスまで様々な方法が試みられてきましたがコンピュータの出現以降、偶然性は乱数という形でいっそう積極的に作曲家達にもてはやされてきました。このページでは様々な乱数の生成法、利用法などを解説します。

様々な乱数

ダイスやコイントスとコンピュータアルゴリズムによる決定的な違いは何でしょう。無作為にデータを得られるという特徴は同じです。例えば、野球の試合を想像してみましょう。チームは強いチームもあれば弱いチームもあり、勝率も異なります。我々は弱いチームと強いチームの勝負の予想をするとき、強いチームが勝つ確率と弱いチームが勝つ確率を共に1/2とは考えません。当然強いチームのほうが勝つ確率が高いと予想するでしょう。過去の勝負からどちらが強いか推測が出来るからです。ダイスやコイントスを使ってもこのような予測は立てることはできません。出現確率に重みを付けることができるのがコンピュータによるアルゴリズムとダイス、コインの違いなのです。

乱数の生成には以下のアルゴリズムが有効です。これはコンパイルしmxjオブジェクトから読み込むことでmax/mspで利用可能です。max/mspのパッチングだけでは面倒なアルゴリズムはjavaやjavascriptを積極的に利用することをおすすめします。

一様乱数

uniform

一様乱数は全ての値の出現頻度が同等の乱数で、いわばホワイトノイズと同じような現象です。

import com.cycling74.max.*;
import java.util.Random;

	public class uniRandom extends MaxObject {
	
		long seed = Long.MAX_VALUE;
		Random r = new Random();
		
		public uniRandom(Atom[] args) {
		declareAttribute("seed", null, "setSeed");
		}
		
		public void setSeed(int i) {
		seed = (long)i;
		r.setSeed(seed);
		}
		
	    public void bang() {
		outlet(0,r.nextFloat());
		outlet(1,r.nextFloat());
		}	
	}

dowonload

m.uniRandom.maxhelp

線形分布

lin

y=axもしくはy=-ax+1のグラフのように直線的に出現頻度が分布した乱数です。

import com.cycling74.max.*;
import java.util.Random;

	public class linRandom extends MaxObject {
		float r_1;
		float r_2;
		float rand;
		long seed = Long.MAX_VALUE;
		Random r = new Random();
		
		public linRandom(Atom[] args) {
		declareAttribute("seed", null, "setSeed");
		}
	    public void bang() {
		r_1 = r.nextFloat();
		r_2 = r.nextFloat();
		
		if(r_1 < r_2){
			rand = r_1;
		}	
		else{
			rand = r_2;
		}
		
		outlet(0,rand);
		}	
	}

指数分布

exp

指数関数的な分布を持つ乱数です。

import com.cycling74.max.*;
import java.util.Random;

	public class expRandom extends MaxObject {
		float x;
		float rand;
		float y;
		float lambda=0.5f;
		long seed = Long.MAX_VALUE;
		Random r = new Random();
		
		public expRandom(Atom[] args) {
		declareAttribute("seed", null, "setSeed");
		declareAttribute("lambda");
		}
		
		public void setSeed(int i) {
		seed = (long)i;
		r.setSeed(seed);
		}
		
	    public void bang() {
		x = r.nextFloat();
		
		rand = (float)Math.log(x)/lambda*-1;		
		outlet(0,rand);
		}	
	}

三角分布

tri

中心付近になるほど出現頻度が増す乱数のアルゴリズムです。

import com.cycling74.max.*;
import java.util.Random;

	public class convexRandom extends MaxObject {
		float r_1;
		float r_2;
		float rand;
		long seed = Long.MAX_VALUE;
		Random r = new Random();
		
		public convexRandom(Atom[] args) {
		declareAttribute("seed", null, "setSeed");
		}
		
		public void setSeed(int i) {
		seed = (long)i;
		r.setSeed(seed);
		}
		
	    public void bang() {
		r_1 = r.nextFloat();
		r_2 = r.nextFloat();
		
		rand=(float)0.5*(r_1+r_2);
		
		outlet(0,rand);
		}	
	}

正規分布

gauss

正規分布、ガウス分布の乱数を生成するアルゴリズムです。平均のmeanと分散のstdという属性付きのフロートナンバーを送ることで分布をリアルタイムに変化させることが可能です。

import com.cycling74.max.*;
import java.util.Random;

	public class gaussRandom extends MaxObject {
	float mean = 0.0f;
	float std = 0.5f;
	long seed = Long.MAX_VALUE;
	Random r = new Random();
	
	public gaussRandom(Atom[] args) {
		declareAttribute("mean");
		declareAttribute("std");
		declareAttribute("seed", null, "setSeed");
	}
	
	public void setSeed(int i) {
		seed = (long)i;
		r.setSeed(seed);
	}
	
	public void bang() {
		outlet(0, mean + std * (float)r.nextGaussian());
	}

	}

weibullRandom分布

weibull

weibullRandom分布に基づいた乱数生成アルゴリズムです。sとtの変数を変化させることで劇的に分布を変化させることが可能です。

import com.cycling74.max.*;
import java.util.Random;

	public class weibullRandom extends MaxObject {
		float u;
		float a;
		float tinv;
		float s = 0.3f;
		float t = 3f;
		float rand;
		long seed = Long.MAX_VALUE;
		Random r = new Random();
		
		public weibullRandom(Atom[] args) {
		declareAttribute("seed", null, "setSeed");
		declareAttribute("t");
		declareAttribute("s");
		}
	    public void bang() {
		tinv = t/1;
		do{
			u = r.nextFloat();
		}while(u == 0 | u == 1);
		a = 1/(1-u);
		rand = s*(float)Math.pow((float)Math.log(a),tinv);
		
		outlet(0,rand);
		}	

	}

Beta分布

beta

Beta分布の生成アルゴリズムです。a,bの変数で分布をコントロールすることが可能です。

import com.cycling74.max.*;
import java.util.Random;

	public class betaRandom extends MaxObject {
		float u1;
		float u2;
		float y1;
		float y2;
		float sum;
		float ainv;
		float binv;
		float a = 0.2f;
		float b = 0.3f;
		float rand;
		long seed = Long.MAX_VALUE;
		Random r = new Random();
		
		public betaRandom(Atom[] args) {
		declareAttribute("seed", null, "setSeed");
		declareAttribute("a");
		declareAttribute("b");
		}
	    public void bang() {
		ainv=1/a;
		binv=1/b;
		do{
			do{
				u1 = r.nextFloat();
			}while(u1 == 0);
			do{
				u2 = r.nextFloat();
			}while(u2 == 0);
			y1=(float)Math.pow(u1,ainv);
			y2=(float)Math.pow(u2,binv);
			sum=y1+y2;
		}	
		while(sum > 1);		
		rand = y1/sum;
		
		outlet(0,rand);
		}	

	}

Cauchy分布

cauchy

コーシー分布の生成アルゴリズムです。alphaの値で分布の形をコントロール可能です。

import com.cycling74.max.*;
import java.util.Random;

	public class cauchyRandom extends MaxObject {
		float u;
		float pi = 3.1415927f;
		float alpha = 0.5f;
		float rand;
		long seed = Long.MAX_VALUE;
		Random r = new Random();
		
		public cauchyRandom(Atom[] args) {
		declareAttribute("seed", null, "setSeed");
		declareAttribute("alpha");
		}
	    public void bang() {
		u = r.nextFloat();
		u=u*pi;
		
		rand = alpha*(float)Math.tan(u);
		
		outlet(0,rand);
		}	

	}
Max/Msp Algorithmic Computer Music Online Tutorial