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());
}
}
}
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment