Pedal switching matrix with the AD75019

Started by R.G., November 26, 2015, 12:39:26 AM

Previous topic - Next topic

Harold

Quote from: G. Hoffman on November 08, 2016, 01:56:40 AM
I figured out a while back, I really had pretty much all the sub assembles for this already, except for the exact input and output buffers I want to use - but even there, I have something pretty close.  And of course, I have the development board I've shown here before (at least, I believe I have), so really it's just finding the time to sit down and build up the boards, and wiring all the bits together to test it.  I'm hoping to get to it as soon as possible

Gabriel, that's exactly what I'm facing now!  ;D

I tested the AD-chip with an ULN2803 that lit up LEDs, the buffers are yet untested, the power supply is a make shift on breadboard, and the whole assembly with wires running about; and it's probably one big antenna.

I got as far as it's "ready to test" and then I decided I was too tired ;)
DIY-Layout.com: Online stripboard layouts

G. Hoffman

Quote from: Harold on November 08, 2016, 03:15:22 AM
Quote from: G. Hoffman on November 08, 2016, 01:56:40 AM
I figured out a while back, I really had pretty much all the sub assembles for this already, except for the exact input and output buffers I want to use - but even there, I have something pretty close.  And of course, I have the development board I've shown here before (at least, I believe I have), so really it's just finding the time to sit down and build up the boards, and wiring all the bits together to test it.  I'm hoping to get to it as soon as possible

Gabriel, that's exactly what I'm facing now!  ;D

I tested the AD-chip with an ULN2803 that lit up LEDs, the buffers are yet untested, the power supply is a make shift on breadboard, and the whole assembly with wires running about; and it's probably one big antenna.

I got as far as it's "ready to test" and then I decided I was too tired ;)

Yeah, I'll have to design a PS, but for now it will run on the bench supply. 

I've kind of been distracted by, well, life, and also the Deluxe Reverb transformers I had sitting in a drawer.  Mostly life, though.  It's been a shitty year.


Gabriel

potul

Hi All,

I've been reading this thread for some time and now I'm starting to gather some parts to do some experimenting with crosspoint matrix switches. Regarding buffering.... what would be the lowest parts count/simpler buffer system? Can I use a CD4069 to build 6 buffers?

Mat

G. Hoffman

Quote from: potul on November 17, 2016, 01:17:49 PM
Hi All,

I've been reading this thread for some time and now I'm starting to gather some parts to do some experimenting with crosspoint matrix switches. Regarding buffering.... what would be the lowest parts count/simpler buffer system? Can I use a CD4069 to build 6 buffers?

Mat

I'm pretty sure that's a logic buffer, and not really appropriate for analog signals.  AMZ FX has a page about basic buffer designs - http://www.muzique.com/lab/buffers.htm.


Gabriel

potul

I was thinking on usign it as an opamp, the same way we do for distortion pedals.
The CD4069 I have are unbuffered (I think)

Mat

pdavis68

Quote from: potul on November 17, 2016, 01:17:49 PM
Hi All,

I've been reading this thread for some time and now I'm starting to gather some parts to do some experimenting with crosspoint matrix switches. Regarding buffering.... what would be the lowest parts count/simpler buffer system? Can I use a CD4069 to build 6 buffers?

Mat
I just made one of these and need to make another: http://www.muzique.com/news/jfet-buffer-on-stripboard/

Low part count jfet buffer. Same thing, but different values and more compact vero layout. http://s76.photobucket.com/user/IvIark_2006/media/Layouts/Vero/JFETBuffer.png.html

I'm about to build a single chassis pedalboard that has a number of pedals built in (I have 12 built so far). I think if I were going to do something like this, I'd integrate it into that pedalboard. I'd probably use a 2-digit LED and use a microcontroller to handle the logic. I imagine I'd want it to work something like this:

You'd have an up-down buttons to set the digits on the LED. They'd indicate which "program" you wanted. A program would be a mix of inputs and outputs in a specific order.
So you'd go to the program # you want to create a setup for. There'd be a "Set Program" button that you'd press and it would turn off all the pedals. You'd then go through and active the pedals in the order you want them. The microcontroller would track the order. Then click the "Set Program" button again and that would store the pedal assignments and order.

Simply set the program number and it would active the pedals for that program in that order.

Not too far off from like a Floor Pod or something like that.

PRR

> Can I use a CD4069 to build 6 buffers?

