packages feed

csound-expression-typed-0.2.3.1: data/opcodes/AmbiRow.udo

; plays wav-files in row
;
; > al, ar AmbiRow Sfiles, kSpeed, kUserIndex, iFadeTime
opcode AmbiRow, aa, S[]kki

Sfiles[], kSpeed, kUserIndex, iFadeTime xin
kNext init 0
iSize lenarray Sfiles

kEnvPoints init 0

kenv linseg 0, iFadeTime, 1, 1, 1
kUserIndex = floor(kUserIndex)
aLeft init 0
aRight init 0

kTrig changed kUserIndex
kTrigChange delayk kTrig, iFadeTime
kLoad init 1
kTrigChange = kTrigChange + kLoad

kSkipFirst linseg 1, 0.1, 1, 0.1, 0, iFadeTime + 0.1, 0, 0.1, 1
kTrigChange = kTrigChange * kSkipFirst

if (kTrig == 1) && (kNext != kUserIndex) then
  ;printks "Fade out: %d\n", 0.001, kUserIndex
  kNext = kUserIndex
  kEnvPoints = 0
  ; timout 0, iFadeTime, fade_out
  ;reinit fade_out
endif

if kTrigChange == 1 then
  ;printks "Change: %d\n", 0.001, kUserIndex
  kEnvPoints = 1
  reinit load_file
  kLoad = 0
endif

kEnv2 portk kEnvPoints, iFadeTime * 0.5

xout kEnv2 * aLeft, kEnv2 * aRight

fade_out:
  ;prints "Do fade\n", 0.001
  kenv linseg 1, iFadeTime, 0, 1, 0
  ; rireturn

load_file:
  kenv linseg 0, iFadeTime, 1, 1, 1
  ;prints "Do load: %d\n", 0.001, kNext
  iIndex = i(kNext)
  if (iIndex >= 0) && (iIndex < iSize) then
    Sfile = Sfiles[iIndex]
    iStop = 0
  else
    iStop = 1
  endif

  if iStop == 0 then
    aLeft, aRight diskin2 Sfile, kSpeed
  else
    aLeft = 0
    aRight = 0
  endif
  rireturn

endop