
A simple musical instrument application using pressure and distance measuring sensors
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 ;)
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.
degree | sol-fa | LED1 | LED2 | LED3 |
---|---|---|---|---|
I | do | ON | off | off |
II | re | off | ON | off |
III | mi | ON | ON | off |
IV | fa | off | off | ON |
V | sol | ON | off | ON |
VI | la | off | ON | ON |
VII | si | ON | ON | ON |
Remark¶
- Thank you Takashi Matsuoka san for providing GP2Y0E03 library. I'm using Matsuoka-san's library with small tweaks for my purpose.
- "Uchiwa" Illustration by http://www.wanpagu.sakura.ne.jp/summer20.html