Home : Muse-O-Matic : Source Code 
 

Source Code

Here is some of the KeyKit code behind Muse-O-Matic. It makes use of various library routines from the KeyKit user-defined library. The development of these algorithms was done in an "improvised" fashion - try something, see how it sounds, tweak it, see how it sounds, etc.
function wwwalg1(word,leng) {
	s=word
	x=echovariety(strnotes(s))
	w=polishit(x)
	r = cutitdown(w,leng*1b)
	writemf(r,"www.mid")
	writelines(r,"www.lines")
}

function wwwalg2(word) {
	r=bswww(word)
	writemf(r,"www.mid")
	writelines(r,"www.lines")
}

function cutitdown(w,desired) {
	while ( 1 ) {
		m = 0
		r = ''
		lng = 0
		n = 0
		mod=2
		while ( 1 ) {
			p = cut(w,CUT_TIME,m*4b,(m+1)*4b)
			if ( sizeof(p) == 0 )
				break
			p.time -= m*4b
			if ( n == 0 ) {
				r += p
				lng += 4b
				r.length = lng
			}
			m++
			n++
			if ( n >= mod )
				n = 0
		}
		if ( r.length <= desired )
			break
		# otherwise cut it some more
		w = r
	}
	return(r)
}

function bswww(str,majmin) {

	if ( nargs() < 2 )
		majmin = 0

	bskey = 'e-o-2'
	bsmajor = []
	bsmajor[ 1 ]= 'e-o-2'
	bsmajor[ 2 ]= 'e-o-2,f,g,b-'
	bsmajor[ 3 ]= 'e-o-2,b-'
	bsmajor[ 4 ]= 'e-o-2,b-'
	bsmajor[ 5 ]= 'e-o-2,f,g,b-'
	bsmajor[ 6 ]= 'e-o-2,b-'
	bsmajor[ 7 ]= 'e-o-2,f,g,b-'
	bsmajor[ 8 ]= 'e-o-2,b-'
	bsminor = []
	bsminor[ 1 ]= 'e-o-2'
	bsminor[ 2 ]= 'e-o-2,f,g-,b-'
	bsminor[ 3 ]= 'e-o-2,b-'
	bsminor[ 4 ]= 'e-o-2,b-'
	bsminor[ 5 ]= 'e-o-2,f,g-,b-'
	bsminor[ 6 ]= 'e-o-2,b-'
	bsminor[ 7 ]= 'e-o-2,f,g-,b-'
	bsminor[ 8 ]= 'e-o-2,b-'
	
	ntimes = 8
	p0 = strnotes(str)
	dodetense = 1
	if ( dodetense == 0 ) {
		p1 = p0
	}
	else {
		p1 = ''
		for ( n in p0 ) {
			if ( p1 == '' )
				p1 = lastn = n
			else {
				while ( tension(n,lastn) > 3 )
					n.pitch++
			}
			p1 |= n
		}
	}
	p = scatimes(p1,8)

	guide = shuffle(repeat(p1,3*ntimes))
	guide = guide { isonbeat(??,3b) }
	guide =  octavefence(guide,72,72)

	p2 = bsguide(majmin==0?bsmajor:bsminor,bskey,p,guide,1b/4,p.length)

	pend = latest(p2)
	p2a = p2 { isonbeat(??,2b) }
	p2b = gradinclude(p2,0.0,1.0,0)
	p2 = dedup(p2a | p2b)
	p2 = octavefence(p2,52,88)

	p2r = reverse(p2)
	p2rev = ''
	c = 4b
	for ( n=0; ; n=n+2 ) {
		z = cut(p2r,CUT_TIME,n*c,(n+1)*c)
		if ( sizeof(z) == 0 )
			break
		z.time -= n*c
		z.length = c
		p2rev += z
	}
	p2 = p2 + p2rev
	p2.chan = 1	# main melody


	p2x = makerootevery(p2,1b)
	p2x = gradinclude(p2x,0.0,1.0)
	p2x = octavefence(p2x,46,58)
	p2x.chan = 2	# piano
	p2 |= p2x
	l = latest(p2)
	p2ya = makerootevery(cut(p2,CUT_TIME,0,l/4),4b)
	p2yb = makerootevery(cut(p2,CUT_TIME,l/4,l/2),2b)
	p2yc = makerootevery(cut(p2,CUT_TIME,l/2,3*l/4),1b)
	p2yd = makerootevery(cut(p2,CUT_TIME,3*l/4,l),2b)
	p2y = p2ya | p2yb | p2yc | p2yd
	p2y = octavefence(p2y,34,46)
	p2y.chan = 3	# bass
	p2 |= p2y

	# final little gliss, based on last note in bass
	lastnt = p2y%sizeof(p2y)
	lastnt.time = 0
	lastnt.dur = 4b
	pf = bsguide(majmin==0?bsmajor:bsminor,bskey,
				lastnt,
		'co1d48,co2,co3,co4,co5',1b/4,2b+1b/4)
	pf.chan = 1
	p2 += pf

	# proot = octavefence(p,36,50)
	# proot = proot | transpose(proot,4) | transpose(proot,-5)
	
	sus = sussect(2b)
	susp = sus
	while ( susp.length < p2.length )
		susp += sus
	susp.chan = 1
	# patches =  progchange(1,1)
	# 		| progchange(1,2)
	# 		|  progchange(1,3)
	patches =  progchange(47,1)
			| progchange(47,2)
			|  progchange(33,3)
	p3 = patches | p2 | susp
	return(p3)
}

