[Csnd] random walk without repetitions

Dear community,
I’ve written an udo for an random walk, inspired by https://flossmanual.csound.com/basics/random (example 9).

I would like to modify the udo in that way that repetitions of the same index could be prevented, but I don’t know how to do this.
Does someone have a hint for me?
That’ my code:
%%%%%%%%% SNIPPET%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

-odac -m0d ; ==============================================

sr = 44100
;ksmps = 100
nchnls = 2
0dbfs = 1
seed 0
;iNumbers ftgen 0,0,16,-2,0,110,22

gihalbton[ ] fillarray 220.0, 233.08, 246.94, 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.0, 415.3, 440.0, 466.16, 493.88, 523.25, 554.37, 587.33

opcode StefansRandomWalk,k,iiiii
iLowestIndx,iHighestIndx,iStartIndx,indxDevRange,iDevDir xin
kIndxDevRange init indxDevRange
kDevDir init iDevDir
kIndx init iStartIndx
kLowIndxBound = kDevDir < 0 ? -kIndxDevRange+kDevDir : -kIndxDevRange
kHighIndxBound = kDevDir > 0 ? kIndxDevRange+kDevDir : kIndxDevRange
;get random value in these boundaries

;add to current pitch
kIndx += kIndxRnd ;
;change direction if maxima are crossed, and report
if kIndx = iHighestIndx && kDevDir > 0 then
kDevDir = -kDevDir
elseif kIndx = iLowestIndx && kDevDir < 0 then
kDevDir = -kDevDir
endif
kIndx limit kIndx,iLowestIndx,iHighestIndx
xout kIndx
endop

instr 1
iLowestIndx = 0 ; xin
iHighestIndx = lenarray(gihalbton)-1
iHighestIndx = 10 ; xin
;set pitch startpoint, deviation range and the first direction
iStartIndx = 5 ; xin
iIndxDev = 2 ;xin, random range for next pitch
iIndxDir = 1 ;xin positive = upwards
iwieoft = 3
kmetro metro iwieoft
if kmetro ==1 then
kIndx StefansRandomWalk iLowestIndx,iHighestIndx,iStartIndx,iIndxDev,iIndxDir
;kIndx = int(kIndx)

kcps = gihalbton[kIndx]
endif
imintim = 0 ; wenn der Wert größer ist gibts pausen zwischen den Einsätzen
imaxnum = 0
insnum = 2
iwhen = 0

kdur random 0.1,0.5 ;,iwieoft
kamp random -6,-3 ;,8 ;,iwieoft

schedkwhen kmetro, imintim, imaxnum, insnum, iwhen, kdur,kcps,kamp
printk 1/iwieoft,kIndx
;printk 1/iwieoft,kamp
endin

instr 2
icps = p4
iamp = ampdb(p5); random 0.1,0.5
iein = 0.01
idur = p3-iein
kenv linseg 0,iein,1,idur,0
asine poscil kenv*iamp,icps
outs asine,asine

endin

; ==============================================

i1 0 60

%%%%%%%%%%%%%%%% SNIPPET END %%%%%%%%%%%%%%%%%%%%%%
Thank You,
Stefan

Csound mailing list Csound@listserv.heanet.ie https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND Send bugs reports to https://github.com/csound/csound/issues Discussions of bugs and features can be posted here

Dear community,
I’ve made a mistake with the opcode.
My code is:
opcode StefansRandomWalk,k,iiiii
iLowestIndx,iHighestIndx,iStartIndx,indxDevRange,iDevDir xin
kIndxDevRange init indxDevRange
kDevDir init iDevDir
kIndx init iStartIndx
kLowIndxBound = kDevDir < 0 ? -kIndxDevRange+kDevDir : -kIndxDevRange
kHighIndxBound = kDevDir > 0 ? kIndxDevRange+kDevDir : kIndxDevRange
kIndxRnd random kLowIndxBound, kHighIndxBound
kIndxRnd = int(kIndxRnd)
;add to current pitch
kIndx += kIndxRnd
;change direction if maxima are crossed, and report
if kIndx = iHighestIndx && kDevDir > 0 then
kDevDir = -kDevDir
elseif kIndx = iLowestIndx && kDevDir < 0 then
kDevDir = -kDevDir
endif
kIndx limit kIndx,iLowestIndx,iHighestIndx
xout kIndx
endop

Random walk,… hmmm.
Few weeks back was dabbling with random walk within a Bayesian space
in looking at storm tracking swath region. Ever thought about rendering audio
using that within this, to add to it?

Just thinking out loud. Enjoy the explorations.

-PBS

Dear Partev,
sorry, but I have know idea what You mean by “Bayesian space”.
Could You maybee give a short example?
Best,

Stefan

Somewhat random distribution within a boundary such as a
search grid area or storm track boundary edge. Have the random
walk occur within that boundary,… back and forth from boundary
edge to boundary edge. Like a pseudo random pendulum.

Still new at this, was something I was musing over. Got me
wondering about the possibility of applying that here.

-Partev

Hi Stefan,

If you just want to avoid consecutive same value of kIndex, the updated instr1 below can do it.
It calls StefansRandomWalk again when the created kIndex is equal to the last value of it.

instr 1
iLowestIndx = 0 ; xin
iHighestIndx = lenarray(gihalbton)-1
iHighestIndx = 10 ; xin
  ;set pitch startpoint, deviation range and the first direction
iStartIndx = 5 ; xin
iIndxDev = 2 ;xin, random range for next pitch
iIndxDir = 1 ;xin positive = upwards
iwieoft = 3

kIndx_last init 0 ;<====== added

kmetro metro iwieoft
if kmetro ==1 then
getkindex: ;<====== added
kIndx StefansRandomWalk iLowestIndx,iHighestIndx,iStartIndx,iIndxDev,iIndxDir
;kIndx = int(kIndx)

