Markov Experiment II Jacob Joaquin July 6, 2010 jacobjoaquin@gmail.com csoundblog.com 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 ; 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