mSynth - mbed simple synthesizer

Functionality

The mSynth, a simple synthesizer for the mbed, uses four basic peripherals: a twelve key sparkfun capacitive touch keypad, a shiftbrite peripheral, twelve pushbuttons, and a basic analog speaker. Each active-low pushbutton represents a key on a piano. When a pushbutton is held down, the mbed sends the appropriate signal through a PwmOut port. The port drives a BJT which controls the speaker. The sparkfun touch keypad uses an I2C connection to communicate with the mbed. Upon pressing a key on the touchpad, an interrupt is called in order to apply one of eight built in functions. Additionally, each key is associated with a color. The mbed uses SPI to communicate this color to the Shiftbrite in order to add visual cues to each shift in note name.

Peripherals

MPR121 Twelve Key Sparkfun Touch Keypad

/media/uploads/bassboi91/sparkfun.jpg

Shiftbrite

/media/uploads/bassboi91/shiftbrite.jpg

Pushbutton

/media/uploads/bassboi91/dip.jpg

Analog Speaker

/media/uploads/bassboi91/speaker.jpg

mbed

/media/uploads/bassboi91/diagram.jpg

Built in Functions

  • Key 0: Resets the Tone
  • Key 1: Toggles the Strobe Effect
  • Key 2: Decrements the Tonality
  • Key 3: Increments the Tonality
  • Key 4: Reserved
  • Key 5: Reserved
  • Key 6: Toggles the Shiftbrite Functionality
  • Key 7: Resets Octave to Middle C
  • Key 8: Reserved
  • Key 9: Reserved
  • Key 10: Decrements Octave
  • Key 11: Increments Octave

Configuration

/media/uploads/bassboi91/sample.jpg

Pin Configurations

/media/uploads/bassboi91/wiring_dip.jpg

/media/uploads/bassboi91/wiring_mpr.jpg

/media/uploads/bassboi91/wiring_sb.jpg

  • Analog Speaker control signal set to p21 (PwmOut)

Using the mSynth Simple Synthesizer

  • 0:00 - 0:14 : Using pushbuttons to play chromatic scale
  • 0:15 : Touching keypad 11 to increment octave
  • 0:16 - 0:20 : Continuing chromatic scale
  • 0:21 - 0:25 : Adjusting effective range with keypad 10 and 11
  • 0:25 : Touching keypad 7 to reset effective range to include middle C
  • 0:26 - 0:29 : Touching keypad 2 and 3 to adjust tonality
  • 0:29 : Touching keypad 0 to reset tonality
  • 0:30 - 0:33 : Touching keypad 1 to enable Strobe effect (Note: LED1 illuminated)
  • 0:33 : Touching keypad 6 to disable Shiftbrite
  • 0:34 - 0:37 : Continuing chromatic scale
  • 0:38 : Touching keypad 1 to disable Strobe effect
  • 0:40 : Touching keypad 6 to enable Shiftbrite
  • 0:41 - 0:47 : Touching keypad 10 to decrement effective range

Example Code

main.cpp

#include "mbed.h"
#include <mpr121.h>

//Initialize each key as a digital input.
DigitalIn C(p5);
DigitalIn Db(p6);
DigitalIn D(p7);
DigitalIn Eb(p8);
DigitalIn E(p9);
DigitalIn F(p10);
DigitalIn Gb(p14);
DigitalIn G(p15);
DigitalIn Ab(p16);
DigitalIn A(p17);
DigitalIn Bb(p18);
DigitalIn B(p19);


DigitalOut led1(LED1);
PwmOut signal(p21);

// Create the interrupt receiver object on pin 26
InterruptIn interrupt(p26);

// Setup the i2c bus on pins 9 and 10
I2C i2c(p28, p27);

// Setup the Mpr121:
// constructor(i2c object, i2c address of the mpr121)
Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);

//Scales the frequency for octaves
volatile float freq_scale = 1.0f;
volatile float tone = 0.5f;
volatile int strobe = 0;
volatile float frequency = 440.0f;
volatile int sb_enable = 1;

//Initialize Shift Bright

DigitalOut latch(p25);
DigitalOut enable(p24);

//Cycles through different colors on RGB LED
SPI spi(p11, p12, p13);

//Use SPI hardware to write color values to LED driver chip
void RGB_LED(int red, int green, int blue) {
    unsigned int low_color=0;
    unsigned int high_color=0;
    high_color=(blue<<4)|((red&0x3C0)>>6);
    low_color=(((red&0x3F)<<10)|(green));
    spi.write(high_color);
    spi.write(low_color);
    latch=1;
    latch=0;
}