function echovariety(w) {
	w2 = addrootevery(w,2b)
	w3 = arpeggio(w2)

	w4 = echo(w3,2,4b)
	w4b = echo(w4,2,2b)
	w5 = echo(w4b,4,1b/8)
	w6 = echo(w5,4,1b/16)

	w7 = arpeggio(w6)
	w8 = transposeseqinplace(w7,w2)
	w9 = octavefence(w8,54,90)
	w10 = addrootevery(w9,4b)
	w11 = addrootevery(w10,2b)
	w12 = scatimes(w11,0.5)
	return(w12)
}
function polishit(w) {
	leng = latest(w)
	m = mono(w,2)	# random priority
	m2 = octavefence(m,74,100)
	m2.chan=2
	m2b = echo(m2{??.number%4==0},4,1b/4,0.80)
	m2c1 = cut(m2|m2b,CUT_TIME,leng/4,leng/3){rand(4)==0}
	m2c2 = cut(m2|m2b,CUT_TIME,leng/3,leng/2){rand(3)==0}
	m2c3 = cut(m2|m2b,CUT_TIME,leng/2,leng)
	m2c = m2c1 | m2c2 | m2c3
	# add some roots to melody toward end
	m2final = m2c | makerootevery(cut(m2c,CUT_TIME,2*leng/3),4b)

	# drums
	m3 = octavefence(m,54,64)
	m3.chan = 10
	m4 = m3{??.number%2==0}
	m5 = m3{??.number%3==0}
	m6 = m3{??.number%4==0}
	m7 = quantize(cut(m3{??.number%3==0},CUT_TIME,3*leng/4,leng),1b)
	m4.pitch = 61
	m5.pitch = 60
	m6.pitch = 64
	m7.pitch = 70
	m4 = quantize(m4,1b)
	m5b = echo(m5{??.number%9==0},4,1b/4,0.80)
	m6b = echo(m6{??.number%7==0},4,1b/4,0.80)
	m7b = echo(m7{??.number%3==0},4,1b/4,0.80)
	m7b1 = cut(m7b,CUT_TIME,0,7*leng/8)
	m7b2 = echo(cut(m7b,CUT_TIME,7*leng/8,leng),4,1b/4,0.95)
	m7b = m7b1 | m7b2
	drumsfinal = cut(m4|m5|m6|m7|m5b|m6b|m7b,CUT_TIME,leng/2,leng)
	drumsfinal.vol *= 0.8

	nnotes = sizeof(w)
	www = echo(w%nnotes,16,1b/4,0.95)
	www2 = www
	www2.chan = 2

	return(m2final|drumsfinal|w|www|www2)
}
function finalwein() {
	x = echovariety(strnotes("weinstock"))
	w = polishit(x)
	return(p+w)
}
function finalneil() {
	x = echovariety(strnotes("neil"))
	w = polishit(x)
	return(p+w)
}
Return to Muse-O-Matic