Showing posts with label Noise. Show all posts
Showing posts with label Noise. Show all posts

Sunday, April 3, 2016

Digital Noise Generator

This code makes digital noise using a PIC microcontroller (12f683).

Three signals are generated: Random noise on GP0, random triggers GP1, and random gates on GP2.

 /*
 * File:   Noise Generator 2 Routine.c
 * Author: Hans Mikelson
 *
 * Created on March 17, 2016, 1 PM
 */

#if defined(__XC)
    #include <xc.h>         /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>        /* HiTech General Include File */
#endif

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */
#include <stdlib.h>     /*rand()*/

#pragma config MCLRE=OFF,CP=OFF,WDTE=OFF,FOSC=INTOSCIO
#define _XTAL_FREQ 4000000
uint8_t sGPIO;
int gi,gi1,gr1,gr2,gr3,gi3,gr0,gr4;

void init()
{
    //Configure GPIO Port
    ANSEL =  0b00000000;  //Configure all GPIO pins as digital
    TRISIO = 0b11001100;  //Set GP# 1=inputs and 0=outputs
    OPTION_REGbits.nGPPU = 0;
    WPU = 0b00000100;     //Enable weak pullups=1
    //Configuer AD Convertor
    ADCON0 = 0x00;        //AD disabled
    ADRESH = 0x00;        //Init the AD Register
    //Configure Comparator
    CMCON0 = 0xFF;   // Comparator is turned off
    CMCON1 = 0x00;   // Comparator is turned off
    //Interrupt configuration
    //INTCON = 0x00;   //Disable all interrupts
    INTCONbits.INTF = 0;       // External interrupt on GP2 only
    OPTION_REGbits.INTEDG = 0; // 1=rising edge, 0=falling
    INTCONbits.INTE = 1;       // Enable external interrupt
    INTCONbits.GIE = 1;        // Global interrupt enable
}

void vdelay(int n)
{
    int i;
    for (i=0;i<=n;i++)
    {
     __delay_us(100);
    }
}

void scan_eyes(int n, int m, uint8_t led1, uint8_t led2) // PWM sweep high f to low f
{
 int i,j,k;
 int i1,i2,i3,pw1,pw2;
 uint8_t sGPIO;

 i1=1; i2=-1; pw1=0; pw2=n;
 sGPIO = GPIO;
 for (k=0;k<m;k++)
 {
  for (j=0;j<n;j++)
   {
    for (i=0;i<n;i++)
     {
      if (i>pw1)
       {
        sGPIO = sGPIO & ~led1;
       }
      else
       {
        sGPIO = sGPIO | led1;
       }
      if (i>pw2)
       {
        sGPIO = sGPIO & ~led2;
       }
      else
       {
        sGPIO = sGPIO | led2;
       }
      GPIO = sGPIO;
     }
    pw1 = pw1 + i1;
    pw2 = pw2 + i2;
   }
  i3 = i1; i1 = i2, i2 = i3;
 }
}

void noise0(uint8_t r3) // Pulse noise with different frequencies
{
 int r1;
 r1=rand() | 0b11111110;

 sGPIO = GPIO;
 //sGPIO = (sGPIO & 0b11111101);
 sGPIO = (sGPIO | 0b00000001) & r1;
 if (gr1<=0)
  {
   sGPIO = (sGPIO & 0b11101111);
  }
 if (gr2<=0)
  {
   gr0=(rand() & r3)+11;
   gr1=(rand() & r3)+11;
   gr2=gr1+gr0;
   gr3=10;
   gi3=-1;
   sGPIO = (sGPIO | 0b00010010);
  }
 gr2--;
 gr1--;
 if (gr3==0)
  {
   gi3=0;
   sGPIO = (sGPIO & 0b11111101);
  }
 gr3+=gi3;
 GPIO = sGPIO;
}

void noise1(int r3) // Pulse noise
{
 int r1;
 r1=rand() | 0b11111110;

 sGPIO = GPIO;
 sGPIO = (sGPIO | 0b00000001) & r1;
 if (gr1<=0)
  {
   sGPIO = (sGPIO & 0b11101111);
  }
 if (gr2<=0)
  {
   gr0=(rand() & gr4)+11;
   gr1=(rand() & gr4)+11;
   gr2=gr1+gr0;
   gr3=10;
   gi3=-1;
   sGPIO = (sGPIO | 0b00010010);
  }
 gr2--;
 gr1--;
 if (gr3==0)
  {
   gi3=0;
   sGPIO = (sGPIO & 0b11111101);
  }
 gr3+=gi3;
 GPIO = sGPIO;
}

void main()
{
    uint8_t r, d=20, rp=3;

    init();
    gi=0;
    gi3=0; gr3=10;
    GPIO = 0b00000000;
    gr0=(rand() & 0b1111111111)+11;
    gr1=(rand() & 0b1111111111)+11;
    gr2=gr1+gr0;
    scan_eyes(d,2,2,1);
    while(1)
    {
     switch (gi)
      {
       case 0:
           noise0(1);
       break;

       case 1:
         noise1(rand());
       break;

       default:
       scan_eyes(d,2,1,2);
      }
    }
}

void interrupt tc_int (void)
{
 if (INTCONbits.INTF==1)
  {
   INTCONbits.INTF = 0;
   gi=(gi+1)%3;
   vdelay(100);
     switch (gi)
      {
       case 0:
         gi3=0; gr3=10;
         GPIO = 0b00000000;
         gr0=(rand() & 0b1111111111)+11;
         gr1=(rand() & 0b1111111111)+11;
         gr2=gr1+gr0;
       break;

       case 1:
         gi3=0; gr3=10;
         GPIO = 0b00000000;
         gr4 = rand();
         gr0=(rand() & gr4)+11;
         gr1=(rand() & gr4)+11;
         gr2=gr1+gr0;
       break;

       default:
         GPIO = 0b00000000;
      }
  }
}


 

Sunday, February 22, 2015

Chiptune Noisemaker revised

/* 
 * File:   noisegenmain.c
 * Author: Hans Mikelson
 *
 * Created on February 13, 2015, 2:42 PM
 * Revised February 22, 2015
 * This program creates a random sequence of various types of noises
 * ranging from computer game like noises to white like noise.
 * These are all based on random or periodic on off pulses from the
 * microcontroller.  This program uses the 12f683 microcontroller but
 * should be adaptable to other brands of microcontroller.
 */

#if defined(__XC)
    #include <xc.h>         /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>        /* HiTech General Include File */
#endif

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */
#include <stdlib.h>     /*rand()*/

#pragma config MCLRE=OFF,CP=OFF,WDTE=OFF,FOSC=INTOSCIO
#define _XTAL_FREQ 4000000
uint8_t sGPIO;

void init()
{
    //Configure GPIO Port
    ANSEL =  0b00000000;  //Configure all GPIO pins as digital
    TRISIO = 0b11000100;  //Set GP1-5 as outputs and the rest as inputs
    OPTION_REGbits.nGPPU = 0;
    WPU = 0b00000100;     //Enable weak pullups on GP2
    //Configuer AD Convertor
    ADCON0 = 0x00;        //AD disabled
    ADRESH = 0x00;        //Init the AD Register
    //Configure Comparator
    CMCON0 = 0xFF;   // Comparator is turned off
    CMCON1 = 0x00;   // Comparator is turned off
    //Interrupt configuration
    INTCON = 0x00;   //Disable all interrupts
}

void vdelay(int n)
{
    int i;
    for (i=0;i<=n;i++)
    {
     __delay_us(1);
    }
}

void noise1(uint8_t r3) // PWM sweep high f to low f
{
 int i,j,r1,r2;
 r1=rand() & (r3-1);
 r2=r3/r1;
 for (j=0;j<r1;j++)
  {
   for (i=0;i<j;i++)
    {
     GPIO = 0b11110111;
     vdelay(i*r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
    }
   for (i=0;i<j;i++)
    {
     GPIO = 0b11110111;
     vdelay((j-i)*r2);
     GPIO = 0b11000000;
     vdelay(i*r2);
    }
  }
}

void noise4(uint8_t r3) // PWM sweep low f to high f
{
 int i,j,r1,r2;
 r1=rand() & (r3-1);
 r2=r3/r1;
 for (j=r1;j>0;j--)
  {
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay(i*r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
    }
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay((j-i)*r2);
     GPIO = 0b11000000;
     vdelay(i*r2);
    }
  }
}

void noise2(uint8_t r3) //PWM sweep down, laser
{
 int i,j,r1,r2;
 r1=rand() & (r3-1);
 r2=r3/r1;
 for (j=r2;j<r1;j++)
  {
   for (i=0;i<j;i++)
    {
     GPIO = 0b11110111;
     vdelay(r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
    }
  }
}

void noise3(uint8_t r3) // Pulse noise with different frequencies
{
 int j,r1,r2;
 r1=rand() & 2047;
 r2 = 32*r3/r1;
 for (j=0;j<r2;j++)
  {
   GPIO = 0b11110111;
   vdelay(rand() & (r3-1));
   GPIO = 0b11000000;
   vdelay(rand() & (r3-1));
  }
}

void noise5(uint8_t r3) // Long random clicks
{
 int j,r1;
 r1=rand() & (r3-1);
 for (j=0;j<r1/4;j++)
  {
   GPIO = 0b11110111;
   vdelay(r3*8);
   GPIO = 0b11000000;
   vdelay(rand());
  }
}

void noise6(uint8_t r3) // Short random clicks
{
 int j,r1;
 r1=rand() & (r3-1);
 for (j=0;j<r1/2;j++)
  {
   GPIO = 0b11110111;
   vdelay(r3*2);
   GPIO = 0b11000000;
   vdelay(rand() & 8191);
  }
}

void noise7(uint8_t r3) // PWM sweep low f to high f
{
 int i,j,r1,r2;
 r1=(rand() & (r3-1))/4;
 r2=r3/r1;
 for (j=r1;j>0;j--)
  {
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay(i*r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
     vdelay(rand() & ((r3-1)/4));
    }
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay((j-i)*r2);
     vdelay(rand() & ((r3-1)/4));
     GPIO = 0b11000000;
     vdelay(i*r2);
    }
  }
}

void main()
{
uint8_t ra[8]={2,4,4,8,16,32,64,128};
int r,r4;

 init();
 r=0;
 while(1)
  {
   //r = rand()&7;
   if (GPIObits.GP2 == 0)
    {
     r=(r+1)%7;
     vdelay(1000000);
    }
   r4=rand()&7;
   switch (r)
    {
     case 1:
     noise1(ra[r4]);
     //vdelay(rand());
     break;

     case 2:
     noise2(ra[r4]);
     //vdelay(rand());
     break;

     case 3:
     noise3(ra[r4]);
     //vdelay(rand());
     break;

     case 4:
     noise1(ra[r4]);
     noise4(ra[r4]);
     //vdelay(rand());
     break;

     case 5:
     noise5(ra[r4]);
     //vdelay(rand());
     break;

     case 6:
     noise6(ra[r4]);
     //vdelay(rand());
     break;

     default:
     noise7(ra[r4]);
     //vdelay(rand());
    }
  }
}

Sunday, February 15, 2015

Chip Tune Noise


This program generates noise similar to that found in computer games.  There are seven different subroutines: 1. sweep up, 2. sweep down, 3. noise, 4. sweep up and down, 5. long random pulses, 6. short random clicks, 7. sweep up with random noise mixed in.  The each subroutine is selected randomly and plays for 1-2 seconds.  This was implemented on a Microchip 12f683 micro-controller.

/* 
 * File:   noisegenmain.c
 * Author: Hans Mikelson
 *
 * Created on February 13, 2015, 2:42 PM
 * This program creates a random sequence of various types of noises 
 * ranging from computer game like noises to white like noise.
 * These are all based on random or periodic on off pulses from the
 * microcontroller.  This program uses the 12f683 microcontroller but
 * should be adaptable to other brands of microcontroller.
 */

#if defined(__XC)
    #include <xc.h>         /* XC8 General Include File */
#elif defined(HI_TECH_C)
    #include <htc.h>        /* HiTech General Include File */
#endif

#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */
#include <stdlib.h>     /*rand()*/

#pragma config MCLRE=OFF,CP=OFF,WDTE=OFF,FOSC=INTOSCIO
#define _XTAL_FREQ 4000000
uint8_t sGPIO;

