-i adc -o dac -d -m0
;example written by Joachim Heintz
sr = 44100
ksmps = 32
nchnls = 1
0dbfs = 1
opcode BufCrt1, i, io
ilen, inum xin
ift ftgen inum, 0, -(ilen*sr), 2, 0
xout ift
endop
opcode BufRec1, 0, aik
ain, ift, krec xin
setksmps 1
imaxindx = ftlen(ift)-1 ;max index to write
knew changed krec
if krec == 1 then ;record as long as krec=1
if knew == 1 then ;reset index if restarted
kndx = 0
endif
kndx = (kndx > imaxindx ? imaxindx : kndx)
andx = kndx
tabw ain, andx, ift
kndx = kndx+1
endif
endop
opcode BufPlay1, a, ik
ift, kplay xin
setksmps 1
imaxindx = ftlen(ift)-1 ;max index to read
knew changed kplay
if kplay == 1 then ;play as long as kplay=1
if knew == 1 then ;reset index if restarted
kndx = 0
endif
kndx = (kndx > imaxindx ? imaxindx : kndx)
andx = kndx
aout tab andx, ift
kndx = kndx+1
endif
xout aout
endop
opcode KeyStay, k, kkk
;returns 1 as long as a certain key is pressed
key, k0, kascii xin ;ascii code of the key (e.g. 32 for space)
kprev init 0 ;previous key value
kout = (key == kascii || (key == -1 && kprev == kascii) ? 1 : 0)
kprev = (key > 0 ? key : kprev)
kprev = (kprev == key && k0 == 0 ? 0 : kprev)
xout kout
endop
opcode KeyStay2, kk, kk
;combines two KeyStay UDO's (this way is necessary
;because just one sensekey opcode is possible in an orchestra)
kasci1, kasci2 xin ;two ascii codes as input
key,k0 sensekey
kout1 KeyStay key, k0, kasci1
kout2 KeyStay key, k0, kasci2
xout kout1, kout2
endop
instr 1
ain inch 1 ;audio input on channel 1
iBuf BufCrt1 3 ;buffer for 3 seconds of recording
kRec,kPlay KeyStay2 114, 112 ;define keys for record and play
BufRec1 ain, iBuf, kRec ;record if kRec=1
aout BufPlay1 iBuf, kPlay ;play if kPlay=1
out aout ;send out
endin
i 1 0 1000