A simple musical instrument application using pressure and distance measuring sensors

Dependencies:   MjGP2Y0E03 mbed

Information

日本語版がこのページ下半分にあります!

Japanese version is available lower half of this page.

What is this?

Watch this video.

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

Hardware

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 (key) 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 the waveform before start the instrument operation. 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 (eighth note accuracy).

degreesol-faLED1LED2LED3
IdoONoffoff
IIreoffONoff
IIImiONONoff
IVfaoffoffON
VsolONoffON
VIlaoffONON
VIIsiONONON

Remark








これはなに?

このビデオを御覧ください.

圧力,測距センサを使った非常に単純な楽器アプリケーションです.

ハードウェア

「うちわトーン」のハードウェアはとても単純です.

2つのセンサの出力をmbedに接続.圧力センサが振幅を,距離が周波数を制御します.
音声波形はmbed内のRAMに保存されます.この音声波形がセンサからのパラメータに従って再生されます.
mbedのDAC出力を外部のアンプとスピーカと通すことによって音にします.

重要

測距センサ:GP2Y0E03は対象物からの赤外線の反射を用います.
私の場合,「うちわ」をその反射させるモノとして使いました.

でもうちわが用意できなくても凹む必要はありません
厚紙などでその代用が可能です.
uchiwa_dog

hardware

ソフトウェア

ソフトウェアによるカスタマイズが可能です.

キー/ピッチ

