Working on a sequence tremolo

Started by Galego, January 29, 2011, 03:31:51 PM

Previous topic - Next topic

deadastronaut

amazing work man.....so the wah version is a trem/wah then?....or just wah on different freq's..?.
https://www.youtube.com/user/100roberthenry
https://deadastronaut.wixsite.com/effects

chasm reverb/tremshifter/faze filter/abductor II delay/timestream reverb/dreamtime delay/skinwalker hi gain dist/black triangle OD/ nano drums/space patrol fuzz//

Taylor


Galego

#22
Quote from: deadastronaut on February 19, 2011, 06:17:19 PM
amazing work man.....so the wah version is a trem/wah then?....or just wah on different freq's..?.

The wah version is just a wah. Just like the one on beavisaudio's website: http://www.beavisaudio.com/projects/colorsoundwah/index.htm, but instead of having an LFO, i use the PWM output from the PIC.

Here's the still 'uncleaned' schematics, it'll be easier to understand:
Tremolo:
http://img714.imageshack.us/img714/6888/schemtrem.jpg
Wah:
http://img823.imageshack.us/img823/2640/wahschem.jpg

The PIC is a 18F2550, in the tremolo i used a NE5532 opamp, those weird things called RotA and RotB are just components i drew to represent the rotary encoder/switch.

I ended up using a 78L09 instead of a 78L05 regulator on the wah circuit (just the one supplying vcc to the 2N5088). You'll notice the abuse of regulators in these circuits, but it's the way i found to get them to be completely unaffected by what was going on in the digital part of the circuit.

Edit, and the Pxx thingies are the connections between the two boards, i was going to remove them for the clean version.

deadastronaut

Quote from: Galego on February 19, 2011, 06:49:41 PM
Quote from: deadastronaut on February 19, 2011, 06:17:19 PM
amazing work man.....so the wah version is a trem/wah then?....or just wah on different freq's..?.

The wah version is just a wah. Just like the one on beavisaudio's website: http://www.beavisaudio.com/projects/colorsoundwah/index.htm, but instead of having an LFO, i use the PWM output from the PIC.


ahhh gotcha pwm....i tried the colorsound wah..tinkered with it a while...then i breaded the morley wah...seemed a bit cleaner and more range on the wahhhhhy side..

i havent got into pic's yet...no idea when it comes to writing code etc...looks like a cool side of things to get into though!....

i messed around with this, its the morley wah..and trem...havent got round to finishing it yet though..look forward to your soundclips of the pwm wah...nice.
http://www.youtube.com/user/100roberthenry?feature=mhum#p/u/2/SEPIKOnpiNE
https://www.youtube.com/user/100roberthenry
https://deadastronaut.wixsite.com/effects

chasm reverb/tremshifter/faze filter/abductor II delay/timestream reverb/dreamtime delay/skinwalker hi gain dist/black triangle OD/ nano drums/space patrol fuzz//

cloudscapes

elegant design! love how the leds are arranged!

guess I should start looking into rotary encoders  :icon_biggrin:
~~~~~~~~~~~~~~~~~~~~~~
{DIY blog}
{www.dronecloud.org}

Galego

Quote from: cloudscapes on February 19, 2011, 11:30:47 PM
elegant design! love how the leds are arranged!

guess I should start looking into rotary encoders  :icon_biggrin:

Thanks man, your stuff was the inspiration for the idea behind this. :)

And here's a demo video:
http://www.youtube.com/watch?v=g6Nd1IL9GQQ

~arph

Sounds really nice! I'd use knobs without indicators though.. these are confusing  :P

Galego

Quote from: ~arph on February 21, 2011, 03:49:28 AM
Sounds really nice! I'd use knobs without indicators though.. these are confusing  :P

Hehehe, you're right. When i figure out what to do with the looks of the pedals, i'll try to polish that line out of the knobs.

frequencycentral

Really nice, inspiring work, though the use of PIC is beyond me. Love the LEDs.
http://www.frequencycentral.co.uk/

Questo è il fiore del partigiano morto per la libertà!

Galego



I was thinking of using this as the graphic, as in a an hieroglyph kind of thing. Like the plaque in the Voyager probe. Is it clear in explaining how the effect works?

~arph

 ???

I like the little birthday cake in the lower right corner  :D

Galego


rustypinto

