FV-1 Multi effect full forum project ready to go. (ShimmerVerb Also)

Started by Ice-9, September 08, 2013, 09:23:49 AM

Previous topic - Next topic

loopmasta

@Ice-9 Everything is coming together now. The parts i ordered form Mouser took forever so i could not assemble the FV-1 until this weekend. The effect-sound is great. No noise or hum at all. Very clean and crisp. It sounds great with my Strat and PRS. Only the volume level of the effects is too low.

The teensy now handles the program switching and FV-1 programming via usb. Still very buggy but i am getting closer. Next up is the OLED display to show parameter changes  and program names.


Ice-9

Quote from: loopmasta on July 20, 2014, 11:42:09 AM
@Ice-9 Everything is coming together now. The parts i ordered form Mouser took forever so i could not assemble the FV-1 until this weekend. The effect-sound is great. No noise or hum at all. Very clean and crisp. It sounds great with my Strat and PRS. Only the volume level of the effects is too low.

The teensy now handles the program switching and FV-1 programming via usb. Still very buggy but i am getting closer. Next up is the OLED display to show parameter changes  and program names.



Great that is all working, the volume of the effects should be the same as the bypass volume, check C7 is the correct value (cap just above C12 and above FV-1) should be 1n. I once accidentally put a 100n here and that caused a huge drop in the effect volume so worth a check.

