ISD Fuzzjammer - dirty loop / stutter effect
More daftness with these cheap answering machine / voice recording chips, this time the ISD1820, probably the cheapest / dirtiest of the whole range.
I'm using two loop chips here, the first just creates the fuzz (an un-amplified guitar signal will cause it to clip) and filter effect. I failed to get one chip to do this and record/play audio so I've uneconomically used two. You really don't need the first one for fuzz, but it's handy to amp up/distort your audio somehow to cover up the annoying clicks the loop chips make.
I followed this Bastl layout for the passthrough (fuzz/filter) effect.
I've re-used the technique of bypassing the "speed"/"pitch" pot while recording and reconnecting it on playback (to instantly play out audio at different speeds) from this ungodly creation.
The "warp mode" is kinda fun, I just have the output of the recording chip connected to the speed control pin through a 22nf capacitor.
Unlike the ISD1420, the '1820 has a short pause of silence before every cycle through the loop. This is why I've called this design a "stutter" effect, since it's better for arrhythmic glitchy blasts than timed loops. The speed pot also leans towards out-of-sync stutteriness.
I'll share the schematic and stripboard but it uses a microcontroller (smaller board at the top of the layout). The code is underneath so you could port it to Arduino etc if you want to make one. The coloured wires on the layout show the connections to the microcontroller.
Fuzzy version in the video
Just a heads-up, the reverse side of the larger stripboard has been flipped horizontally in this image, so it appears as it does in real life.
Feel free to email me if you wanna make one and need any clarifications! - wraa.labs (at) gmail (dotcom)
Clean, simplified version
I got rid of the ISD chip making the fuzz and filter, switched R4 to 75k so the slowest playback speed creates at least an octave down and swapped the "warp" cap for a more usable 10n. The dry signal is at unity gain and always on, so you could even go without a bypass switch and essentially have "buffered bypass" when no loop is playing.
The 4.7uf cap (left, middle) turns on the ISD chip's internal compressor.
I'll be ordereing PCBs for this version soon. It'll be available as a DIY kit with the micrcontroller and ISD chip.
the bottom board has *NOT* been reversed on this image
Code
This is the code for the microcontroller, it's the same for both of the above stripboard layouts. I used "#DEFINE" statements (at the top) for each of the input/output pins so you could potentially port it to a different microcontroller. There are comments to help with modifying it for Arduino. I used a PIC.
#include "mcc_generated_files/mcc.h" // include my .h libraries
#define CONNECT_POT RA1 // change RA0 to RA5 to names of pins you're using
#define BYPASS_POT RA2
#define LOOP RA0
#define RECORD RA4
#define FOOTSWITCH RA5
#define byte unsigned char // not needed with Arduino
void main(void)
{
SYSTEM_Initialize(); // initialize the device (function from my .h libraries)
byte switchstate = 0;
byte playstate = 0; // 0 = idling, 1 = rec'ing, 2 = playing
byte rerecord = 0;
CONNECT_POT = 1;
BYPASS_POT = 0;
LOOP = 0;
RECORD = 0;
while (1) // continuous while loop equivalent to "loop" in Arduino
{
if((FOOTSWITCH == 0 && playstate == 0) || rerecord == 1) // "digitalRead(FOOTSWITCH, LOW)" in Arduino
{
rerecord = 0;
switchstate = 1;
playstate = 1;
LOOP = 0;
CONNECT_POT = 0;
BYPASS_POT = 1;
RECORD = 1;
__delay_ms(50); // "delay(30);" in Arduino. Debouncing footswitch...
while(FOOTSWITCH == 0)
__delay_ms(5); // wait while footswitch is pressed
}
if(playstate == 1) // instantly begin playing on a loop
{
RECORD = 0;
switchstate = 0;
playstate = 2;
BYPASS_POT = 0;
CONNECT_POT = 1;
__delay_ms(50); // test to see if resolves bug
LOOP = 1;
__delay_ms(50); // debounce footswitch release
while(FOOTSWITCH == 1)
__delay_ms(5); // wait while footswitch is NOT pressed
switchstate = 1;
}
if(playstate == 2) // stop playing / possibly start recording if footswitch held
{
CONNECT_POT = 0;
BYPASS_POT = 1;
RECORD = 1;
LOOP = 0;
__delay_ms(150); // delay to check if footswitch tapped or held
if(FOOTSWITCH == 0) // held, record again
{rerecord = 1; playstate = 100;} // 100 is making sure no other operations accidentally triggered
else
{RECORD = 0; playstate = 0;} // tapped, revert to idling state
}
}
}
Comments