Yes, that is the minimum hex "audio" buffer I know. But CMOS hisses, also distorts some. You need 2 caps and 2 to 4 resistors per buffer (unless you are clever/lucky and don't mind pops when switching). Six transistors is hardly more to build. Three TL072 is only a few more pins and worlds cleaner.
  • SUPPORTER

potul

Thanks PRR,

this is exaclty the kind of info I was looking for. PRobably TL072/74 is the way to go.
In fact, I just realized that because I need 8 buffers, I would need two CD4069. Moving to two TL074 doesn't look much more pin counts.

I will start playing without buffers and when I have the concept working I will decide what buffer architecture to implement.

Thanks again!

bananu7

Hey, just wanted to mention that I'm also thinking about changing my design from hardware switches to the AD75019. I've ordered a couple as samples from AD and I'm thinking about the board design in the meantime. The thread has been a huge help!

Cheers.

Harold

I still have a box with my test-setup somewhere ;)

Once I finish all my other projects, this will happen again! The demand of it is somewhat diminished since I bought a Boss MS-3 ...  8)
DIY-Layout.com: Online stripboard layouts

potul

I was planning to build a project based on a switch matrix. I bought all my components and even did all the programming and simulation in arduino, but it's still waiting in a drawer. I did not have the time to put my hands on it... I have a huge backlog of projects at the moment.


G. Hoffman

I finally realized that all I really want is to put my delays in parallel (try it - SOOOO much delay, and it never gets muddy or looses definition - I love it), and everything else can easily be in the same series order all the time.  Plus, I had to start working 50 hours a week, and lost the time I needed for this project.

Gabriel

pruttelherrie

#172
Hi guys,

Just thought I'd leave this here. I've used this board in two different setups (one floorboard, one rack) during live gigs for over two years. The only (initial) hiccup I have had with it was a stupid bad soldering connection in the floorbord. Otherwise they have been running fine. Both setups use a combination of builtin effects (gate/dist/...) and external effects (delays/ehx synth9/...).

I'm using hard-coded loopconfigurations, controlled by switches or MIDI. So that means I haven't put any thinking in a UI to change the config!

The pcb has an on-board mixer. It has no buffering, except for the input and (stereo) outputs. Should work with well-behaving pedals. It has worked for me  ;)

The connect() and update() functions are an idea I found somewhere on the net, the #defines for easier configuration are my additions.
Please note, labeling peculiarity: 'OUT' on the PCB means output of the AD75019, needs to go to the IN of the effect. Same for IN.

[edit] Forgot to add: there's some caveats left and right. If you decide to build something using this as a starting point, make sure you understand everything, or get in touch with me to make sure. [/edit]







Eagle files:
https://possob.xs4all.nl/heskamp/public/ad75019_switcher1.0.brd
https://possob.xs4all.nl/heskamp/public/ad75019_switcher1.0.sch

Basic code to configure stuff:


///////////////////////////////////////////////////////////////////////
//
//   AD75019 Switch Matrix Control
//
///////////////////////////////////////////////////////////////////////

/* The first bit loaded via SIN, the serial data input, controls the switch
at the intersection of row Y15 and column X15. The next bits control the
remaining columns (down to X0) of row Y15, and are followed by the bits
for row Y14, and so on down to the data for the switch at the intersec-
tion of row Y0 and column X0. The shift register is dynamic, so
there is a minimum clock rate, specified as 20 kHz. */

// AD75019 connections
#define SCLK_PIN 13 // = SCK  = PB5 = atmega pin 19
#define SIN_PIN 11 // = MOSI = PB3 = atmega pin 17
#define PCLK_PIN 9  // = OC1A = PB1 = atmega pin 15

#define MAXPROGRAMS 8
#define NUMPROGRAMS 5 // rhythm/delay/delay+boost/special/mute

// ************ AD75019 connection definitions. Board/hardware dependent. *******

// First nibble is the input of the effect, they are connected to the Y's.
// Second nibble is the output of the effect, connected to the X.

// The first six definitions are fixed 'effects' on the board. Make sure
// that 'output only' are not used as input, and 'input only' are not used as output,
// since the other nibble of the definition is not defined! (Hm, that sounded weird) 
#define INNPUT    0x00 // The input to the Switcheroo, it's an 'effect output' only.
#define OUT_L     0x0b // OUT_L is an 'effect input' FIXME: labeling schematic. PCB is ok.
#define OUT_R     0x09 // Same for OUT_R
#define GND       0x20 // This is an 'effect output' only, can be used to ground
                       // the input of unused effects.
#define MIXER1    0x0e // Two-in-one opamp mixer block on the PCB.
#define MIXER2    0x0f // The other mixer input.
#define MIXER_OUT 0x10 // The output of the mixer.

// The rest are the connections to the headers
// If there's a need for more headers, they can be soldered to the
// AD75019 socket on the bottom of the PCB and then defined here.
#define CONN_5 0x58
#define CONN_6 0x73
#define CONN_7 0x92
#define CONN_8 0xb5
#define CONN_9 0xd4
#define CONN_A 0xf7
#define CONN_B 0xe6
#define CONN_C 0xa1
#define CONN_D 0x6c