void init()
{
    //Configure GPIO Port
    ANSEL =  0b00000000;  //Configure all GPIO pins as digital
    TRISIO = 0b11001000;  //Set GP1-5 as outputs and the rest as inputs
    OPTION_REGbits.nGPPU = 0;
    WPU = 0b00000001;     //Enable weak pullups on GP0
    //Configuer AD Convertor
    ADCON0 = 0x00;        //AD disabled
    ADRESH = 0x00;        //Init the AD Register
    //Configure Comparator
    CMCON0 = 0xFF;   // Comparator is turned off
    CMCON1 = 0x00;   // Comparator is turned off
    //Interrupt configuration
    INTCON = 0x00;   //Disable all interrupts
}

void vdelay(int n)
{
    int i;
    for (i=0;i<=n;i++)
    {
     __delay_us(1);
    }
}

void noise1(uint8_t r3) // PWM sweep high f to low f
{
 int i,j,r1,r2;
 r1=rand() & (r3-1);
 r2=r3/r1;
 for (j=0;j<r1;j++)
  {
   for (i=0;i<j;i++)
    {
     GPIO = 0b11110111;
     vdelay(i*r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
    }
   for (i=0;i<j;i++)
    {
     GPIO = 0b11110111;
     vdelay((j-i)*r2);
     GPIO = 0b11000000;
     vdelay(i*r2);
    }
  }
}

void noise4(uint8_t r3) // PWM sweep low f to high f
{
 int i,j,r1,r2;
 r1=rand() & (r3-1);
 r2=r3/r1;
 for (j=r1;j>0;j--)
  {
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay(i*r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
    }
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay((j-i)*r2);
     GPIO = 0b11000000;
     vdelay(i*r2);
    }
  }
}

void noise2(uint8_t r3) //PWM sweep down, laser
{
 int i,j,r1,r2;
 r1=rand() & (r3-1);
 r2=r3/r1;
 for (j=r2;j<r1;j++)
  {
   for (i=0;i<j;i++)
    {
     GPIO = 0b11110111;
     vdelay(r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
    }
  }
}

void noise3(uint8_t r3) // Pulse noise with different frequencies
{
 int j,r1,r2;
 r1=rand() & 2047;
 r2 = 32*r3/r1;
 for (j=0;j<r2;j++)
  {
   GPIO = 0b11110111;
   vdelay(rand() & (r3-1));
   GPIO = 0b11000000;
   vdelay(rand() & (r3-1));
  }
}

void noise5(uint8_t r3) // Long random pulses
{
 int j,r1;
 r1=rand() & (r3-1);
 for (j=0;j<r1/4;j++)
  {
   GPIO = 0b11110111;
   vdelay(r3*8);
   GPIO = 0b11000000;
   vdelay(rand());
  }
}

void noise6(uint8_t r3) // Short random clicks
{
 int j,r1;
 r1=rand() & (r3-1);
 for (j=0;j<r1/2;j++)
  {
   GPIO = 0b11110111;
   vdelay(r3*2);
   GPIO = 0b11000000;
   vdelay(rand() & 8191);
  }
}

void noise7(uint8_t r3) // PWM sweep low f to high f
{
 int i,j,r1,r2;
 r1=(rand() & (r3-1))/4;
 r2=r3/r1;
 for (j=r1;j>0;j--)
  {
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay(i*r2);
     GPIO = 0b11000000;
     vdelay((j-i)*r2);
     vdelay(rand() & ((r3-1)/4));
    }
   for (i=0;i<r1-j;i++)
    {
     GPIO = 0b11110111;
     vdelay((j-i)*r2);
     vdelay(rand() & ((r3-1)/4));
     GPIO = 0b11000000;
     vdelay(i*r2);
    }
  }
}

