Skip to content

Instantly share code, notes, and snippets.

@jacobjoaquin
Created July 29, 2012 01:10
Show Gist options
  • Save jacobjoaquin/3195564 to your computer and use it in GitHub Desktop.
Save jacobjoaquin/3195564 to your computer and use it in GitHub Desktop.
Markov Experiment 2 (Original Csound Edition)
Markov Experiment II
Jacob Joaquin
July 6, 2010
jacobjoaquin@gmail.com
csoundblog.com
<CsoundSynthesizer>
<CsInstruments>
sr = 44100
kr = 44100
ksmps = 1
nchnls = 1
0dbfs = 1
; Instruments
# define Start # 1 #
# define Stop # 2 #
# define State_0 # 3 #
# define State_1 # 4 #
# define State_2 # 5 #
# define State_3 # 6 #
# define State_4 # 7 #
# define State_5 # 8 #
# define State_6 # 9 #
# define State_7 # 10 #
# define TriPunch # 11 #
# define BoomPlayer # 12 #
# define Boom # 13 #
; Tables
; Waveforms
# define t_sin # 1 #
# define t_tri # 2 #
; State Odds
# define S_0 # 3 #
# define S_1 # 4 #
# define S_2 # 5 #
# define S_3 # 6 #
# define S_4 # 7 #
# define S_5 # 8 #
# define S_6 # 9 #
# define S_7 # 10 #
; Dependencies
# define WeightedRandomFn # 11 #
; Table
itemp ftgen $t_sin, 0, 2 ^ 16, 10, 1
itemp ftgen $t_tri, 0, 2 ^ 16, -7, 0, 2 ^ 14, 1, 2 ^ 15, -1, 2 ^ 14, 0
; Connect state nodes
gitemp ftgen $S_0, 0, -2, -2, $State_1, 1
gitemp ftgen $S_1, 0, -4, -2, $State_0, 1, $State_2, 1
gitemp ftgen $S_2, 0, -4, -2, $State_0, 1, $State_3, 1
gitemp ftgen $S_3, 0, -6, -2, $State_0, 1, $State_3, 4, $State_4, 1
gitemp ftgen $S_4, 0, -2, -2, $State_5, 1
gitemp ftgen $S_5, 0, -4, -2, $State_4, 1, $State_6, 2
gitemp ftgen $S_6, 0, -4, -2, $State_4, 1, $State_7, 2
gitemp ftgen $S_7, 0, -6, -2, $State_4, 1, $State_7, 4, $State_0, 2
; Different every time
seed 0
opcode WeightedRandom, i, i
ifn xin ; Table of ordered (element, weight) pairs
isize = ftlen(ifn)
isize_2 = int(isize / 2)
iweight_fn ftgen $WeightedRandomFn, 0, isize_2 * -1, -2, 0
iweight_total init 0
; Get elements and weights
i_index init 0
start_loop:
iweight tab_i i_index * 2 + 1, ifn
iweight_total = iweight_total + iweight
tabw_i iweight_total, i_index, iweight_fn
loop_lt i_index, 1, isize_2, start_loop
; Choose element based on weighted values
i_index = 0
irandom random 0, iweight_total
start_loop_2:
ival tab_i i_index, iweight_fn
if irandom < ival igoto end
i_index = i_index + 1
igoto start_loop_2
end:
ielement tab_i i_index * 2, ifn ; Get element
xout ielement ; Return randomly selected element
ftfree iweight_fn, 0 ; Free table
endop
opcode SelectState, i, iiiiS
istate_fn, \ ; Table storing weighted odds
inext, \ ; Time until next note
itempo, \ ; Tempo ratio
iamp, \ ; Amplitude
Sid xin
itime_left chnget Sid
itime_left = itime_left - inext
if itime_left >= 0 then
chnset itime_left, Sid
istate WeightedRandom istate_fn
Sevent sprintf {{i %d %f %f %f "%s"}}, istate, inext * itempo, \
itempo, iamp, Sid
scoreline_i Sevent
endif
xout 1
endop
instr $Start
itempo = p3 ; Tempo
idur = p4 ; Duration in beats
iamp = p5 ; Amplitude
Sid = p6 ; String identifier of running Markov chain
p3 = idur * itempo ; Duration in seconds
; Begin Markov chain
Sevent sprintf {{i %d 0 %f %f "%s"}}, $State_0, itempo, iamp, Sid
scoreline_i Sevent
; Create a bus to track remaining time
istatus = 1
chn_k Sid, 3
chnset idur, Sid
turnoff
endin
instr $State_0
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 1 ; Duration of of note
ifreq = cpspch(8.00) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_0, inext, itempo, iamp, Sid
turnoff
endin
instr $State_1
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 0.5 ; Duration of of note
ifreq = cpspch(8.02) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_1, inext, itempo, iamp, Sid
turnoff
endin
instr $State_2
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 1 ; Duration of of note
ifreq = cpspch(8.03) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_2, inext, itempo, iamp, Sid
turnoff
endin
instr $State_3
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 0.5 ; Duration of of note
ifreq = cpspch(8.05) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_3, inext, itempo, iamp, Sid
turnoff
endin
instr $State_4
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 1 ; Duration of of note
ifreq = cpspch(8.07) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_4, inext, itempo, iamp, Sid
turnoff
endin
instr $State_5
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 1.5 ; Duration of of note
ifreq = cpspch(8.10) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_5, inext, itempo, iamp, Sid
turnoff
endin
instr $State_6
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 1 ; Duration of of note
ifreq = cpspch(8.09) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_6, inext, itempo, iamp, Sid
turnoff
endin
instr $State_7
itempo = p3 ; Tempo in seconds per beat
iamp = p4 ; Amplitude
Sid = p5 ; Markov process ID
inext = 0.5 ; Duration of of note
ifreq = cpspch(9.00) ; Frequency
;Trigger note
event "i", $TriPunch, 0, itempo, inext, iamp, ifreq
; Select next state
itemp SelectState $S_7, inext, itempo, iamp, Sid
turnoff
endin
instr $TriPunch
itempo = p3 ; Tempo in seconds per beat
idur = p4 * itempo ; Duration in seconds
iamp = p5 ; Amplitude
ifreq = p6 ; Frequency
p3 = idur ; Modify play time from beats to seconds
iattack = 0.06
irandom random 0.995, 1.005
a1 oscil iamp, ifreq * irandom, $t_tri
a2 linseg 1, iattack, 0.1, idur - iattack, 0
out a1 * a2
endin
instr $BoomPlayer
itempo = p3
ibeats = p4
iamp = p5
event "i", $Boom, 0, 1, iamp
; Trigger self
ibeats = ibeats - 1
if ibeats > 0 then
event "i", $BoomPlayer, itempo, itempo, ibeats, iamp
endif
turnoff
endin
instr $Boom
p3 = 0.125
idur = p3
iamp = p4
a3 line 131, idur, 60
a1 oscil iamp, a3, $t_sin
a2 line 1, idur, 0
out a1 * a2
endin
</CsInstruments>
<CsScore>
; Instruments
# define Start # 1 #
# define Stop # 2 #
# define State_0 # 3 #
# define State_1 # 4 #
# define State_2 # 5 #
# define State_3 # 6 #
# define State_4 # 7 #
# define State_5 # 8 #
# define State_6 # 9 #
# define State_7 # 10 #
# define TriPunch # 11 #
# define BoomPlayer # 12 #
# define Boom # 13 #
t 0 133
i $Start 0 1 128 0.4 "process_1"
i $BoomPlayer 0 1 128 0.4
e 128
</CsScore>
</CsoundSynthesizer>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment