Changing Hall Reverb size

Algorithm development and general DSP issues

Moderator: frank

Post Reply
micahvdm
Posts: 7
Joined: Tue Sep 09, 2014 9:15 am

Changing Hall Reverb size

Post by micahvdm »

Hi all,

Long time lurker, first post.
I'm wanting to increase the size of the hall reverb below, would that be accomplished by changing "idel" and the tap points, or is there more to it than that?
Any help would be appreciated!

Code: Select all

;Hall.

;Pot0 = reverb damping
;Pot1 = reverb level
;Pot2 = reverb time

mem	idel	8000	;initial sound space
mem	iap0	31
mem	iap1	47
mem	iap2	73
mem	iap3	171
mem	iap4	196
mem	iap5	371
mem	iap6	496	;thickening all passes imbeded in intial delay

mem	ap1	234
mem	ap2	356
mem	ap3	962
mem	ap4	1263	;reverb loop input all passes

mem	lap1a	1921
mem	lap1b	2645
mem	d1	3534
mem	lap2a	2294
mem	lap2b	2767
mem	d2	3745	;loop constants

;write-first registers:

equ	dry	reg0
equ	kirt	reg1	;coefficint to scale initial sound
equ	krt	reg2	;coefficient to affect RT of loop
equ	apout	reg3	;output of loop input all passes
equ	kd	reg4	;damping coefficient (for shelving)
equ	temp	reg5	;temp register for filter routines
equ	gain	reg6	;adjust gain with RT
equ	revoutl	reg7
equ	revoutr	reg8

;read-first registers:

equ	lf1	reg20	;reverb loop filter 1
equ	lf2	reg21	;reverb loop filter 2
equ	hf1	reg22	;loop high pass 1 (fixed)
equ	hf2	reg23	;loop high pass 2 (fixed)
equ	lfin2	reg25	;LPF for imbedding in intial delay
equ	lf	reg26	;input low pass (shelving with kd)

;clear read-first registers, setup lfo:

skp	run,endclr
wrax	lf1,0
wrax	lf2,0
wrax	hf1,0
wrax	hf2,0
wrax	lfin2,0
wlds	sin0,20,100
endclr:

;initial sound tap positions (30.5uS/location, 100=3.05mS):

equ	ld1	2074	;first tap, left
equ	rd1	2174	;first tap, right
equ	ld2	3556	;and so on...
equ	rd2	3962
equ	ld3	3345
equ	rd3	3121
equ	ld4	3656
equ	rd4	3453
equ	ld5	5121
equ	rd5	5624
equ	ld6	6579
equ	rd6	7940

;prepare decay pot:

rdax	pot2,0.97		;get pot, limit to less than infinite
wrax	krt,1			;write loop decay time
sof	0.4,0.6			;scale to 0.6 to 1.0
wrax	kirt,0			;write impulse filter gains
sof	-1,0.99			;scale to decrease gain with RT
wrax	gain,0			;write gain factor

;prepare damping pot:

rdax	pot0,-1
wrax	kd,0			;increases shelf to -1 (infinite loss)

;do inputs to predelay:

rdax	adcl,0.5
rdax	adcr,0.5		;get inputs
mulx	gain			;give greater gain to short RT 
wrax	dry,0

;read predelay and write initial response delay:

rdax	dry,0.5
rda	iap0#,0.5
wrap	iap0,-0.5		;complicate input to initial delay
wrax	temp,1
rdfx	lf,0.4
wrhx	lf,-1
mulx	kd
rdax	temp,1			;low pass fiter entire input
wra	idel,0			;write initial sound delay

;complicate initial sound:

rda	idel+500,1
rda	iap1#,0.5
wrap	iap1,-0.5
wra	idel+500,0

rda	idel+1000,1
rda	iap2#,0.5
wrap	iap2,-0.5
wra	idel+1000,0

rda	idel+1500,1
rda	iap3#,0.5
wrap	iap3,-0.5
wra	idel+1500,0

rda	idel+2000,1
rda	iap4#,0.5
wrap	iap4,-0.5
wra	idel+2000,0

rda	idel+2500,1
rda	iap5#,0.5
wrap	iap5,-0.5
wrax	temp,1			;save filter input
rdfx	lfin2,0.3
wrhx	lfin2,-1			;make HP filter
mulx	kd			;multiply by negative shelving coef
rdax	temp,1			;add back input (shelving LPF)
wra	idel+2500,0

rda	idel+3000,1
rda	iap6#,0.5
wrap	iap6,-0.5
wra	idel+3000,0

;do reverb input all passes:

rda	idel,1
rda	ap1#,0.5
wrap	ap1,-0.5
rda	ap2#,0.5
wrap	ap2,-0.5
rda	ap3#,0.5
wrap	ap3,-0.5
rda	ap4#,0.5
wrap	ap4,-0.5
wrax	apout,0

;do reverb loop and sum all outputs:

rda	d2#,1
mulx	krt
rdax	apout,1
rda	lap1a#,0.5
wrap	lap1a,-0.5
rda	lap1b#,0.5
wrap	lap1b,-0.5
wrax	temp,1			;save filter input
rdfx	lf1,0.4
wrhx	lf1,-1			;make HP filter
mulx	kd			;multiply by negative shelving coef
rdax	temp,1			;add back input (shelving LPF)
rdfx	hf1,0.005
wrhx	hf1,-0.5		;roll out lows in loop
wra	d1,0

;rda	idel+ld6,-0.5
;mulx	kirt
;rda	idel+ld5,0.7
;mulx	kirt
;rda	idel+ld4,0.6
;mulx	kirt
;rda	idel+ld3,0.5
;mulx	kirt
;rda	idel+ld2,0.6
;rda	idel+ld1,-0.6
;wrax	revoutl,0

rda	d1#,1
mulx	krt
rdax	apout,1
rda	lap2a#,0.5
wrap	lap2a,-0.5
rda	lap2b#,0.5
wrap	lap2b,-0.5
wrax	temp,1			
rdfx	lf2,0.4
wrhx	lf2,-1			
mulx	kd			
rdax	temp,1	
rdfx	hf2,0.005
wrhx	hf2,-0.5				
wra	d2,1.99
rda	d1,1.99
mulx	pot1
mulx	pot1
wrax	revoutr,0

;rda	idel+rd6,0.6
;mulx	kirt
;rda	idel+rd5,-0.5
;mulx	kirt
;rda	idel+rd4,0.6
;mulx	kirt
;rda	idel+rd3,0.5
;mulx	kirt
;rda	idel+rd2,-0.6
;rda	idel+rd1,0.5
;wrax	dacr,0

;do delay smoothing:

cho	rda,sin0,sin|reg|compc,d1+100
cho	rda,sin0,sin,d1+101
wra	d1+200,0

cho	rda,sin0,cos|reg|compc,d1+100
cho	rda,sin0,cos,d1+101
wra	d1+200,0

;now combine to output

rdax	dry,1
rdax	revoutl,1
rdax	revoutr,1
wrax	dacl,0
micahvdm
Posts: 7
Joined: Tue Sep 09, 2014 9:15 am

Post by micahvdm »

Bump...anyone?
Digital Larry
Posts: 338
Joined: Mon Nov 12, 2012 1:12 pm
Contact:

Post by Digital Larry »

I'm no reverb expert but I can offer some general advice, which is: try it and see. Generally it is a good idea to change just one thing at a time and also keep a copy of the unmodified code handy so you can quickly audition both of them side by side.

The "size" of a reverb is typically determined from the early reflections, so if you push those things further out you are likely to get a subjective impression of increased size.

I also use a percussive sound or a recorded click to audition reverb sounds critically.
seancostello
Posts: 74
Joined: Mon Sep 11, 2006 10:04 pm

Post by seancostello »

Digital Larry wrote: The "size" of a reverb is typically determined from the early reflections, so if you push those things further out you are likely to get a subjective impression of increased size.
This would be my suggestion as well. I would scale up all the mem values associated with the input (idel, iap0, iap1, etc.), as well as all of these values:

Code: Select all

initial sound tap positions (30.5uS/location, 100=3.05mS): 

equ   ld1   2074   ;first tap, left 
equ   rd1   2174   ;first tap, right 
equ   ld2   3556   ;and so on... 
equ   rd2   3962 
equ   ld3   3345 
equ   rd3   3121 
equ   ld4   3656 
equ   rd4   3453 
equ   ld5   5121 
equ   rd5   5624 
equ   ld6   6579 
equ   rd6   7940 
as well as all the rda/wra read/write delay locations in this code:

Code: Select all

;complicate initial sound: 

rda   idel+500,1 
rda   iap1#,0.5 
wrap   iap1,-0.5 
wra   idel+500,0 

rda   idel+1000,1 
rda   iap2#,0.5 
wrap   iap2,-0.5 
wra   idel+1000,0 

rda   idel+1500,1 
rda   iap3#,0.5 
wrap   iap3,-0.5 
wra   idel+1500,0 

rda   idel+2000,1 
rda   iap4#,0.5 
wrap   iap4,-0.5 
wra   idel+2000,0 

rda   idel+2500,1 
rda   iap5#,0.5 
wrap   iap5,-0.5 
wrax   temp,1         ;save filter input 
rdfx   lfin2,0.3 
wrhx   lfin2,-1         ;make HP filter 
mulx   kd         ;multiply by negative shelving coef 
rdax   temp,1         ;add back input (shelving LPF) 
wra   idel+2500,0 
Sean Costello
seancostello
Posts: 74
Joined: Mon Sep 11, 2006 10:04 pm

Post by seancostello »

OK, just took a closer look at the code, and it looks like the tapped early reflections delay line has the output tap code commented out. So, all of the ld1, rd1, etc. values don't actually do anything in this code. The early reflection delay line has several points that are read, diffused with an allpass, and then written back into that same point...and then all that is ignored. The late reverb reads from the beginning of the early reflection delay line, which is at a point before all those allpasses are read from/written into that delay line.

I tried uncommenting the output tap code, and the code wouldn't run, as it exceeded 128 instructions. If I was going to try and make this work, I would see if the input allpasses for the late reverb could be commented out, and take the input for the late reverb from the end of the early reflection delay line. I'm not in front of an FV-1 development platform right now, so I can't verify if this would sound good - the smaller allpasses in the early reflection delay line may not sound as good as the larger allpasses used in the code as it currently stands.
Post Reply