Created
July 29, 2012 01:10
-
-
Save jacobjoaquin/3195564 to your computer and use it in GitHub Desktop.
Markov Experiment 2 (Original Csound Edition)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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