// ************ Effect connection definitions **************************
//
// Defines what effect is connected to which header, so composing the
// programs becomes easier.
#define GATE     CONN_5
#define POST     CONN_6
#define DELAY    CONN_9
#define BOOST    CONN_7
#define HM2      CONN_8
#define SPECIAL  CONN_A
#define FEEDBCK  CONN_B
#define TAILS    CONN_C
#define FV1_FBCK CONN_D

// Globals
uint16_t      programs[NUMPROGRAMS][16];
int           activeprogram=0; // Rhythm

void connect_all() {
  memset(programs, 0, sizeof(programs)); // Empty the program memory

  // default rhythm
  connect(0, INNPUT,    HM2);
  connect(0, HM2,       GATE);
  connect(0, GATE,      MIXER1);
  connect(0, DELAY,     MIXER2);
  connect(0, MIXER_OUT, OUT_L);
  connect(0, GND,       DELAY);
  connect(0, GND,       BOOST);
  connect(0, FV1_FBCK,  TAILS);
  connect(0, TAILS,     FV1_FBCK);
 
  // delay
  connect(1, INNPUT,    HM2);
  connect(1, HM2,       GATE);
  connect(1, GATE,      DELAY);
  connect(1, GND,       MIXER1);
  connect(1, DELAY,     MIXER2);
  connect(1, MIXER_OUT, OUT_L);
  connect(1, GND,       BOOST);
  connect(1, FV1_FBCK,  FEEDBCK);
  connect(1, FEEDBCK,   FV1_FBCK);

  // delay+boost
  connect(2, INNPUT,    HM2);
  connect(2, HM2,       GATE);
  connect(2, GATE,      DELAY);
  connect(2, DELAY,     BOOST);
  connect(2, GND,       MIXER1);
  connect(2, BOOST,     MIXER2);
  connect(2, MIXER_OUT, OUT_L);
  connect(2, FV1_FBCK,  FEEDBCK);
  connect(2, FEEDBCK,   FV1_FBCK);

  // special
  connect(3, INNPUT,    HM2);
  connect(3, HM2,       GATE);
  connect(3, GATE,      SPECIAL);
  connect(3, SPECIAL,   OUT_L);
 
  // mute
  connect(4, GND,       HM2);
  connect(4, GND,       GATE);
  connect(4, GND,       MIXER1);
  connect(4, GND,       DELAY);
  connect(4, GND,       MIXER2);
  connect(4, GND,       OUT_L);
}

// Connects the output of effect 'from' to the input of effect 'to', in program 'program'
void connect(uint8_t program, uint8_t from, uint8_t to) {
  uint8_t x, y;
  // Find out correct Y and X from the effect- and hardwaredefinitions
  y = to & 0x0f;                // Lower nibble needed: mask out higher nibble
  x = from >> 4;                // Higher nibble needed: shift down to lower nibble
  programs[program][y] |= 1<<x; // Then set this bit in the program.
}

void update(uint8_t newprogram) {
  uint8_t i;
  uint16_t n, mask;
  // Clock in from highest bits to lowest
  for (i=16;--i<255;) { // Stops when uint8_t flips over
    n = programs[newprogram][i];
    for (mask = 0x8000; mask; mask >>= 1) {
      // Mask goes from bit 15 to bit 0.
      digitalWrite(SIN_PIN, (n & mask) ? HIGH : LOW);
      asm("nop"); asm("nop");
      digitalWrite(SCLK_PIN, HIGH);       
      asm("nop"); asm("nop"); asm("nop"); asm("nop");
      asm("nop"); asm("nop"); asm("nop"); asm("nop");
      digitalWrite(SCLK_PIN, LOW);         
      asm("nop"); asm("nop"); asm("nop"); asm("nop");
    }
  }
  asm("nop"); asm("nop"); asm("nop"); asm("nop");
  asm("nop"); asm("nop"); asm("nop"); asm("nop");
  digitalWrite(PCLK_PIN, LOW);               
  asm("nop"); asm("nop"); asm("nop"); asm("nop");
  asm("nop"); asm("nop"); asm("nop"); asm("nop");
  digitalWrite(PCLK_PIN, HIGH);                   
}

void setup() {
  pinMode(SCLK_PIN, OUTPUT);
  pinMode(SIN_PIN, OUTPUT);
  digitalWrite(PCLK_PIN, HIGH);
  pinMode(PCLK_PIN, OUTPUT);
  connect_all();         // Build programs
  update(activeprogram); // Set switches to default
}

void loop() {

}