Very nice work, i'm a PIC guy myself. If you get into envelope related control, an easy starting place is making the LFO start when it detects a guitar signal. Eg. only do tremolo when I, the user, say so; not when the tremolo is ready to start an LFO cycle. This is something i've seen requested over and over.

And kudos on the nice stacked PCB, those get tricky.
  • SUPPORTER

~arph

Also, I find myself strangely attracted to random waveforms  :icon_eek:

Gurner

If you don't mind outlining, what's the high level programming approach taken with respect to the sequencing?

there's obviously a loop running with presumably time slices/windows (quantization slots?) of say a 16 beat 'bar' to register when a switch has been pressed....but I'm having diffs visioning how to approach that?

Galego

Quote from: Gurner on February 25, 2011, 10:00:25 AM
If you don't mind outlining, what's the high level programming approach taken with respect to the sequencing?

there's obviously a loop running with presumably time slices/windows (quantization slots?) of say a 16 beat 'bar' to register when a switch has been pressed....but I'm having diffs visioning how to approach that?

The main section of the code deals with the switch changes (including the rotary encoders). The Timer2 interrupt calculates the values to output to PWM.
I have an array of 8 bytes that store the depth value for each step.
The waveforms are read from lookup tables. The speed works by staying longer in each step of a wave.

I'll elaborate more when i'm looking at the code later today.

jasperoosthoek

Quote from: Galego on February 25, 2011, 09:31:28 AM


I find the clockwise rotation of the left/middle knob and the anti-clockwise rotation of the icon sequence on the left somewhat confusing. For the rest it looks quite self explanatory.
[DIYStompbox user name]@hotmail.com

Galego

#37
DEFINE OSC 20 'Oscillator at 20Mhz
DEFINE SHIFT_PAUSEUS 50
DEFINE BUTTON_PAUSE 500
OSCCON = $70


include "modedefs.bas"


PORTA = 0
PORTB = 0
PORTC = 0

ledtmp VAR PORTA.0
group0 VAR BYTE
group1 VAR BYTE

pushbtn1 VAR PORTE.3
pushbtn2 VAR PORTC.4

B0 VAR WORD
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE

ledB VAR BYTE
ledA VAR BYTE
ledBold VAR BYTE
ledAold VAR BYTE
valueB VAR BYTE
optionB VAR BYTE
functionA VAR BYTE
numsteps VAR BYTE
stepnum VAR BYTE
stepval VAR BYTE[8]

functionB VAR BYTE

OldA VAR BYTE 'previous state of encoder A bits
NewA VAR BYTE 'Current state of encoder A bits
DirectionA VAR BIT 'Direction of encoder A travel 1=CCW
zza6 VAR NewA.5   'The first bit
zza15 VAR OldA.6 'The second bit

OldB VAR BYTE 'previous state of encoder B bits
NewB VAR BYTE 'Current state of encoder B bits
DirectionB VAR BIT 'Direction of encoder B travel 1=CCW
zzb6 VAR NewB.0   'The first bit
zzb15 VAR OldB.1 'The second bit

RotaryValue VAR WORD
RotaryMin VAR BYTE
RotaryMax VAR BYTE
RotaryStep VAR BYTE
RotaryChange VAR BYTE

counter       VAR WORD
tempo         VAR BYTE
pwmoutput       VAR WORD
pwmtempo VAR BYTE
pwmcounter VAR BYTE
pwmdepth VAR BYTE
pwmdepthcalc VAR BYTE
pwmspeedcount VAR BYTE
pwmwidth VAR BYTE
sine_val        VAR BYTE
scaler          VAR BYTE
scale_step      VAR BYTE
Taps VAR BYTE[4]
TapNumber VAR BYTE
Tap_Timer_On   VAR BIT
Tap_Tempo     VAR BYTE
TapAccum VAR WORD
TapAverage VAR BYTE
i VAR BYTE
j VAR BYTE
slack VAR BYTE
randomval VAR WORD
min_speed VAR BYTE
memstart VAR BYTE
portbtemp VAR BYTE
invert VAR BYTE
result VAR WORD
helper1 VAR WORD
helper2 VAR WORD

UCON.3 = 0 'disable USB so we can use RC4/5 as inputs
UCFG.3 = 1
'CMCON = %00000111
'setup PWM
TRISC.2 = 1
PR2 = $FF
'PR2 = $3F
'CCP1CON = %11001100
CCP1CON = %00001100
CCPR1L = 63

TRISC.2 = 0
PIR1.1 = 0 'Clear flag
PIE1.1 = 1     'TMP2 to PR2 match interrupt enable
IPR1.1 = 1 'TMR2 to PR2 match high priority
T2CON = %00000100
'T2CON.2 = 1   'turn on timer2 prescale=1
'Wait until TMR2 overflows - PIR1 = 1
startuppwm:
if (PIR1 = 0) then goto startuppwm
'Enable CCP1/P1A as output
'TRISC.2 = 0
'Clear the ECCPASE bit ECCPAS<7>
'ECCP1AS.7 = 0
INTCON.6 = 1
INTCON.7 = 1

ADCON0 = 0
ADCON1 = %00000000

tempo = 125
pwmdepth = 255
pwmtempo = 200


Tap_Tempo = 0
Tap_Timer_On = 0
counter = 0
scale_step = 220
Taps[0] = 0
Taps[1] = 1
Taps[2] = 2
Taps[3] = 3
TapNumber = 0
TapAccum = 0
slack = 5
ledA = 0
ledB = 1
functionA = 0
stepnum = 0
numsteps = 7 '0 to 7 - 8 steps
functionB = 2
valueB = 0
optionB = 0
memstart = 0
for i = 0 to 7
stepval[i] = 50
next i


min_speed = 30
TRISA.0 = 0
TRISA.1 = 0
TRISA.2 = 0
TRISA.3 = 0
TRISA.4 = 0
TRISA.5 = 0
TRISB = 0
PORTB = 0
'TRISC = 0
'PORTC = 0
TRISC.0 = 1
TRISC.1 = 1
TRISC.4 = 1
TRISC.5 = 1
TRISC.6 = 1
TRISC.7 = 0

disable
gosub loadpresets
enable

mainloop:
on interrupt goto InterruptEnter




B0 = 0
BUTTON pushbtn1,0,255,0,B0,0,notpressedB0
functionA = functionA + 1
if functionA = 3 then functionA = 0
notpressedB0:
if pushbtn1 = 0 then goto notpressedB0


B1 = 0
BUTTON pushbtn2,0,255,0,B1,0,notpressedB1
if functionA = 0 then
for i = 0 to 7
random randomval
stepval[i] = randomval.byte0
next i
endif
if functionA = 1 then
if invert = 0 then
invert = 1
else
invert = 0
endif
endif
if functionA = 2 then
if optionB < 5 then
functionB = optionB 'set the ramp mode
endif
' if optionB = 5 then 'random steps
' for i = 0 to 7
' random randomval
' stepval[i] = randomval.byte0
' next i
' endif
if optionB = 5 then 'Load presets
disable
gosub loadpresets
enable
endif
if optionB = 6 then 'Save presets
disable
gosub savepresets
enable
endif
endif
notpressedB1:
if pushbtn2 = 0 then goto notpressedB1



select case functionA 'set initial values for each function
case 0
ledA = stepnum
'ledB = 16 - pwmtempo * 7 / 255
result = pwmtempo << 3
result = result - pwmtempo
result = result >> 8
helper1 = 16
result = helper1 - result
ledB = result.byte0
case 1
ledA = stepnum
'ledB = stepval[stepnum] * 6 / 255 + 10
result = stepval[stepnum] << 3
result = result - stepval[stepnum]
result = result >> 8
helper1 = 10
result = helper1 + result
ledB = result.byte0
case 2
'ledB = stepval[stepnum] * 6 / 255 + 10 ' just to make it the same tempo as the others... lol
result = pwmtempo << 3
result = result - pwmtempo
result = result >> 8
helper1 = 16
result = helper1 - result
ledB = result.byte0
if optionB < 5 then
ledA = stepnum
ledB = optionB
else
ledA = valueB
ledB = optionB
endif
end select


select case ledB
case 0
group1 = %00000001
case 1
group1 = %00000010
case 2
group1 = %00000100
case 3
group1 = %00001000
case 4
group1 = %00010000
case 5
group1 = %00100000
case 6
group1 = %01000000
case 10
group1 = %00000001
case 11
group1 = %00000011
case 12
group1 = %00000111
case 13
group1 = %00001111
case 14
group1 = %00011111
case 15
group1 = %00111111
case 16
group1 = %01111111
end select

