guitar delay

Algorithm development and general DSP issues

Moderator: frank

direct
Posts: 8
Joined: Sun Mar 10, 2013 1:19 pm

guitar delay

Post by direct »

Hello, everybody!
Has the program who can provide the use of a guitar delay
frank
Posts: 1244
Joined: Wed Oct 19, 2005 12:26 pm
Contact:

Post by frank »

Frank Thomson
Experimental Noize
direct
Posts: 8
Joined: Sun Mar 10, 2013 1:19 pm

Post by direct »

Thank frank! I test this code, there is a problem, feedback twist to the maximum and delay time twist to the minimum, the voice of self-oscillation.

I also want to learn in this code to write, now do not quite understand what the feedback is how computing processing
direct
Posts: 8
Joined: Sun Mar 10, 2013 1:19 pm

Post by direct »

;get address pointer from pot1:

rdax pot1,1
and %01111110_00000000_00000000 ;don't make jumps too small
sof 61/64,3/64 ;50 ms to 1 second
wrax addr_ptr,0

;get output from delay:

rmpa 1
wrax dout,0

;put input signals into delay, allowing for feedback:

rdax dout,1
mulx kfbk
rdax adcl,0.5
rdax adcr,0.5
wra del,0

rmpa 1 Here from the location specified by the address pointer read out the value of the delay, or delay time value?
mulx kfbk Multiplied by the feedback coefficient is actually how to achieve feedback?
direct
Posts: 8
Joined: Sun Mar 10, 2013 1:19 pm

Post by direct »

There is also a concept is not too clear, not all code execution time deal only with the first sampling point
frank
Posts: 1244
Joined: Wed Oct 19, 2005 12:26 pm
Contact:

Post by frank »

Basically, the program calculates a pointer into memory based on POT 1, this value is placed in addr_ptr then rmpa reads from the memory address pointed to by addr_ptr and places the value in acc. It is then written to dout.

dout is then read back into acc, multiplied by kfbk (which is just the pot 0 value) and the inputs from left and right are added. it is then written to the head of the delay. It is then mixed with the dry signal and written to the outputs.

The best way to understand this is to read each line of the code, remember that in almost all instructions the result goes into the acc and see what each instruction does.
Frank Thomson
Experimental Noize
direct
Posts: 8
Joined: Sun Mar 10, 2013 1:19 pm

Post by direct »

Thank
luk
Posts: 5
Joined: Mon Oct 13, 2014 1:47 am

Post by luk »

Hi, I tried this code but ther's a problem. It work but when I change widely the delay time with the pot i hear noise/pitch.
Is there any way to avoid hearing that?
Thank you
frank
Posts: 1244
Joined: Wed Oct 19, 2005 12:26 pm
Contact:

Post by frank »

Not really, you are changing the delay length real time so there will be some noise/pitching happening.
Frank Thomson
Experimental Noize
luk
Posts: 5
Joined: Mon Oct 13, 2014 1:47 am

Post by luk »

Many thanks frank
luk
Posts: 5
Joined: Mon Oct 13, 2014 1:47 am

Post by luk »

I Frank, I tried to solve the pitch problem.
I implemented a counter to verify that the delay time remains unchanged for some time before setting the delay time. But it don't work :(
The guitar signal does not pass.
Maybe you can help me.

Code: Select all

;DELAY
;pot0 = delay time
;pot1 = feedback
;
mem delay 32767	;delay a 32768 campioni (max memoria)
;
equ	dt 	  reg0	;delay time
equ	fb 	  reg1	;feedback
equ	filt_pot0	  reg2
equ	delay_out	  reg3
equ	temp_reg	  reg4
equ	lpf	  reg5
equ	cont	  reg6	; counter
equ	temp_time  reg7	; current delay time 
;
equ	smooth	  0.05
equ	freq	          0.1
equ	iniz_cont	  0.999
equ	kdecr	  1/40000
;

skp	RUN, start
rdax	cont,1		; inizialize counter to 1
sof	0, iniz_cont
wrax	cont, 0
wrax	delay_out, 0	; inizialize to 0

start:
rdax	adcl, 1	; read and save input
wra	delay, 0	
;
; FEEDBACK
wrax	fb, 0
rdax	pot1, 1	;save pot feedback into fb
wrax	fb, 0
;
rdax	delay_out,1	;save last time value in to a temporary register
wrax	temp_time,0

; DELAY
loop:
rdax	pot0, 1
and	%01111110_00000000_00000000	;resolution, discretize
sof	0.9, 0.1				; delay 50-1000ms
rdfx	filt_pot0, smooth			; smoothing pot filter
wrax	filt_pot0, 1
wrax	addr_ptr, 0			; save into pointer
;
; DELAY OUT
rmpa	1		; read pointer
wrax	delay_out, 1	; save delay time, keep into ACC

; COUNTER
rdax	temp_time, 1	; load last delay time
skp	zrc, end		; PACC != ACC ?  YES-> goto end  NO-> continue
rdax	cont, 1		; decrements the counter
sof	1, -kdecr		; (wait 40000 cycles)
wrax	cont, 1		; save new counter value
skp	gez, end		; if cont >= 0 goto end
rdax	cont,1		; re-inizialize counter to 1 for the next wait
sof	0, iniz_cont
;
; MIX DELAY - FEEDBACK
rdax	delay_out,1
mulx	fb
;
; FILTRO OUT  this is a tape echo simulation
wrax	dacl,1
wrax	temp_reg, 1
rdfx	lpf, freq
wrlx	lpf, -1
rdax	temp_reg, -1
mulx	pot2
rdax	temp_reg, 1
wrax	fb, -0.9
end:
Thanks
luk
Posts: 5
Joined: Mon Oct 13, 2014 1:47 am

Post by luk »

dencrease costant was too small, i replace it with 1/400 but it doesn't work.
I hear a strange "bump" echo :?
frank
Posts: 1244
Joined: Wed Oct 19, 2005 12:26 pm
Contact:

Post by frank »

If you are suddenly jumping from one point to another then you will get a discontinuity in the signal and it will have a "pop" in the sound and since there is feedback this pop will continue for some time. There is really no simple solution to not having some audio artifact when changing a delay real time.
Frank Thomson
Experimental Noize
luk
Posts: 5
Joined: Mon Oct 13, 2014 1:47 am

Post by luk »

ok Frank, thank you
MacroMachines
Posts: 71
Joined: Fri Dec 12, 2014 10:45 pm
Location: Detroit,MI
Contact:

Post by MacroMachines »

there may not be a simple solution to click removal but I just tested one that should be possible in the FV-1. I used the previous time != current time (checking if it changed) to trigger a very short sub 1ms attack/decay envelope controlling the amplitude of the feedback.

Im going to try this in FV-1 now and see if I can get it, if anyone has a triggered envelope code bit it would be hugely helpful, but I might get it.
http://MacroMachines.net
Digital Control for your Analog Soul.
Post Reply