void main()
{
uint8_t ra[8]={2,4,4,8,16,32,64,128};
int r,r4;

 init();
 while(1)
  {
   r4=rand()&7;
   r = rand()&7;
   //r = 7;
   switch (r)
    {
     case 1:
     noise1(ra[r4]);
     //vdelay(rand());
     break;

     case 2:
     noise2(ra[r4]);
     //vdelay(rand());
     break;

     case 3:
     noise3(ra[r4]);
     //vdelay(rand());
     break;

     case 4:
     noise1(ra[r4]);
     noise4(ra[r4]);
     //vdelay(rand());
     break;

     case 5:
     noise5(ra[r4]);
     //vdelay(rand());
     break;

     case 6:
     noise6(ra[r4]);
     //vdelay(rand());
     break;

     default:
     noise7(ra[r4]);
     //vdelay(rand());
    }
  }
}

Saturday, January 12, 2013

Planar Crystal 020


The planar crystal is a device which can transport someone spatially, temporally, and inter-dimensionally upon touching.  Those who touch it accidentally may wander the multiverse searching for the way home.


Motif ES7 with PLG-150DX (used for Skrillex sounds, Waldorf Pulse, Dune (Plug-in), mixed in Reaper, Kicks from Pulse and Little Phatty, some effects using Lexicon Vortex.  Drums using BFD Eco and MPC500.  Sound effects include home made electronic drones, filter modulated bulldozer samples and glitched effects.  Audio damage Replicant, Michael Norris Drone and glitch plugins.  Final noise sweep is a Thing 1 Noise generator modulated through a Korg EMX1.  Vocals recorded with DP004 digital recorder and modified using Michael Norris FX and Replicant.  Voxengo Elephant used for mastering compression.  EHX Stereo Talking Machine used on arpeggios near the end to give vocal effects.

Thursday, September 27, 2012

Thing 2 vs. Steam Drone



In this video I do an improvisation using my Thing 2 NAND/APC/Noise drone box and Steam Drone box.



The Steam Drone is on the left.  The system combines a NAND synth with a resonant low pass filter based on the LM13700 OTA.  The LEDs use two transistors and capacitors to do flashing lights (yellow and red). The knobs control the frequency of the three NAND oscillators as well as the level of audio sent to the filter.  It turns out the filter performance depends somewhat on the input level.  the next set of knobs include Q, filter cut-off, and output volume.  The knob on the far left is a potentiometer that the input voltage passes through.  When this is all the way to the right it passes the voltage unaltered.  As you move it to the left the input current has to pass through more and more resistance essentially starving the circuit of voltage.  Starve is one of my favorite effects because the circuits get into a mode where they don't behave like they are supposed to, before they shut down completely.  Three of the switches control are used to link the NAND oscillators directly to the output, the other switch turns on the power.




The box on the right is the Thing 2 system.  This is a board I made by combining the following circuits: NAND synth, Atari Punk Console, low pass filter, zener diode noise source, blinking light circuit.  I had a bunch of layouts drawn up so I decided to combine all of these on a single board.  The noise part of the circuit was not making any noise so I kept increasing the resistor value over the op amp to increase the gain but it still would not make noise for me.  I noticed however that the whole circuit was producing noise so I settled for that.  This box has additional inputs for the control voltage of the 556 which basically controls mod and pitch.  I also added an input for the filter to process an external signal since the noise wasn't working.



Something interesting occurs on the Thing 2 when you starve the circuit.  The noise starts to become enhanced and the LEDs start having a big impact on the sound.  I was originally disappointed with the flashing light part of the circuit because the flashing of the lights is not related to the sound the device makes.  As you starve the circuit though, each time the lights flash they make a sound.  So I ended up really liking this circuit.  It was sort of a whim to combine all of these circuits on one board but I like the results a lot.  I ended up with two other indicator LEDs, yellow and green, in addition to the flashing ones, blue and red.

I had photo cube from Michael's which was big enough to hold the circuits and the knobs and I had used a photo cube for the Thing 1 device.  I came up with the idea to cut pieces of Fresnel lens and mount them on the inside surface of the photocube.  This gives a really cool effect when the lights are out.


Tuesday, September 18, 2012

Hadronistics

Hadronistics involves the study and application of Hadristors; gravitational devices which which play an essential role in FTL (Faster Than Light) transportation.

Took this one down.

This piece was done by improvising four different long sounds using home made boxes including the Thing 2 device depicted in the image.  The Thing 2 device combines an Atari Punk Console, a NAND Synth, an Odd Filter and a noise source in a single box with four LEDs, two of which are blinking.  The walls of the box are covered with fresnel lenses to give the impression of something which look larger on the inside than it does on the outside (TARDiS).  Other instruments used are an APC expanded with a capacitor array and odd filter used as input to a Bass++ drum trigger for rhythm patterns.

The Thing 1 noise source, NAND Synth 1 and 2 with VCF LPF 1, some signals were processed through a Motif with chorus, reverb, phasing and delay.  The entire sound was processed in Reaper with Apple reverb and Voxengo Elephant for compression.

Friday, September 14, 2012

Thing 2 and Steam Drone



This video demonstrates my Thing 2 device with a Steam Drone device.

Phaser, echo, reverb, and chorus added with a Motif.

Friday, August 17, 2012

Chaotic Circuits


Ian Fritz has a number of chaotic circuits on his page that look really interesting.  I thought I would start with one of the simpler ones.  This is my drawing of the Driven Damped Well chaotic oscillator.  Unfortunately this does not seem to make any sound when I power it on so I need to trouble shoot it.

Update: I did some trouble shooting but it still does not behave as expected. (chaotically) it seems to be passing the original sound to the output.  I am monitoring the NL output so I think I will switch over to the X output.

Update 2: I did more trouble shooting and switched the output to X and now it does indeed behave chaotically although in a not very usable fashion at the moment.  One thing I love about chaotic systems is that they depend on prior initial conditions.  So as you turn the knobs the circuit may not be making any sound, then you pass a point and here a blip, as you tweak around the blip you gradually bring it into oscillation.  Suddenly the oscillation goes away and you get silence again.

I have been feeding the output of an Atari Punk Console in to drive this circuit.  At some settings it has been making some overtones and clicks but they are difficult to find.

Thursday, August 16, 2012

Current DIY Projects

 These are some pictures of some current DIY synthesizer projects.  This first one is a 10 step sequencer with a 555 clock.  I used different colored LEDs for each step (not sure if this will mess up functionality yet).

The next one is my DACPOD.  This will be mounted in a case and combines a simple resonant VCF with an Atari Punk Console and my blinking light circuit to give it two flashing LEDs.
 This circuit is supposedly a snare drum but it needs a couple of capacitors and a transistor yet.

This is a Rossler Attractor chaotic oscillator circuit.  Should have put some caps on the outputs for this one.

This circuit combines (left to right) a control voltage mixer, a voltage controlled resonant low pass filter, and a NANDsynth oscillator as well as blinking LEDs along the top.  This circuit ended up as my Steam Drone box.

Saturday, August 11, 2012

Atari Punk Console


This is my layout for my Atari Punk Console.  This is about as compact as you can probably make this device without going to surface mount.  The + and - go to a switch to the battery.  The P+ supplies the positive voltage to the two pots (right side), the PP goes to the wiper of the Pitch Pot, the PM goes to the wiper of the Mod Pot, CvR provides a voltage to the two control voltage RTS 1/4 jacks and should connect to the ring of both jacks.  This will allow you to use an expression pedal to sweep pitch or mod.  Note the resistor presents too much current from flowing if you short out the connection.  The CvP goes to the tip of the pitch control voltage quarter inch, and the CvM goes to the tip of the mod control voltage quarter inch jack.  The output goes to the tip of the 1/4 right of an audio pot 10k-100k.  The wiper goes to the tip of quarter inch jack.  The sleeve of the jacks should all be connected together and grounded.

This design makes use of both modulation connections on the 556 chip so you can modulate pitch and wave shape.

This setup has the following additional components:

2 stereo 1/4 inch jacks for control voltage or expression pedal input
1 mono 1/4 inch jack for output
2 500k - 1M linear taper pots (either work) for pitch and wave form modulation
1 10k-100k audio taper pot (either should work) for volume
1 SPST toggle switch for on/off
1 battery clip or 9V supply connecter (or both)
1 case of some type, a lot of options here but I like the "Really Useful Box" series from Office Depot because they are easy to drill holes in.

Here is a video demonstration of this device:

You can use this to make a PCB.  You will have to scale to the correct size.  The spacing between the pins on the chip should be 0.1 inch.  The output will be the contact on the far right.