select case ledA
case 0
group0 = %00000001
case 1
group0 = %00000010
case 2
group0 = %00000100
case 3
group0 = %00001000
case 4
group0 = %00010000
case 5
group0 = %00100000
case 6
group0 = %01000000
case 7
group0 = %10000000
end select

if ledA <> ledAold then
portb = group0
endif
if ledB <> ledBold then
porta = group1 & %00111111
portc.7 = group1.6
endif

OldA = NewA
NewA = PortC & %01100000 'input of porta<7:6>
DirectionA = zza6 ^ zza15
if NewA != OldA then
disable
gosub ChangedA
enable
endif

OldB = NewB
NewB = PortC & %00000011 'input of porta<1:0>
DirectionB = zzb6 ^ zzb15
if NewB != OldB then
disable
gosub ChangedB
enable
endif







'**********************************************************
'*              M A I N L O O P   E N D                   *
'**********************************************************
ledAold = ledA
ledBold = ledB
GOTO mainloop 'back to the beginning

'**********************************************************
'*               S U B R O U T I N E S                    *
'**********************************************************



ChangedA:
if (DirectionA = 1) then
if (NewA = 0) then
select case functionA
case 0
numsteps = numsteps - 1
if numsteps > 7 then numsteps = 0
if stepnum > numsteps then stepnum = 0
case 1
stepnum = stepnum - 1
if stepnum > 7 then stepnum = 0
case 2
if optionB > 4 then
if valueB > 0 then valueB = valueB - 1
endif
end select
endif
else
if (NewA = 0) then
select case functionA
case 0
numsteps = numsteps + 1
if numsteps > 7 then numsteps = 7
if stepnum > numsteps then stepnum = numsteps
case 1
stepnum = stepnum + 1
if stepnum > 7 then stepnum = 7
case 2
if optionB > 4 then
if valueB < 7 then valueB = valueB + 1
endif
end select
endif
endif
return

ChangedB:
if (DirectionB = 1) then
if (NewB = 0) then
select case functionA
case 0
if (pwmtempo <= 250) then
pwmtempo = pwmtempo + 5
else
if (pwmtempo > 250) then pwmtempo = 255
endif
case 1
if (stepval[stepnum] >= 5) then
stepval[stepnum] = stepval[stepnum] - 5
else
if (stepval[stepnum] < 5) then stepval[stepnum] = 0
endif
case 2
if optionB > 0 then optionB = optionB - 1
end select
endif
else
if (NewB = 0) then
select case functionA
case 0
if (pwmtempo >= 5) then
pwmtempo = pwmtempo - 5
else
if (pwmtempo < 5) then pwmtempo = 0
endif
case 1
if (stepval[stepnum] <= 250) then
stepval[stepnum] = stepval[stepnum] + 5
else
if (stepval[stepnum] > 250) then stepval[stepnum] = 255
endif
case 2
if optionB < 6 then optionB = optionB + 1
end select
'mode = mode + 1
'if mode = 8 then mode = 0
endif
endif

return

loadpresets:
memstart = valueB * 20
for i = 0 to 7
read memstart + i, stepval[i]
next i
read memstart + 8 , pwmtempo
read memstart + 9, numsteps
if numsteps > 7 then numsteps = 7
read memstart + 10, functionB
if functionB > 4 then functionB = 0
stepnum = 0
read memstart + 11, invert
if invert > 1 then invert = 0

portb = %00011000
pause 200
portb = %00100100
pause 200
portb = %01000010
pause 200
portb = %10000001
pause 200
portb = %01000010
pause 200
portb = %00100100
pause 200
portb = %00011000
pause 200
portb = group0
ledB = 0
ledA = 0
return

savepresets:
memstart = valueB  * 20
for i = 0 to  7
write memstart + i, stepval[i]
next i
write memstart + 8 , pwmtempo
write memstart + 9, numsteps
write memstart + 10, functionB
write memstart + 11, invert

portb = %00011000
pause 200
portb = %00100100
pause 200
portb = %01000010
pause 200
portb = %10000001
pause 200
portb = %01000010
pause 200
portb = %00100100
pause 200
portb = %00011000
pause 200
portb = group0
return

'**********************************************************
'*         I N T E R R U P T   H A N D L E R              *
'**********************************************************
'Interrupt handler
disable           'no interrupts past this point
InterruptEnter:

if (PIR1.1 = 0) then InterruptExit     'check for end of PWM period




' scaler = scaler + 1
' if (scaler < scale_step) then
' goto pwmcalculation
' else
' scaler = 0
' endif