Also I see you have a resistor in place at R2 just under the polarity protection - replace R2 with a link for correct voltage to the op amp.
If you still feel you need a volume boost then fit the components C9, C10, R11, R12. (this shouldn't be needed if the circuit is working correctly as these components are for the eTap2HW firmware only)

The Teensy looks a great idea and I love that little OLED. Interested to see what you do with that.
www.stanleyfx.co.uk

Sanity: doing the same thing over and over again and expecting the same result. Mick Taylor

Please at least have 1 forum post before sending me a PM demanding something.

loopmasta

Quote from: Ice-9 on July 20, 2014, 12:00:13 PM
... the volume of the effects should be the same as the bypass volume, check C7 is the correct value (cap just above C12 and above FV-1) should be 1n. I once accidentally put a 100n here and that caused a huge drop in the effect volume so worth a check. Also I see you have a resistor in place at R2 just under the polarity protection - replace R2 with a link for correct voltage to the op amp.

I double checked C7. It should be ok. http://de.mouser.com/ProductDetail/Kemet/C322C102F5G5TA/?qs=%2fha2pyFaduifLrgx8NrpMly8FLUOuhphe3Fev%252bwFWPCJkKxl4s9pVQ%3d%3d
R2 is 33R according to the first layout but i see now that you changed a few things. So now R2, R6, R14 are links?

Ice-9

Quote from: loopmasta on July 20, 2014, 12:35:09 PM
Quote from: Ice-9 on July 20, 2014, 12:00:13 PM
... the volume of the effects should be the same as the bypass volume, check C7 is the correct value (cap just above C12 and above FV-1) should be 1n. I once accidentally put a 100n here and that caused a huge drop in the effect volume so worth a check. Also I see you have a resistor in place at R2 just under the polarity protection - replace R2 with a link for correct voltage to the op amp.

I double checked C7. It should be ok. http://de.mouser.com/ProductDetail/Kemet/C322C102F5G5TA/?qs=%2fha2pyFaduifLrgx8NrpMly8FLUOuhphe3Fev%252bwFWPCJkKxl4s9pVQ%3d%3d
R2 is 33R according to the first layout but i see now that you changed a few things. So now R2, R6, R14 are links?
Replacing R2 (33ohm) with a link will allow the full voltage of 9v to reach the analogue circuits correctly. the other changes to R6 R14 make no difference to the working of the circuit. If all the components are the correct value then the volume should be equal in effect and bypass modes. Let me know if you have any problems.
www.stanleyfx.co.uk

Sanity: doing the same thing over and over again and expecting the same result. Mick Taylor

Please at least have 1 forum post before sending me a PM demanding something.

Rebel_88

Hi I'm Watching the 1P8T switch made by Ice-9, it has 11 resistor, doesn't it should have only 9 resistor? 7 of the same dimension for the voltage divider, one for the end of the voltage divider and one bigger to keep down the pin of the pic when it needs?
There are 11 resistors because you used in series to get the last two bigger? or is there another idea?

Noise-O-Matic

Thanks for all the great work guys, this is the opening I've been waiting for to properly get into DSP!
This is definitely my next build, then.... the (blue)sky's the limit!! *groan*

Thanks again for all the hard work and for sharing your knowledge.  :icon_biggrin: I'll post pics and a build report at some point, if it'll help.

Joe

Ice-9

Quote from: Rebel_88 on July 21, 2014, 01:50:54 AM
Hi I'm Watching the 1P8T switch made by Ice-9, it has 11 resistor, doesn't it should have only 9 resistor? 7 of the same dimension for the voltage divider, one for the end of the voltage divider and one bigger to keep down the pin of the pic when it needs?
There are 11 resistors because you used in series to get the last two bigger? or is there another idea?

The resistors are all 2k7 with the last two on each end of the chain being in parallel, this gets the voltage to the most accurate divisions to for correct switching. In all the tests I made, 9 resistors all the same value works just fine as well though. I just left the PCB with the 11 sets of resistor pads rather than change it.
www.stanleyfx.co.uk

Sanity: doing the same thing over and over again and expecting the same result. Mick Taylor

Please at least have 1 forum post before sending me a PM demanding something.

Ice-9

Quote from: loopmasta on July 20, 2014, 11:42:09 AM
@Ice-9 Everything is coming together now. The parts i ordered form Mouser took forever so i could not assemble the FV-1 until this weekend. The effect-sound is great. No noise or hum at all. Very clean and crisp. It sounds great with my Strat and PRS. Only the volume level of the effects is too low.

The teensy now handles the program switching and FV-1 programming via usb. Still very buggy but i am getting closer. Next up is the OLED display to show parameter changes  and program names.



@loopmasta, did you track down the volume drop problem? If I can help let me know.
www.stanleyfx.co.uk

Sanity: doing the same thing over and over again and expecting the same result. Mick Taylor

Please at least have 1 forum post before sending me a PM demanding something.

tacromx

#268
Here's something ive been working on.

It's a simple mod to the pedal,take four wires (S0,S1,S2,ground) soldered to the pcb to a 4 pin 2.5mm
socket ( http://cpc.farnell.com/pro-signal/psg08265/2-5mm-jack-socket-4p/dp/AV15097 ) , you'll also need a 4pin 2.5mm jack to jack lead ( http://cpc.farnell.com/pro-signal/psg03512/2-5mm-4p-jack-lead-1-8m/dp/AV20160?crosssellid=AV20160&crosssell=true&in_merch=true&; ).

So now you need a box for the footswitch and the 16x2 lcd display and the arduino( i used a Uno, but you could use something smaller as only 2 analog pins and 4 digital pins are needed and the code is very compact and simple to modify).

Here's the schem....



and the sketch code.....

//Coded by Tacromx


// Basic code for controlling effect selection on FV-1 Reverb ic.
// connections are...  footswitch on pin 13, footswitch indicator on pin 9, S0,S1,S2 on pins 12,11,10





// constants won't change. They're used here to
// set pin numbers:

#include <Wire.h>
#include <LiquidTWI.h>

// Connect via i2c, default address #0 (A0-A2 not jumpered)
LiquidTWI lcd(0);


const int footswitch = 13;     // the number of the pushbutton pin


// variables:
int count = 0;
int buttonState = 0;         // variable for reading the pushbutton status

// the setup routine runs once when you press reset:
void setup() {                
 // initialize the digital pin as an output/input
pinMode(footswitch, INPUT);
pinMode(9, OUTPUT); // footswitch indicator led
pinMode(12, OUTPUT); // S0
pinMode(11, OUTPUT); // S1
pinMode(10, OUTPUT); // S2


// set up the LCD's number of rows and columns:
 lcd.begin(16, 2);
 // Print a message to the LCD.


}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop() {
// set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 lcd.setCursor(0, 0);
 
 
 // read the state of the pushbutton value:
 buttonState = digitalRead(footswitch);

 // check if the pushbutton is pressed.
 // if it is, the buttonState is HIGH:
 if (buttonState == HIGH) {    
   count++;           // add one (1) to our count
   PORTB |= _BV (1);  // digitalWrite (9, HIGH);
   
 }
 else {
   // count = count
   PORTB &= ~_BV (1); // digitalWrite (9, LOW);
 if (count >= 8) {    // test if we reach effect no 8
   (count = 0);       // if yes, reset to effect no 1
 }
   
 }
  delay(100);

 //code below sets S0 S1 S2 output pins to the FV-1
  // change " * " to name of effect
 // 000
 if (count == 0) {
 PORTB &= ~_BV (2); // digitalWrite (10, LOW);
 PORTB &= ~_BV (3); // digitalWrite (11, LOW);
 PORTB &= ~_BV (4); // digitalWrite (12, LOW);
 lcd.print("EFFECT 1");
 delay(100);
 }
 
 // 100
 if (count == 1) {
 PORTB |= _BV (2); // digitalWrite (10, HIGH);
 PORTB &= ~_BV (3); // digitalWrite (11, LOW);
 PORTB &= ~_BV (4); // digitalWrite (12, LOW);
 lcd.print("EFFECT 2");
 delay(100);
 }
 
 //010
 if (count == 2) {
 PORTB &= ~_BV (2); // digitalWrite (10, LOW);
 PORTB |= _BV (3); // digitalWrite (11, HIGH);
 PORTB &= ~_BV (4); // digitalWrite (12, LOW);
 lcd.print("EFFECT 3");
 delay(100);
 }
 
 // 110
 if (count == 3) {
 PORTB |= _BV (2); // digitalWrite (10, HIGH);
 PORTB |= _BV (3); // digitalWrite (11, HIGH);
 PORTB &= ~_BV (4); // digitalWrite (12, LOW);
 lcd.print("EFFECT 4");
 delay(100);
 }
 
 //001
 if (count == 4) {
 PORTB &= ~_BV (2); // digitalWrite (10, LOW);
 PORTB &= ~_BV (3); // digitalWrite (11, LOW);
 PORTB |= _BV (4); // digitalWrite (12, HIGH);
 lcd.print("EFFECT 5");
 delay(100);
 }
 
 // 101
 if (count == 5) {
 PORTB |= _BV (2); // digitalWrite (10, HIGH);
 PORTB &= ~_BV (3); // digitalWrite (11, LOW);
 PORTB |= _BV (4); // digitalWrite (12, HIGH);
 lcd.print("EFFECT 6");
 delay(100);
 }
 
 //011
 if (count == 6) {
 PORTB &= ~_BV (2); // digitalWrite (10, LOW);
 PORTB |= _BV (3); // digitalWrite (11, HIGH);
 PORTB |= _BV (4); // digitalWrite (12, HIGH);
 lcd.print("EFFECT 7");
 delay(100);
 }
 
 // 111
 if (count == 7) {
 PORTB |= _BV (2); // digitalWrite (10, HIGH);
 PORTB |= _BV (3); // digitalWrite (11, HIGH);
 PORTB |= _BV (4); // digitalWrite (12, HIGH);
 lcd.print("EFFECT 8");
 delay(100);
 }  

}


you need an I2C lcd controller too by the way

Ice-9

DELAY WITH REPEATS

Here is some code for a simple delay which has controls for 'Delay Time' up to 1 second. 'Feedback' which controls the repeats and 'Mix' well you can work that one out for yourselves. :)
The delay control can be modified within the code to have it act like an analogue pot with a frequency sweep as you change the time or a near silent zipper sweep.
There is no filtering on the feedback so it is very clean and digital with no degradation on the repeats.
The Mix can be changed in the code- it can either adjust the volume of the echo from 0-10 mixed with the dry or it can be dry only fully ccw 50/50 in the middle and wet only cw.
;Mono delay in left chan with dry and repeats
;Mono delay in right chan wet signal only

;Pot0 = dry wet mix
;Pot1 = delay time
;Pot2 = feedback

;---------------------------declarations---------------------------------
equ del 32365 ; Length of delay
mem    echo    del ; echo delay

equ    del_read   reg0
equ del_out   reg1
equ dry_in   reg2
equ fbk   reg3
equ    smooth      0.000125    ; Adjust to your liking of speed/noise tradeoff

;---------------------------------------------------------------------
;Clear register on start

skp    RUN,   loop
clr
wrax    del_read,0

loop:

;----------------------------------------------------------------------
;Get feedback value from pot2

rdax pot2,0.7
wrax fbk,0

;----------------------------------------------------------------------
;Select tap from delay based on pot1, should range 0 to del
;Since pot only has 512 states, want to filter pot to avoid jumping

;Smooth POT1

clr            ; Clear the ACC
or    del*256      ; Put delay del into ACC alligned to ACC[22:8]
mulx    pot1          ; Multiply by POT1, new target value
rdfx    del_read, smooth      ; Smooth it : (target - current) * C + current
wrax    del_read, 0      ; Save it

rdax    adcl,    0.5      ; Get left input and divide by 2
rdax    adcr,    0.5 ; Get right input and divide by 2
wra    echo,    1.0      ; Write it to the head of the delay
wrax    dry_in,    0      ; Write dry input sig to dry_in register and clear ACC

rdax    del_read, 1.0      ; Get the delay tap to read
wrax    addr_ptr, 0    ; Write it to the address pointer register
rmpa    1          ; Read from memory
wrax    del_out, 0      ; write to del_out register and clear ACC

;-------------------------------------------------------------------------
;allowing for feedback:

rdax del_out,1
mulx fbk
rdax adcl,0.5
rdax adcr,0.5
wrax dry_in,1
wra echo,0

;-----------------------------------------------------------------------
;Now do output mixing

rdax del_out,1
wrax dacr,1 ; Wet only to right channel output
;rdax dry_in,-1 ; using this line will allow the wet/dry mix to be ccw dry only
; and cw wet only. rem this line for 100% dry with wet/dry adjusting
; the delay level only.
mulx pot0
rdax dry_in,1
wrax dacl,0 ; Dry wet mix to left channel output


Hope you like it.
www.stanleyfx.co.uk

Sanity: doing the same thing over and over again and expecting the same result. Mick Taylor

Please at least have 1 forum post before sending me a PM demanding something.

slacker

If anyone's interested here are the programs from my Babelfish project, apart from the tap tempo delay they should all run fine on Mick's pedal, feel free to do what you like with them.

babelfish.zip

Digital Larry

Digital Larry
Want to quickly design your own effects patches for the Spin FV-1 DSP chip?
https://github.com/HolyCityAudio/SpinCAD-Designer

Ice-9

+1, Thanks Slacker.

The tap tempo code could be made to work with the pcb without too much modification. The right FV-1 output is not connected to anything so it could be brought into action by adding the LED driver for the tempo LED that your tap tempo code uses. The two ways that come to mind are :-

1. Use a larger enclosure to house the PCB and use the extra room to add the momentary footswitch and the needed resistors LED etc.
2. Use the original size 1590b enclosure, by utilizing the battery space the 2 foot switches could be wired alongside each other in that space + add the extra few resistors and tempo led drive circuitry.

I will have a look and see where the best points on the PCB are to do this when I get a chance.

Thanks for posting the code. :icon_biggrin:

www.stanleyfx.co.uk

Sanity: doing the same thing over and over again and expecting the same result. Mick Taylor

Please at least have 1 forum post before sending me a PM demanding something.

dkmorb

I'm trying to modify the SpinCAD Designer source code to add a "runtime" (or "on the fly") eeprom programmer feature.
This is the first screenshot of the application.



slacker

Welcome :) Interesting stuff, what hardware are you planning to use to program the EEPROM? Look forward to seeing what you come up with.

iami

Hi guys

Dkmorb, I like your idea!
as for me, I'm just 'printing' hex code to an atmel http://www.spinsemi.com/forum/viewtopic.php?t=428
Maybe you could add a print option? (Well, I might be the only one flashing code this way...)

BTW, Digital Larry: nice work with SpinCAD

dkmorb

Hi iami,
can you provide us your project hardware schema?
I will analyze the code next days.

Bye.

iami

You should find everything in my post on the spinsemi forum (link just above)
There is a zip file with code&pcb (not sure about schematics though)

slacker

Presumably, as a result of being able to program the eeprom it will also be able to produce a hex file?

dkmorb

@ Ian,
we have member function:
public int[] generateHex()
in Elmgen ElmProgram class.

I think we must take care about this point...

@iami
DoH!!! Sorry! :icon_redface: