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());
    }
  }
}

No comments:

Post a Comment