ckgoto (kIndx == kIndx_last), getkindex ;<====== added

kcps = gihalbton[kIndx]
endif
imintim = 0 ; wenn der Wert größer ist gibts pausen zwischen den Einsätzen
imaxnum = 0
insnum = 2
iwhen = 0

kdur random 0.1,0.5 ;,iwieoft
kamp random -6,-3 ;,8 ;,iwieoft

schedkwhen kmetro, imintim, imaxnum, insnum, iwhen, kdur,kcps,kamp
printk 1/iwieoft,kIndx
;printk 1/iwieoft,kamp

kIndx_last = kIndx ;<====== added
endin

Best,
Tetsuya

2021/03/01 19:38、Stefan Thomas <kontrapunktstefan@gmail.com>のメール:

Dear community,
I've made a mistake with the opcode.
My code is:
opcode StefansRandomWalk,k,iiiii
iLowestIndx,iHighestIndx,iStartIndx,indxDevRange,iDevDir xin
kIndxDevRange init indxDevRange
kDevDir init iDevDir
kIndx init iStartIndx
kLowIndxBound = kDevDir < 0 ? -kIndxDevRange+kDevDir : -kIndxDevRange
kHighIndxBound = kDevDir > 0 ? kIndxDevRange+kDevDir : kIndxDevRange
kIndxRnd random kLowIndxBound, kHighIndxBound
kIndxRnd = int(kIndxRnd)
   ;add to current pitch
kIndx += kIndxRnd
  ;change direction if maxima are crossed, and report
  if kIndx = iHighestIndx && kDevDir > 0 then
kDevDir = -kDevDir
  elseif kIndx = iLowestIndx && kDevDir < 0 then
kDevDir = -kDevDir
  endif
kIndx limit kIndx,iLowestIndx,iHighestIndx
xout kIndx
endop

Dear community,
I've written an udo for an random walk, inspired by The Csound FLOSS Manual (example 9).
I would like to modify the udo in that way that repetitions of the same index could be prevented, but I don't know how to do this.
Does someone have a hint for me?
That' my code:
%%%%%%%%% SNIPPET%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CsoundSynthesizer>
<CsOptions>
-odac -m0d
</CsOptions>
; ==============================================
<CsInstruments>

sr = 44100
;ksmps = 100
nchnls = 2
0dbfs = 1
seed 0
;iNumbers ftgen 0,0,16,-2,0,110,22

gihalbton[ ] fillarray 220.0, 233.08, 246.94, 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.0, 415.3, 440.0, 466.16, 493.88, 523.25, 554.37, 587.33

opcode StefansRandomWalk,k,iiiii
iLowestIndx,iHighestIndx,iStartIndx,indxDevRange,iDevDir xin
kIndxDevRange init indxDevRange
kDevDir init iDevDir
kIndx init iStartIndx
kLowIndxBound = kDevDir < 0 ? -kIndxDevRange+kDevDir : -kIndxDevRange
kHighIndxBound = kDevDir > 0 ? kIndxDevRange+kDevDir : kIndxDevRange
   ;get random value in these boundaries

   ;add to current pitch
kIndx += kIndxRnd ;
  ;change direction if maxima are crossed, and report
  if kIndx = iHighestIndx && kDevDir > 0 then
kDevDir = -kDevDir
  elseif kIndx = iLowestIndx && kDevDir < 0 then
kDevDir = -kDevDir
  endif
kIndx limit kIndx,iLowestIndx,iHighestIndx
xout kIndx
endop

instr 1
iLowestIndx = 0 ; xin
iHighestIndx = lenarray(gihalbton)-1
iHighestIndx = 10 ; xin
  ;set pitch startpoint, deviation range and the first direction
iStartIndx = 5 ; xin
iIndxDev = 2 ;xin, random range for next pitch
iIndxDir = 1 ;xin positive = upwards
iwieoft = 3
kmetro metro iwieoft
if kmetro ==1 then
kIndx StefansRandomWalk iLowestIndx,iHighestIndx,iStartIndx,iIndxDev,iIndxDir
;kIndx = int(kIndx)

kcps = gihalbton[kIndx]
endif
imintim = 0 ; wenn der Wert größer ist gibts pausen zwischen den Einsätzen
imaxnum = 0
insnum = 2
iwhen = 0

kdur random 0.1,0.5 ;,iwieoft
kamp random -6,-3 ;,8 ;,iwieoft

schedkwhen kmetro, imintim, imaxnum, insnum, iwhen, kdur,kcps,kamp
printk 1/iwieoft,kIndx
;printk 1/iwieoft,kamp
endin

instr 2
icps = p4
iamp = ampdb(p5); random 0.1,0.5
iein = 0.01
idur = p3-iein
kenv linseg 0,iein,1,idur,0
asine poscil kenv*iamp,icps
outs asine,asine

endin
</CsInstruments>
; ==============================================
<CsScore>
i1 0 60

</CsScore>
</CsoundSynthesizer>
%%%%%%%%%%%%%%%% SNIPPET END %%%%%%%%%%%%%%%%%%%%%%
Thank You,
Stefan

Csound mailing list Csound@listserv.heanet.ie LISTSERV 16.5 - CSOUND List at LISTSERV.HEANET.IE Send bugs reports to Issues · csound/csound · GitHub Discussions of bugs and features can be posted here

Csound mailing list
Csound@listserv.heanet.ie
https://listserv.heanet.ie/cgi-bin/wa?A0=CSOUND
Send bugs reports to
        Issues · csound/csound · GitHub
Discussions of bugs and features can be posted here

Dear Tetsua,
thanks for Your help!
I will try the code as soon as possible!

Best,
Stefan