A simple musical instrument application using pressure and distance measuring sensors

Dependencies:   MjGP2Y0E03 mbed

You are viewing an older revision! See the latest version

Homepage

What is this?

Watch this video.

A very simple musical instrument application using pressure and distance measuring sensors.

Haedware

The uchiwa tone has very simple hardware.

  • Microcontroller module : mbed LPC1768
  • Pressure sensor : Interlink Electronics FSR400
  • Distance measuring sensor : Sharp GP2Y0E03

The two sensor output goes into mbed, the pressure sensor controls the sound amplitude and distance controls frequency.
Sound waveform is stored on RAM in mbed. This waveform is played with those sensor parameters.
Output comes from DAC output of mbed, so the output becomes sound through external amplifier and speaker.

IMPORTANT

The distance measuring sensor GP2Y0E03 uses infra-red light reflection from objects.
In my case, for the reflecting object, I used "uchiwa (a Japanese fan)" is used.

Don't be so pessimistic, if you don't have the uchiwa.
It may be OK to use enough size of cardboard or something ;)

uchiwa_dog

hardware

Software

Some customization can be done in software.

Key/Pitch

The key of this instrument is made as "C".
When you get the (reflecting object's) distance of the "C", all 3 LED1, LED2 and LED3 will be turned-ON. This is a mechanism to help the player who does not have perfect pitch like me ;)
This reference tone can be changed by REFERENCE_TONE which is set as an item from "Tone_list".

Pitch can be controlled also. Edit the frequency for "A" by REFERENCE_PITCH.

enum Tone_list {
    Tone_A      = 0,
    Tone_Ais,
    Tone_H,
    Tone_C,
    Tone_Cis,
    Tone_D,
    Tone_Dis,
    Tone_E,
    Tone_Eis,
    Tone_F,
    Tone_G,
    Tone_Gis,
};

#define     REFERENCE_TONE  ((float)Tone_C)
#define     REFERENCE_PITCH 442.0

Frequency control direction

The distance measuring sensor output controls the frequency.
Default setting is it generates lower frequency when the distance is shorter.
If you need opposite direction of frequency control, set CONTROL_DIRECTION as SHORT_HIGH.

#define     SHORT_HIGH  0
#define     SHORT_LOW   1
#define     CONTROL_DIRECTION   SHORT_LOW

Waveform

The uchiwa tone plays sound which is stored in RAM.
This waveform can be changed by selecting options.

The program calculates waveform at beginning of the program. The calculation is done in function of init() calling waveform_generator().

Sin wave

The default setting is WAVEFORM_SIN. That calculate sin wave.
By the way, if user press the pressure sensor strong, the amplitude becomes over 100%. The uchiwa tone handles this high amplitude situation as clipping, which becomes distortion.

Other waveform

WAVEFORM_SAWTOOTH and WAVEFORM_CUSTOM_HARMONICS options are available also. The WAVEFORM_SAWTOOTH may give different sound taste.

float waveform_generator( int i )
{
#define WAVEFORM_SIN
//#define WAVEFORM_SAWTOOTH
//#define WAVEFORM_CUSTOM_HARMONICS

WAVEFORM_CUSTOM_HARMONICS

The WAVEFORM_CUSTOM_HARMONICS gives you more options. The waveform is calculated with given parameters.
The waveform can be defined by each harmonics' (normalized) frequency, amplitude and phase.

The number of harmonics is arbitrary but if many harmonics are defined, it will take time.

#ifdef  WAVEFORM_CUSTOM_HARMONICS

    typedef struct  element_st {
        float   frequency;
        float   amplitude;
        float   phase;
    }
    element;

#define REF_AMPLITUDE   1.0
    static element e[] = {
        { 1.0,      REF_AMPLITUDE / 1.0,    0 * PI },
        { 3.0,      REF_AMPLITUDE / 3.0,    0 * PI },
        { 5.0,      REF_AMPLITUDE / 5.0,    0 * PI },
        { 3.33333,  REF_AMPLITUDE / 2.0,    0 * PI },//  nonintegral harmonics
    };

    float   f;
    r   = 0.0;

    for ( int x = 0; x < sizeof( e ) / sizeof( element ); x++ ) {
        f   = e[ x ].frequency * 2.0 * PI * ((float)i / (float)N_SAMPLES);
        r  += e[ x ].amplitude * cos( e[ x ].phase ) * sin( f );
        r  += e[ x ].amplitude * sin( e[ x ].phase ) * cos( f );
    }
#endif

Fully custom waveform

Of course you can make the waveform anything you want.
Fill up sample[16384] array with one cycle of your waveform.

Tips

Playing in right frequency

In default setting, when the distance measuring sensor gets distance for reference tone, all 3 LED1, LED2 and LED3 will be turned-ON.

There is an option to indicate the distance in heptatonic scale intervals. If the code compiled with #define OPERATION_AID, the LED, LED2 and LED3 will show the frequency is in those range.

degreesol-faLED1LED2LED3
IdoONoffoff
IIreoffONoff
IIImiONONoff
IVfaoffoffON
VsolONoffON
VIlaoffONON
VIIsiONONON

Remark


All wikipages