Faux phase shifter

Algorithm development and general DSP issues

Moderator: frank

Post Reply
Digital Larry
Posts: 338
Joined: Mon Nov 12, 2012 1:12 pm
Contact:

Faux phase shifter

Post by Digital Larry »

This one kinda sounds like a phaser but in fact it is not one, strictly speaking. It is built up from resonant high pass and low pass filters mixed together. One is driven from the Sin output of the LFO and the other is driven from the Cos, which gives an interesting but subtle twist. The delay feedback goes around the highpass filter only.

Pot0 = LFO speed/width
Pot1 = multi-tap delay time
Pot2 = multi-tap delay feedback

Code: Select all

;  Program: Render Block exported from SpinCAD Designer
;------ Input
;------ Pot 0
;------ Scale/Offset
RDAX POT0,1.0000000000
SOF -0.5700000000,0.9700000000
WRAX REG0,0.0000000000
;------ LFO 0
SKP RUN ,1
WLDS 0,85,32767
RDAX POT0,0.1663405088
WRAX SIN0_RATE,0.0000000000
RDAX REG0,1.0000000000
WRAX SIN0_RANGE,0.0000000000
CHO RDAL,0
SOF 0.5000000000,0.5000000000
WRAX REG1,0.0000000000
CHO RDAL,8
SOF 0.5000000000,0.5000000000
WRAX REG2,0.0000000000
;------ Pot 1
;------ Pot 2
;------ Scale/Offset
RDAX REG1,1.0000000000
SOF 0.1800000000,0.5800000000
WRAX REG3,0.0000000000
;------ Scale/Offset
RDAX REG2,1.0000000000
SOF 0.3300000000,0.4500000000
WRAX REG4,0.0000000000
;------ Feedback Output
;------ Mixer 2-1
RDAX ADCL,0.2500000000
WRAX REG6,0.0000000000
RDAX REG5,0.5000000000
MULX POT2
RDAX REG6,1.0000000000
WRAX REG6,0.0000000000
;------ 2 pole high pass
SKP RUN ,3
CLR
WRAX REG9,0.0000000000
WRAX REG10,0.0000000000
RDAX REG3,1.0000000000
SOF 0.5000000000,-0.5000000000
EXP 1.0,0.0
WRAX REG7,0.0000000000
RDAX REG3,1.0000000000
SOF 1.0000000000,-0.9990000000
EXP 1.0,0.0
WRAX REG8,0.0000000000
RDAX REG9,1.0000000000
MULX REG7
RDAX REG10,1.0000000000
WRAX REG10,-1.0000000000
RDAX REG9,-0.2000000000
RDAX REG6,1.0000000000
WRAX REG11,1.0000000000
MULX REG7
RDAX REG9,1.0000000000
WRAX REG9,0.0000000000
;------ 2 pole low pass
RDAX REG4,1.0000000000
SOF 0.3500000000,-0.3500000000
EXP 1.0,0.0
WRAX REG12,0.0000000000
RDAX REG4,1.0000000000
SOF 1.0000000000,-0.9990000000
EXP 1.0,0.0
WRAX REG13,0.0000000000
RDAX REG15,1.0000000000
MULX REG12
RDAX REG14,1.0000000000
WRAX REG14,-1.0000000000
RDAX REG15,-0.4000000000
RDAX ADCL,0.2500000000
MULX REG12
RDAX REG15,1.0000000000
WRAX REG15,0.0000000000
;------ Mixer 2-1
RDAX REG15,0.5000000000
WRAX REG18,0.0000000000
RDAX REG11,0.5000000000
RDAX REG18,1.0000000000
WRAX REG18,0.0000000000
;------ MN3011a
RDAX REG18,0.4500000000
WRA 0,0.0
CLR
OR $007FFF00
MULX POT1
WRAX REG20,0.0000000000
SOF 0.1130374160,0.0059798553
WRAX ADDR_PTR,0.0000000000
RMPA 0.5
WRAX REG19,0.0000000000
RDAX REG20,1.0000000000
SOF 0.1889665886,0.0099761275
WRAX ADDR_PTR,0.0000000000
RMPA 0.5
RDAX REG19,1.0000000000
WRAX REG19,0.0000000000
RDAX REG20,1.0000000000
SOF 0.3408249346,0.0179686720
WRAX ADDR_PTR,0.0000000000
RMPA 0.5
RDAX REG19,1.0000000000
WRAX REG19,0.0000000000
RDAX REG20,1.0000000000
SOF 0.4926832816,0.0259612166
WRAX ADDR_PTR,0.0000000000
RMPA 0.5
RDAX REG19,1.0000000000
WRAX REG19,0.0000000000
RDAX REG20,1.0000000000
SOF 0.7963999738,0.0419463057
WRAX ADDR_PTR,0.0000000000
RMPA 0.5
RDAX REG19,1.0000000000
WRAX REG19,0.0000000000
RDAX REG20,1.0000000000
SOF 0.9499710083,0.0500289917
WRAX ADDR_PTR,0.0000000000
RMPA 0.5
RDAX REG19,1.0000000000
WRAX REG19,0.0000000000
RDA 32767,1.0
WRAX REG21,0.0000000000
;------ FB In 1
RDAX REG21,1.1200000000
WRAX REG5,0.0000000000
;------ Mixer 2-1
RDAX REG18,0.5000000000
WRAX REG22,0.0000000000
RDAX REG19,0.5000000000
MULX POT2
RDAX REG22,1.0000000000
;------ Gain Boost
SOF -2.0000000000,0.0000000000
SOF -2.0000000000,0.0000000000
;------ Output
WRAX DACL,1.0000000000
WRAX DACR,0.0000000000
Changing the constants in these SOF statements should give you many different "colors" as it will change the position (second parameter), and sweep width (first parameter) of the filters.

Code: Select all

;------ Scale/Offset
RDAX REG1,1.0000000000
SOF 0.1800000000,0.5800000000
WRAX REG3,0.0000000000
;------ Scale/Offset
RDAX REG2,1.0000000000
SOF 0.3300000000,0.4500000000
WRAX REG4,0.0000000000
Last edited by Digital Larry on Wed Sep 10, 2014 6:12 am, edited 1 time in total.
Iconnu
Posts: 10
Joined: Thu Apr 17, 2014 7:49 pm

Post by Iconnu »

Larry,

In the code for the MN3011a you have

MULX POT1
WRAX REG20,0.0000000000
SOF 0.1130374160,0.0059798553
WRAX ADDR_PTR,0.0000000000

The wrax instruction is saving pot1 in reg20 and then clearing the acc. In the sof that comes after the acc = 0.0059798553. Why do you have 0.1130374160 in there rather than 0?

(btw its too early for me to be thinking right now so feel free to chuckle if I'm missing something obvious)
Last edited by Iconnu on Wed Sep 10, 2014 12:18 pm, edited 1 time in total.
Digital Larry
Posts: 338
Joined: Mon Nov 12, 2012 1:12 pm
Contact:

Post by Digital Larry »

Hey Iconnu,

Don't blame it on Frank!

You have exceedingly sharp eyes. You are absolutely correct. You found a bug in the code generation for the MN3011 block. Thanks! :D

REG20 is used to hold the max delay pointer scaled by the control POT1. This value gets re-used for each of 6 taps so it saved a few instructions to store it in a register.

Each SOF that scales the REG20 value prior to a RMPA is accounting for the offset of the MN3011's delay buffer (in this case, 0, as there are no other delay blocks) as well as the length of each tap within that buffer. When Pot1 is 0, I have made the delay be 5% of the max setting for each tap. Just in case you wonder where all the magical values in the SOF statements come from.

It should be:

Code: Select all

MULX POT1 
WRAX REG20,1.0000000000 
Iconnu
Posts: 10
Joined: Thu Apr 17, 2014 7:49 pm

Post by Iconnu »

LOL.....I told you it was way too early for me. I meant "Larry" not "Frank"....sorry Frank. Not your fault.

Yikes....message was edited to correct my mistake
Digital Larry
Posts: 338
Joined: Mon Nov 12, 2012 1:12 pm
Contact:

Post by Digital Larry »

I've been goofing around and trying to optimize this patch. So, I:

Blended in a little fixed low pass filter at the bottom to compensate for the loss of low end by simply using a resonant LPF.
Slowed the maximum rate of the LFO down.
Increased the sweep of the filters.
Changed the MN3011 for a single delay.

Turn the LFO down pretty low, then dial in a good delay time, turn up the feedback, and play some U2 style riffs. This patch works great on both clean and lead channel sounds in the effects loop of my Tech 21 Trademark 60.

Pot0 - LFO speed/width
Pot1 - delay time
Pot2 = delay level/feedback

Code: Select all

;  Program: Render Block exported from SpinCAD Designer
;------ Input
;------ Pot 0
;------ Scale/Offset
RDAX POT0,1.0000000000
SOF -0.4100000000,0.8700000000
WRAX REG0,0.0000000000
;------ LFO 0
SKP RUN ,1
WLDS 0,25,32767
RDAX POT0,0.0489236791
WRAX SIN0_RATE,0.0000000000
RDAX REG0,1.0000000000
WRAX SIN0_RANGE,0.0000000000
CHO RDAL,0
SOF 0.5000000000,0.5000000000
WRAX REG1,0.0000000000
CHO RDAL,8
SOF 0.5000000000,0.5000000000
WRAX REG2,0.0000000000
;------ SVF 2P
SOF 0.0000000000,0.0000000000
RDAX ADCL,1.0000000000
RDAX REG5,-1.0000000000
RDAX REG4,-0.3333333333
WRAX REG3,0.0352742389
RDAX REG4,1.0000000000
WRAX REG4,0.0352742389
RDAX REG5,1.0000000000
WRAX REG5,0.0000000000
;------ Scale/Offset
RDAX REG2,1.0000000000
SOF 0.5200000000,0.3100000000
WRAX REG6,0.0000000000
;------ 2 pole low pass
RDAX REG6,1.0000000000
SOF 0.3500000000,-0.3500000000
EXP 1.0,0.0
WRAX REG7,0.0000000000
RDAX REG6,1.0000000000
SOF 1.0000000000,-0.9990000000
EXP 1.0,0.0
WRAX REG8,0.0000000000
RDAX REG10,1.0000000000
MULX REG7
RDAX REG9,1.0000000000
WRAX REG9,-1.0000000000
RDAX REG10,-0.4000000000
RDAX ADCL,0.2500000000
MULX REG7
RDAX REG10,1.0000000000
WRAX REG10,0.0000000000
;------ Pot 1
;------ Pot 2
;------ Scale/Offset
RDAX REG1,1.0000000000
SOF 0.3500000000,0.4800000000
WRAX REG13,0.0000000000
;------ Feedback Output
;------ Mixer 2-1
RDAX ADCL,0.2500000000
WRAX REG15,0.0000000000
RDAX REG14,0.5000000000
MULX POT2
RDAX REG15,1.0000000000
WRAX REG15,0.0000000000
;------ 2 pole high pass
SKP RUN ,3
CLR
WRAX REG18,0.0000000000
WRAX REG19,0.0000000000
RDAX REG13,1.0000000000
SOF 0.5000000000,-0.5000000000
EXP 1.0,0.0
WRAX REG16,0.0000000000
RDAX REG13,1.0000000000
SOF 1.0000000000,-0.9990000000
EXP 1.0,0.0
WRAX REG17,0.0000000000
RDAX REG18,1.0000000000
MULX REG16
RDAX REG19,1.0000000000
WRAX REG19,-1.0000000000
RDAX REG18,-0.2000000000
RDAX REG15,1.0000000000
WRAX REG20,1.0000000000
MULX REG16
RDAX REG18,1.0000000000
WRAX REG18,0.0000000000
;------ Mixer 2-1
RDAX REG10,0.5000000000
WRAX REG21,0.0000000000
RDAX REG20,0.5000000000
RDAX REG21,1.0000000000
WRAX REG21,0.0000000000
;------ Servo Delay
RDAX REG21,1.0000000000
WRA 0,0.0
CLR
OR $007FFF00
MULX POT1
RDFX REG23,0.0012500000
WRAX REG23,1.0000000000
SOF 0.2500000000,0.0000305176
WRAX ADDR_PTR,0.0000000000
RMPA 1.0
WRAX REG22,0.0000000000
;------ Mixer 3-1
RDAX REG5,0.0700000000
WRAX REG24,0.0000000000
RDAX REG21,0.3333333333
RDAX REG24,1.0000000000
WRAX REG24,0.0000000000
RDAX REG22,0.3333333333
MULX POT2
RDAX REG24,1.0000000000
WRAX REG24,0.0000000000
;------ FB In 1
RDAX REG22,1.1200000000
WRAX REG14,0.0000000000
;------ Gain Boost
RDAX REG24,1.0000000000
SOF -2.0000000000,0.0000000000
SOF -2.0000000000,0.0000000000
WRAX REG25,0.0000000000
;------ Output
RDAX REG25,1.0000000000
WRAX DACL,0.0000000000
RDAX REG25,1.0000000000
WRAX DACR,0.0000000000
Here's a variation that adds another delay to the resonant low pass. I had to make the output left channel only to save a few instructions.

Code: Select all

;  Program: Render Block exported from SpinCAD Designer
;------ Input
;------ Pot 0
;------ Scale/Offset
RDAX POT0,1.0000000000
SOF -0.4100000000,0.8700000000
WRAX REG0,0.0000000000
;------ LFO 0
SKP RUN ,1
WLDS 0,25,32767
RDAX POT0,0.0489236791
WRAX SIN0_RATE,0.0000000000
RDAX REG0,1.0000000000
WRAX SIN0_RANGE,0.0000000000
CHO RDAL,0
SOF 0.5000000000,0.5000000000
WRAX REG1,0.0000000000
CHO RDAL,8
SOF 0.5000000000,0.5000000000
WRAX REG2,0.0000000000
;------ SVF 2P
SOF 0.0000000000,0.0000000000
RDAX ADCL,1.0000000000
RDAX REG5,-1.0000000000
RDAX REG4,-0.3333333333
WRAX REG3,0.0352742389
RDAX REG4,1.0000000000
WRAX REG4,0.0352742389
RDAX REG5,1.0000000000
WRAX REG5,0.0000000000
;------ Feedback Output
;------ Pot 1
;------ Feedback Output
;------ Scale/Offset
RDAX REG2,1.0000000000
SOF 0.5200000000,0.3100000000
WRAX REG8,0.0000000000
;------ Mixer 2-1
RDAX ADCL,0.5000000000
WRAX REG9,0.0000000000
RDAX REG7,0.5000000000
RDAX REG9,1.0000000000
WRAX REG9,0.0000000000
;------ Pot 2
;------ Mixer 2-1
RDAX ADCL,1.0000000000
WRAX REG10,0.0000000000
RDAX REG6,1.0000000000
MULX POT2
RDAX REG10,1.0000000000
WRAX REG10,0.0000000000
;------ Scale/Offset
RDAX REG1,1.0000000000
SOF 0.3500000000,0.4800000000
WRAX REG11,0.0000000000
;------ 2 pole high pass
SKP RUN ,3
CLR
WRAX REG14,0.0000000000
WRAX REG15,0.0000000000
RDAX REG11,1.0000000000
SOF 0.5000000000,-0.5000000000
EXP 1.0,0.0
WRAX REG12,0.0000000000
RDAX REG11,1.0000000000
SOF 1.0000000000,-0.9990000000
EXP 1.0,0.0
WRAX REG13,0.0000000000
RDAX REG14,1.0000000000
MULX REG12
RDAX REG15,1.0000000000
WRAX REG15,-1.0000000000
RDAX REG14,-0.2000000000
RDAX REG9,1.0000000000
WRAX REG16,1.0000000000
MULX REG12
RDAX REG14,1.0000000000
WRAX REG14,0.0000000000
;------ 2 pole low pass
RDAX REG8,1.0000000000
SOF 0.3500000000,-0.3500000000
EXP 1.0,0.0
WRAX REG17,0.0000000000
RDAX REG8,1.0000000000
SOF 1.0000000000,-0.9990000000
EXP 1.0,0.0
WRAX REG18,0.0000000000
RDAX REG20,1.0000000000
MULX REG17
RDAX REG19,1.0000000000
WRAX REG19,-1.0000000000
RDAX REG20,-0.4000000000
RDAX REG10,0.2500000000
MULX REG17
RDAX REG20,1.0000000000
WRAX REG20,0.0000000000
;------ Servo Delay
RDAX REG16,1.0000000000
WRA 0,0.0
CLR
OR $007FFF00
MULX POT1
RDFX REG24,0.0012500000
WRAX REG24,1.0000000000
SOF 0.5239868164,0.0000305176
WRAX ADDR_PTR,0.0000000000
RMPA 1.0
WRAX REG23,0.0000000000
;------ Mixer 2-1
RDAX REG20,1.0000000000
WRAX REG25,0.0000000000
RDAX REG16,0.5000000000
RDAX REG25,1.0000000000
WRAX REG25,0.0000000000
;------ FB In 2
RDAX REG23,-0.0800000000
WRAX REG7,0.0000000000
;------ Servo Delay
RDAX REG20,1.0000000000
WRA 17171,0.0
CLR
OR $007FFF00
MULX POT1
RDFX REG27,0.0012500000
WRAX REG27,1.0000000000
SOF 0.2500000000,0.5240173340
WRAX ADDR_PTR,0.0000000000
RMPA 1.0
WRAX REG26,0.0000000000
;------ Mixer 4-1
RDAX REG5,0.2500000000
WRAX REG28,0.0000000000
RDAX REG25,0.2500000000
RDAX REG28,1.0000000000
WRAX REG28,0.0000000000
RDAX REG23,0.2500000000
MULX POT2
RDAX REG28,1.0000000000
WRAX REG28,0.0000000000
RDAX REG26,0.2500000000
MULX POT2
RDAX REG28,1.0000000000
WRAX REG28,0.0000000000
;------ FB In 1
RDAX REG26,1.9000000000
WRAX REG6,0.0000000000
;------ Gain Boost
RDAX REG28,1.0000000000
SOF -2.0000000000,0.0000000000
SOF -2.0000000000,0.0000000000
WRAX DACL,0.0000000000
Post Reply