// ISR
void fallInterrupt() {
  int i=0;
  //Read in value from Touch Pad
  int value=mpr121.read(0x00);
  value +=mpr121.read(0x01)<<8;
  //Shift through value, checking for pressed keys
  for (i=0; i<12; i++) {
    if (((value>>i)&0x01)==1) 
    {
        //TONE RESET
        if(i==0)
        {
            if(tone == 0.9f)
            {
                break;
            }
            tone = 0.5f;
            break;
        }
        //STROBE TOGGLE
        if(i==1)
        {
            if(strobe){
                strobe = 0;
                tone = 0.5f;
                break;
            }
            else
            {
                strobe = 1;
                tone = 0.9f;
                break;
                
            }
        }
        //TONE DOWN
        if(i==2)
        {
            if(tone == 0.9f)
            {
                break;
            }
            if(tone <= 0.2f){
                break;
            }
            else
            {
               tone = tone - 0.1f; 
               break;
            }
        }
        //TONE UP
        if(i==3)
        {
            if(tone == 0.9f)
            {
                break;
            }
            if(tone >= 0.7f){
                break;
            }
            else
            {
               tone = tone + 0.1f; 
               break;
            }
        }
        //RESERVED
        if(i==4)
        {
            break;
        }
        //RESERVED
        if(i==5)
        {
            break;
        }
        //SHIFTBRITE ENABLE
        if(i==6)
        {
            if(sb_enable){
                sb_enable = 0;
                break;
            }
            else
            {
                sb_enable = 1;
                break;
                
            }
        }
        //RETURN TO MIDDLE C
        if(i==7)
        {
            freq_scale = 1.0f;
            break;
        }
        //RESERVED
        if(i==8)
        {
            break;
        }
        //RESERVED
        if(i==9)
        {
            break;
        }
        //OCTAVE DOWN
        if(i==10)
        {
            if(freq_scale == 0.25f){
                break;
            }
            else
            {
               freq_scale = freq_scale / 2; 
               break;
            }
        }
        //OCTAVE UP
        if(i==11)
        {
            if(freq_scale == 4.0f){
                break;
            }
            else
            {
               freq_scale = freq_scale * 2; 
               break;
            }
        }
    }
  }  
}

int main() {
    //Initiliaze LEDs
    spi.format(16,0);
    spi.frequency(500000);
    enable=0;
    latch=0;
    led1 = 0;
    
    RGB_LED(00, 00, 00);
    
    //Set each key as pulled-high (active low)
    C.mode(PullUp);
    Db.mode(PullUp);
    D.mode(PullUp);
    Eb.mode(PullUp);
    E.mode(PullUp);
    F.mode(PullUp);
    Gb.mode(PullUp);
    G.mode(PullUp);
    Ab.mode(PullUp);
    A.mode(PullUp);
    Bb.mode(PullUp);
    B.mode(PullUp);
    wait(.1);
    
    //Initialize signal and frequency for signal out
    signal = tone;
    
    //Initialize interrupt
    interrupt.fall(&fallInterrupt);
    interrupt.mode(PullUp);
    
    
    
    //Executive Loop
    while(1) 
    {
      if(strobe == 1) led1 = 1;
      else led1 = 0;
      
       signal.period(1.0f/(freq_scale*frequency));
       if(!C)
       {   
            RGB_LED(sb_enable*50, sb_enable*00, sb_enable*00); 
            frequency = 261.626f;
            wait(.05);
            signal = tone;
            wait(.05);

       }
       else if(!Db)
       {
            RGB_LED(sb_enable*50, sb_enable*30, sb_enable*00);
            frequency = 277.183f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!D)
       {
             RGB_LED(sb_enable*50, sb_enable*50, sb_enable*00);
            frequency = 293.665f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!Eb)
       {
            RGB_LED(sb_enable*25, sb_enable*50, sb_enable*00);
            frequency = 311.125f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!E)
       {
            RGB_LED(sb_enable*00, sb_enable*50, sb_enable*00);
            frequency = 329.628f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!F)
       {
            RGB_LED(sb_enable*00, sb_enable*50, sb_enable*25);
            frequency = 349.228f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!Gb)
       {
            RGB_LED(sb_enable*00, sb_enable*50, sb_enable*50);
            frequency = 369.994f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!G)
       {
            RGB_LED(sb_enable*00, sb_enable*30, sb_enable*50);
            frequency = 391.995f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!Ab)
       {
            RGB_LED(sb_enable*00, sb_enable*00, sb_enable*50);
            frequency = 415.305f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!A)
       {
            RGB_LED(sb_enable*25, sb_enable*00, sb_enable*50);
            frequency = 440.00f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!Bb)
       {
            RGB_LED(sb_enable*50, sb_enable*00, sb_enable*50);
            frequency = 466.164f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else if(!B)
       {
            RGB_LED(sb_enable*50, sb_enable*00, sb_enable*25);
            frequency = 493.883f;
            wait(.05);
            signal = tone;
            wait(.05);
       }
       else
       {
            RGB_LED(00, 00, 00);
            frequency = 0.0f;
            signal = 0.0f;
       }
         
    }
}


2 comments on mSynth - mbed simple synthesizer:

15 Apr 2016

hi cooper, I would like to have try on your project. would please help me go on this task ahead of me? I would also like to know all the components required for it.

15 Apr 2016

Yo can also contact me via my email address. alex123uestc@gmail.com thank you.

Please log in to post comments.