pwmcalculation:

pwmspeedcount = pwmspeedcount + 1
if (pwmspeedcount < pwmtempo) then
goto InterruptExit
else
pwmspeedcount = 0
endif

if functionA <> 1 then 'if we are in step showing mode
if (pwmcounter = 0) then 'step change
stepnum = stepnum + 1
if stepnum > numsteps then stepnum = 0
endif
endif


pwmcounter = pwmcounter + 1 'always going from 0-255

select case functionB
case 0 'ramp down
lookup pwmcounter, [0,128,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0], pwmoutput
case 1 'ramp up
lookup pwmcounter, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,128,0], pwmoutput
case 2 'sine
lookup pwmcounter, [0,0,0,0,0,0,1,1,2,3,3,4,5,6,7,8,9,11,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,57,59,62,65,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,122,125,128,131,134,137,140,143,147,150,153,156,159,162,165,168,171,174,177,180,182,185,188,191,193,196,199,201,204,206,209,211,213,216,218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244,245,246,248,249,249,250,251,252,252,253,253,254,254,254,254,254,254,254,254,254,254,253,253,252,252,251,250,249,249,248,246,245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220,218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,180,177,174,171,168,165,162,159,156,153,150,147,143,140,137,134,131,128,125,122,118,115,112,109,106,103,100,97,94,91,88,85,82,79,76,73,70,67,65,62,59,57,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,19,18,16,15,13,12,11,9,8,7,6,5,4,3,3,2,1,1,0,0,0,0,0,0], pwmoutput
case 3 'triangle
lookup pwmcounter, [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,254,252,250,248,246,244,242,240,238,236,234,232,230,228,226,224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194,192,190,188,186,184,182,180,178,176,174,172,170,168,166,164,162,160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,116,114,112,110,108,106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2,0], pwmoutput
case 4
' lookup pwmcounter, [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255], pwmoutput
pwmoutput = 254
end select

j = stepval[stepnum]

pwmoutput = pwmoutput * j
' pwmoutput = pwmoutput >> 8 ' 8 bits
' if invert = 1 then
' pwmoutput = 255 - pwmoutput
' endif
pwmoutput = pwmoutput >> 6 ' 10 bits
if invert = 1 then
pwmoutput = 1023 - pwmoutput
endif

pwmsend:

CCP1CON.4 = pwmoutput.0
CCP1CON.5 = pwmoutput.1
CCPR1L = pwmoutput >> 2


InterruptExit:


PIR1.1 = 0        'clear TMR2 interrupt flag
resume
enable


END


Please don't pay too much attention to the comments, a lot of them are wrong, as i was changing things and never got to correct them.

Gurner

Wow...many thanks for sharing (I was only after the high concepts to chew on!)...it'll take me a while to pick the bones out of what you're doing in there (there's a lot happening!)....but thanks once again.

MoltenVoltage

Real nice work.  I've had a similar idea on the drawing board for a long time but haven't gotten around to it.

What I am very impressed with is the digital noise reduction work.  It sounds very very quiet.

The big question I have is about your Ground to Digital Ground connection.  The dsPIC datasheets recommend a 10 ohm resistor between the analog and digital grounds (which are separate on those chips), but you are using 100 ohm to all grounds.  It seems to me that would starve the chip of current (allowing a max of 50mA).  Did you consider this?

Also, do the opposing 1N914 diodes make a difference in noise?

I've never seen a resistor going into a voltage regulator (I've only seen them on the output side of a V/R to provide a constant current) - is that your own idea?   Are those for noise protection as well or for current regulation?

I mostly use the dsPIC's but I'm hoping that your cap-happy techniques will help quiet down some of my projects.

As far as comments - I can tell you from experience that it takes a ton of troubleshooting to make encoders work fluidly, and even using the same brand of encoders with different numbers of detents will require a lot of re-writing of code.  I don't think there is any shortcut, but I would put more effort into tweaking your encoder code so they react more naturally.  A big part of the job is sorting out your interrupt priorities - which will be different on every project.  I didn't review your code, but from your video it looks like you have your encoder too low.  I assume with the 18F you can turn on and off nested interrupts.  You might want to look into that as well, because it looks like you are missing some encoder interrupts.

Thanks very much for sharing!
MoltenVoltage.com for PedalSync audio control chips - make programmable and MIDI-controlled analog pedals!