この楽器のキーは"C"にしてあります.
反射物(うちわ)を,その"C"の位置に持ってくると3個のLED,LED1,LED2,LED3が全て点灯します.これは私のような絶対音感の無い演奏者のために用意された仕組みです (^ ^;
この基準音(キー)はREFERENCE_TONEを「Tone_list」内の別のアイテムに設定することで変更可能です.

ピッチも変更可能です.基準音Aの周波数を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

周波数制御の方向

測距センサの出力で周波数が変わります.
デフォルト設定では測定された距離が近いほど低い音となります.
これを逆に設定するにはCONTROL_DIRECTIONをSHORT_HIGHに設定してください.

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

波形

うちわトーンではRAMに保存された音声を再生します.
波形はプション選択で変更可能です.

プログラムは楽器としての動作前に波形を計算します.計算はinit()関数から呼び出されるwaveform_generator()で行われます.

サイン波

WAVEFORM_SINがデフォルト設定となっています.サイン波を計算します.
ところで圧力センサを強く押すと振幅は100%を超えるようになっています.この場合,うちわトーンはクリッピング波形による歪んだ音を出力します.

その他の波形

その他WAVEFORM_SAWTOOTHWAVEFORM_CUSTOM_HARMONICSが用意されています. WAVEFORM_SAWTOOTHを選択すると違う音色が楽しめます.

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

WAVEFORM_CUSTOM_HARMONICS (高調波カスタマイズ)

WAVEFORM_CUSTOM_HARMONICSによって更にカスタマイズ可能です.波形は設定したパラメータを元に計算します.
この波形は高調波毎の(正規化した)周波数,振幅,位相で定義されます.

高調波の数は任意ですが,たくさん定義すると計算に時間がかかります.

#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

完全カスタム波形

もちろん波形は自由に作成したものを使うこともできます.
配列sample[16384]に一周期分の波形を保存ししてください.

ちょっとしたコツ

正確な周波数で演奏する

デフォルトの設定では,測距センサーの測定値が基準音を出すものになった時にLED1〜LED3が全て点灯するようになっています.

この他に7音階の距離を表示するオプションが用意されています. #define OPERATION_AIDを有効にしてコンパイルすると,周波数がそれぞれの範囲に入った時に,LED1〜LED3がそれを表示してくれます (1/8音精度).

degreesol-faLED1LED2LED3
IdoONoffoff
IIreoffONoff
IIImiONONoff
IVfaoffoffON
VsolONoffON
VIlaoffONON
VIIsiONONON

備考

Committer:
okano
Date:
Sun Jun 14 00:50:06 2015 +0000
Revision:
13:d20f32f4d9a0
Parent:
11:a591cfa45d4e
OPERATION_AID option added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:cc77dd0427d8 1 #include "mbed.h"
okano 7:9522d9848470 2 #include "MjGP2Y0E03.h"
okano 0:cc77dd0427d8 3
okano 9:fb5f6209a33b 4 BusOut leds( LED1, LED2, LED3 );
okano 4:c06860b7a4ea 5 DigitalOut vitalsign( LED4 );
okano 0:cc77dd0427d8 6 AnalogIn key0( p19 );
okano 0:cc77dd0427d8 7 AnalogOut ao( p18 );
okano 0:cc77dd0427d8 8
okano 7:9522d9848470 9 I2C i2c( p28, p27 );
okano 7:9522d9848470 10 MjGP2Y0E03 distanceSensor(&i2c, 0x80);
okano 0:cc77dd0427d8 11
okano 9:fb5f6209a33b 12 #define PI 3.1415926535897932384626433
okano 1:86ac6f8d9713 13 #define K 3.0
okano 7:9522d9848470 14 #define K2 12.0
okano 0:cc77dd0427d8 15
okano 7:9522d9848470 16 #define SQUELCH 0.0
okano 6:0121755ba84b 17
okano 6:0121755ba84b 18 #define N_SAMPLES 16384
okano 6:0121755ba84b 19 short *sample = (short *)0x2007c000;
okano 6:0121755ba84b 20
okano 6:0121755ba84b 21 Ticker in;
okano 1:86ac6f8d9713 22 Ticker out;
okano 6:0121755ba84b 23 int in_flag = 0;
okano 1:86ac6f8d9713 24 float amp;
okano 6:0121755ba84b 25 unsigned int count = 0;
okano 1:86ac6f8d9713 26 float ci = 1.0;
okano 7:9522d9848470 27 float ref_tone;
okano 2:225f68a31496 28
okano 3:b72b559aaee0 29 #define SHORT_HIGH 0
okano 3:b72b559aaee0 30 #define SHORT_LOW 1
okano 3:b72b559aaee0 31 #define CONTROL_DIRECTION SHORT_LOW
okano 3:b72b559aaee0 32
okano 13:d20f32f4d9a0 33 //#define OPERATION_AID
okano 13:d20f32f4d9a0 34
okano 2:225f68a31496 35 enum Tone_list {
okano 2:225f68a31496 36 Tone_A = 0,
okano 2:225f68a31496 37 Tone_Ais,
okano 4:c06860b7a4ea 38 Tone_H,
okano 2:225f68a31496 39 Tone_C,
okano 2:225f68a31496 40 Tone_Cis,
okano 2:225f68a31496 41 Tone_D,
okano 2:225f68a31496 42 Tone_Dis,
okano 2:225f68a31496 43 Tone_E,
okano 2:225f68a31496 44 Tone_Eis,
okano 2:225f68a31496 45 Tone_F,
okano 2:225f68a31496 46 Tone_G,
okano 2:225f68a31496 47 Tone_Gis,
okano 2:225f68a31496 48 };
okano 2:225f68a31496 49
okano 7:9522d9848470 50 #define REFERENCE_TONE ((float)Tone_C)
okano 7:9522d9848470 51 #define REFERENCE_PITCH 442.0
okano 7:9522d9848470 52
okano 2:225f68a31496 53 void init( void );
okano 6:0121755ba84b 54 void set_in_flag();
okano 9:fb5f6209a33b 55 void data_output();
okano 13:d20f32f4d9a0 56 int tone_indicator( float ci );
okano 2:225f68a31496 57
okano 3:b72b559aaee0 58 int main()
okano 3:b72b559aaee0 59 {
okano 2:225f68a31496 60 float ai;
okano 5:bb232622e1fc 61 int vc = 0;
okano 6:0121755ba84b 62
okano 2:225f68a31496 63 init();
okano 3:b72b559aaee0 64
okano 2:225f68a31496 65 while(1) {
okano 6:0121755ba84b 66 if ( in_flag ) {
okano 6:0121755ba84b 67 in_flag = 0;
okano 8:5af7a442e39a 68
okano 9:fb5f6209a33b 69 //
okano 9:fb5f6209a33b 70 // output amplitude
okano 9:fb5f6209a33b 71 //
okano 7:9522d9848470 72 amp = (key0 < SQUELCH) ? 0.0 : key0 * 2.0;
okano 8:5af7a442e39a 73
okano 9:fb5f6209a33b 74 //
okano 9:fb5f6209a33b 75 // output frequency
okano 9:fb5f6209a33b 76 //
okano 6:0121755ba84b 77 ai = distanceSensor.rd();
okano 3:b72b559aaee0 78
okano 3:b72b559aaee0 79 #if (CONTROL_DIRECTION == SHORT_HIGH)
okano 11:a591cfa45d4e 80 ci = (2.25 - ai * 2.0);
okano 3:b72b559aaee0 81 #else
okano 11:a591cfa45d4e 82 ci = (0.75 + ai * 2.0);
okano 3:b72b559aaee0 83 #endif
okano 13:d20f32f4d9a0 84
okano 13:d20f32f4d9a0 85 #ifdef OPERATION_AID
okano 13:d20f32f4d9a0 86 leds = tone_indicator( ci );
okano 13:d20f32f4d9a0 87 #else
okano 9:fb5f6209a33b 88 //
okano 9:fb5f6209a33b 89 // reference tone indicator
okano 9:fb5f6209a33b 90 //
okano 9:fb5f6209a33b 91 leds = 0x0;
okano 9:fb5f6209a33b 92 if ( (0.943874 < ci) && (ci < 1.05946) ) {
okano 9:fb5f6209a33b 93 leds = 0x1;
okano 9:fb5f6209a33b 94 }
okano 9:fb5f6209a33b 95 if ( (0.971532 < ci) && (ci < 1.0293) ) {
okano 9:fb5f6209a33b 96 leds = 0x3;
okano 9:fb5f6209a33b 97 }
okano 9:fb5f6209a33b 98 if ( (0.985663 < ci) && (ci < 1.01455) ) {
okano 9:fb5f6209a33b 99 leds = 0x7;
okano 9:fb5f6209a33b 100 }
okano 13:d20f32f4d9a0 101 #endif
okano 6:0121755ba84b 102 vitalsign = (vc++ >> 4) & 0x1;
okano 6:0121755ba84b 103 }
okano 2:225f68a31496 104 }
okano 2:225f68a31496 105 }
okano 0:cc77dd0427d8 106
okano 8:5af7a442e39a 107
okano 8:5af7a442e39a 108
okano 8:5af7a442e39a 109 float waveform_generator( int i )
okano 8:5af7a442e39a 110 {
okano 11:a591cfa45d4e 111 #define WAVEFORM_SIN
okano 8:5af7a442e39a 112 //#define WAVEFORM_SAWTOOTH
okano 11:a591cfa45d4e 113 //#define WAVEFORM_CUSTOM_HARMONICS
okano 8:5af7a442e39a 114
okano 8:5af7a442e39a 115 float r;
okano 8:5af7a442e39a 116
okano 8:5af7a442e39a 117 #ifdef WAVEFORM_SAWTOOTH
okano 8:5af7a442e39a 118 r = (float)i / (float)N_SAMPLES;
okano 8:5af7a442e39a 119 #endif
okano 8:5af7a442e39a 120
okano 8:5af7a442e39a 121 #ifdef WAVEFORM_SIN
okano 8:5af7a442e39a 122 r = sin( 2.0 * PI * ((float)i / (float)N_SAMPLES) );
okano 8:5af7a442e39a 123 #endif
okano 8:5af7a442e39a 124
okano 8:5af7a442e39a 125 #ifdef WAVEFORM_CUSTOM_HARMONICS
okano 8:5af7a442e39a 126
okano 8:5af7a442e39a 127 typedef struct element_st {
okano 8:5af7a442e39a 128 float frequency;
okano 8:5af7a442e39a 129 float amplitude;
okano 8:5af7a442e39a 130 float phase;
okano 8:5af7a442e39a 131 }
okano 8:5af7a442e39a 132 element;
okano 8:5af7a442e39a 133
okano 9:fb5f6209a33b 134 #define REF_AMPLITUDE 1.0
okano 9:fb5f6209a33b 135 static element e[] = {
okano 8:5af7a442e39a 136 { 1.0, REF_AMPLITUDE / 1.0, 0 * PI },
okano 8:5af7a442e39a 137 // { 2.0, REF_AMPLITUDE / 2.0, 0 * PI },
okano 8:5af7a442e39a 138 { 3.0, REF_AMPLITUDE / 3.0, 0 * PI },
okano 8:5af7a442e39a 139 // { 4.0, REF_AMPLITUDE / 4.0, 0 * PI },
okano 8:5af7a442e39a 140 { 5.0, REF_AMPLITUDE / 5.0, 0 * PI },
okano 8:5af7a442e39a 141 // { 6.0, REF_AMPLITUDE / 4.0, 0 * PI },
okano 8:5af7a442e39a 142 { 7.0, REF_AMPLITUDE / 7.0, 0 * PI },
okano 9:fb5f6209a33b 143 // { 3.33333, REF_AMPLITUDE / 2.0, 0 * PI },// nonintegral harmonics
okano 9:fb5f6209a33b 144 // { 11.9311, REF_AMPLITUDE / 2.0, 0 * PI },// nonintegral harmonics
okano 8:5af7a442e39a 145 };
okano 8:5af7a442e39a 146
okano 8:5af7a442e39a 147 float f;
okano 8:5af7a442e39a 148 r = 0.0;
okano 8:5af7a442e39a 149
okano 8:5af7a442e39a 150 for ( int x = 0; x < sizeof( e ) / sizeof( element ); x++ ) {
okano 8:5af7a442e39a 151 f = e[ x ].frequency * 2.0 * PI * ((float)i / (float)N_SAMPLES);
okano 8:5af7a442e39a 152 r += e[ x ].amplitude * cos( e[ x ].phase ) * sin( f );
okano 8:5af7a442e39a 153 r += e[ x ].amplitude * sin( e[ x ].phase ) * cos( f );
okano 8:5af7a442e39a 154 }
okano 8:5af7a442e39a 155 #endif
okano 8:5af7a442e39a 156 return ( r );
okano 8:5af7a442e39a 157 }
okano 8:5af7a442e39a 158
okano 0:cc77dd0427d8 159 void init( void )
okano 0:cc77dd0427d8 160 {
okano 9:fb5f6209a33b 161 //
okano 9:fb5f6209a33b 162 // prepare waveform table in RAM
okano 9:fb5f6209a33b 163 //
okano 3:b72b559aaee0 164 for ( int i = 0; i < N_SAMPLES; i++ ) {
okano 8:5af7a442e39a 165 sample[ i ] = (short)(32767.0 * waveform_generator( i ));
okano 0:cc77dd0427d8 166 }
okano 2:225f68a31496 167
okano 9:fb5f6209a33b 168 //
okano 9:fb5f6209a33b 169 // set reference tone coefficient
okano 9:fb5f6209a33b 170 //
okano 7:9522d9848470 171 ref_tone = (REFERENCE_PITCH * pow( 2.0, REFERENCE_TONE / 12.0 )) /K2 * K;
okano 8:5af7a442e39a 172
okano 9:fb5f6209a33b 173 // I2C clock frequency (option)
okano 6:0121755ba84b 174 i2c.frequency( 400 * 1000 );
okano 3:b72b559aaee0 175
okano 9:fb5f6209a33b 176 //
okano 9:fb5f6209a33b 177 // set periodic interrupt to sample user inputs
okano 9:fb5f6209a33b 178 //
okano 9:fb5f6209a33b 179 in.attach( &set_in_flag, 1.0 / 200.0 );
okano 7:9522d9848470 180
okano 9:fb5f6209a33b 181 //
okano 9:fb5f6209a33b 182 // set periodic interrupt to output sound data
okano 9:fb5f6209a33b 183 //
okano 9:fb5f6209a33b 184 out.attach( &data_output, 1.0 / ((float)(N_SAMPLES / K) * K2) );
okano 9:fb5f6209a33b 185
okano 9:fb5f6209a33b 186 // printf( "output sampling freq = %f kHz\r\n", ((float)(N_SAMPLES / K) * K2) / 1000.0 );
okano 0:cc77dd0427d8 187 }
okano 0:cc77dd0427d8 188
okano 6:0121755ba84b 189 void set_in_flag()
okano 6:0121755ba84b 190 {
okano 6:0121755ba84b 191 in_flag = 1;
okano 6:0121755ba84b 192 }
okano 6:0121755ba84b 193
okano 9:fb5f6209a33b 194 void data_output()
okano 6:0121755ba84b 195 {
okano 6:0121755ba84b 196 ao = 0.5 + (amp * ((float)sample[ count & 0x3FFF ] / 65536.0));
okano 7:9522d9848470 197 count += (int)(ref_tone * ci);
okano 0:cc77dd0427d8 198 }
okano 13:d20f32f4d9a0 199
okano 13:d20f32f4d9a0 200
okano 13:d20f32f4d9a0 201 int tone_indicator( float ci )
okano 13:d20f32f4d9a0 202 {
okano 13:d20f32f4d9a0 203 static float indicator_reference[] = {
okano 13:d20f32f4d9a0 204 1.0,
okano 13:d20f32f4d9a0 205 pow( 2.0, 2.0 / 12.0 ),
okano 13:d20f32f4d9a0 206 pow( 2.0, 4.0 / 12.0 ),
okano 13:d20f32f4d9a0 207 pow( 2.0, 5.0 / 12.0 ),
okano 13:d20f32f4d9a0 208 pow( 2.0, 7.0 / 12.0 ),
okano 13:d20f32f4d9a0 209 pow( 2.0, 9.0 / 12.0 ),
okano 13:d20f32f4d9a0 210 pow( 2.0, 11.0 / 12.0 ),
okano 13:d20f32f4d9a0 211 };
okano 13:d20f32f4d9a0 212 static float ratio = pow( 2.0, 1.0 / 48.0 );
okano 13:d20f32f4d9a0 213 int i;
okano 13:d20f32f4d9a0 214
okano 13:d20f32f4d9a0 215 ci = (ci < 1.0) ? ci + 1.0 : ci;
okano 13:d20f32f4d9a0 216 ci = (2.0 < ci) ? ci - 1.0 : ci;
okano 13:d20f32f4d9a0 217
okano 13:d20f32f4d9a0 218 for ( i = 0; i < sizeof( indicator_reference ) / sizeof( float ); i++ ) {
okano 13:d20f32f4d9a0 219 if ( (indicator_reference[ i ] / ratio < ci) && (ci < indicator_reference[ i ] * ratio) )
okano 13:d20f32f4d9a0 220 return ( i + 1 );
okano 13:d20f32f4d9a0 221 }
okano 13:d20f32f4d9a0 222 return ( 0 );
okano 13:d20f32f4d9a0 223 }