8pinoで圧電スピーカーを鳴らす その5
もう、飽きましたよね
8pinoで圧電スピーカーから曲を流すのはこれが最終回です。
発端は
前回の輪唱 を家族に自慢しに行った時の話です。
(私)「スゴいでしょ、これ!」
(家)「ウーン、すごさがよくわからないよ。輪唱もそんなに好きじゃないし」
(私)「…じゃあ、なんなら良いのさ!」
(家)「やっぱり、別々の旋律/和音を聞きたいでしょう。合唱とか、ピアノの曲とか」
(私)「ほぅ。例えば?」
(家)「合唱なら『ふるさと』、ピアノは『 パッフェルベルのカノン 』が好き」
と言うわけで 今度は、上記の2つを実現してみます。
早速、結果からどうぞ。
文部省唱歌 故郷(ふるさと) 合唱Ver.
ブザー音なのに、哀愁漂います。
パッフェルベルのカノン 両手Ver.
Johann Pachelbel : Canon in C.
エンドレスリピートな曲に仕上がりました。ちょっとペース早いかなぁ。
苦労した点とか
輪唱は良かったんです。だって、演奏するデータは、どっちのスピーカーも同じで良いので。
別々の旋律と言うことは、メモリも2倍、データ入力作業も2倍必要です。 例えばカノンの例だと、入力作業に1時間程かかっています。
「ふるさと」のコードはこちら
#include <Adafruit_NeoPixel.h> #ifdef __AVR_ATtiny85__ // Trinket, Gemma, etc. #include <avr/power.h> #endif #define NEOPIXEL_IN_PIN 0 #define NUM_OF_PIXELS 16 #define NEOPIXEL_BRIGHTNESS 30 Adafruit_NeoPixel pixels = Adafruit_NeoPixel( NUM_OF_PIXELS, NEOPIXEL_IN_PIN ); // Definitions #define _8PINO_TONE_START ( 0x00 ) #define _8PINO_TONE_STOP ( 0x01 ) #define _8PINO_TONE_NOT_USED ( 0 ) #define _8PINO_TONE_SO_2 ( 158 ) #define _8PINO_TONE_RA_2 ( 141 ) #define _8PINO_TONE_SI_2 ( 126 ) #define _8PINO_TONE_DO_3 ( 118 ) #define _8PINO_TONE_RE_3 ( 106 ) #define _8PINO_TONE_MI_3 ( 94 ) #define _8PINO_TONE_FA_3 ( 89 ) #define _8PINO_TONE_FA_SH_3 ( 83 ) #define _8PINO_TONE_SO_3 ( 79 ) #define _8PINO_TONE_RA_3 ( 70 ) #define _8PINO_TONE_SI_3 ( 62 ) #define _8PINO_TONE_DO_4 ( 59 ) #define _8PINO_TONE_RE_4 ( 52 ) #define _8PINO_TONE_MI_4 ( 46 ) // Global variables #define _8PINO_TONE_SPEAKER_PIN_1 ( 1 ) #define _8PINO_TONE_SPEAKER_PIN_2 ( 4 ) #define SIZE_OF_TONE_ARRAY ( 192 ) PROGMEM prog_uint16_t noteArray1[] = { // U-Sa-Gi O-I-Shi Ka-No-Ya-Ma- _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RE_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, // Ko-Bu-Na-Tsu-Ri-Shi Ka-No-Ka-Wa- _8PINO_TONE_DO_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RE_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_MI_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, // Yu-Me-Ha-I-Ma-Mo-Me-Gu-Ri-Te _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_SO_3, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RE_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_SI_3, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_RE_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_DO_4, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, // Wa-Su-Re-Ga-Ta-Ki Hu-Ru-Sa-To _8PINO_TONE_RE_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RE_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RE_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, }; PROGMEM prog_uint16_t noteArray2[] = { // U-Sa-Gi O-I-Shi Ka-No-Ya-Ma- _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, // Ko-Bu-Na-Tsu-Ri-Shi Ka-No-Ka-Wa- _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RE_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, // Yu-Me-Ha-I-Ma-Mo-Me-Gu-Ri-Te _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_MI_3, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RE_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_FA_SH_3, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_SO_3, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_DO_4, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, // Wa-Su-Re-Ga-Ta-Ki Hu-Ru-Sa-To _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_SH_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, }; void setup(){ // Initialize PIN mode. pinMode( _8PINO_TONE_SPEAKER_PIN_1, OUTPUT ); pinMode( _8PINO_TONE_SPEAKER_PIN_2, OUTPUT ); // Configure Registers for PWM of PB1(PIN No.1) // 1. Waveform Generation Mode -> Fast PWM // 2. Clock Select -> 8MHz/256 = 32KHz. // 3. Compare Match Output B Mode // -> Clear OC0A/OC0B on Compare Match, // set OC0A/OC0B at BOTTOM TCCR0A = _BV (COM0B1) | _BV (WGM01) | _BV (WGM00); TCCR0B = _BV (WGM02) | _BV (CS02); // Configure Registers for PWM of PB4(PIN No.4) // 1. Comparator A Mode -> Set the OC1A output line. // 2. Time/Counter1 Prescale Select -> 8MHz/256 = 32KHz. // 3. Enable Pulse Width Modulator B. // 4. Comparator B Mode -> Set the OC1B output line TCCR1 = _BV (COM1A1) | _BV (COM1A0) | _BV (CS13) | _BV (CS10); GTCCR = _BV (PWM1B) | _BV (COM1B1) | _BV (COM1B0); // NeoPixel LED pinMode( NEOPIXEL_IN_PIN, OUTPUT ); #ifdef __AVR_ATtiny85__ // Trinket, Gemma, etc. if( F_CPU == 16000000 ) clock_prescale_set( clock_div_1 ); #endif pixels.begin(); pixels.setBrightness( NEOPIXEL_BRIGHTNESS ); pixels.show(); // Initialize all pixels to "off" } void loop(){ for( int count = 0; count < SIZE_OF_TONE_ARRAY; count++ ) { if( pgm_read_word( ¬eArray1[count] ) == _8PINO_TONE_NOT_USED ){ // Do Nothing. }else if( pgm_read_word( ¬eArray1[count] ) == _8PINO_TONE_STOP ){ _8pinoTone( _8PINO_TONE_SPEAKER_PIN_1, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP ); _8pinoTone( _8PINO_TONE_SPEAKER_PIN_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_1, _8PINO_TONE_STOP ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_2, _8PINO_TONE_STOP ); }else{ _8pinoTone( _8PINO_TONE_SPEAKER_PIN_1, pgm_read_word( ¬eArray1[count] ), _8PINO_TONE_START ); _8pinoTone( _8PINO_TONE_SPEAKER_PIN_2, pgm_read_word( ¬eArray2[count] ), _8PINO_TONE_START ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_1, pgm_read_word( ¬eArray1[count] ) ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_2, pgm_read_word( ¬eArray2[count] ) ); } pixels.show(); delay( 8000 / OCR0A ); } } void _8pinoTone( int pin_speaker, uint8_t freq, uint8_t startstop ){ if( startstop == _8PINO_TONE_START ){ pinMode( pin_speaker, OUTPUT ); if( pin_speaker == _8PINO_TONE_SPEAKER_PIN_1 ){ OCR0A = freq; OCR0B = OCR0A - 1; }else{ OCR1C = freq; OCR1B = OCR1C - 1; } }else{ pinMode( pin_speaker, INPUT ); } } void setNeopixelColor( int speaker_id, int tone ){ uint8_t led_index = 0; int i = 0; if( speaker_id == _8PINO_TONE_SPEAKER_PIN_1 ){ switch( tone ){ case _8PINO_TONE_RE_3: led_index = 12; break; case _8PINO_TONE_FA_SH_3: led_index = 14; break; case _8PINO_TONE_SO_3: led_index = 15; break; case _8PINO_TONE_RA_3: led_index = 0; break; case _8PINO_TONE_SI_3: led_index = 1; break; case _8PINO_TONE_DO_4: led_index = 2; break; case _8PINO_TONE_RE_4: led_index = 3; break; case _8PINO_TONE_MI_4: led_index = 3; break; } if( tone == _8PINO_TONE_STOP ){ for( i = 0; i < 4; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } for( i = 12; i < 16; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } }else{ for( i = 0; i < 4; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } for( i = 12; i < 16; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } if( led_index < 4 ){ for( i = 0; i < led_index + 1; i++ ){ pixels.setPixelColor( i, 255, 0, 0 ); } for( i = 12; i < 16; i++ ){ pixels.setPixelColor( i, 255, 0, 0 ); } }else{ for( i = 12; i < led_index + 1; i++ ){ pixels.setPixelColor( i, 255, 0, 0 ); } } } }else{ switch( tone ){ case _8PINO_TONE_RE_3: led_index = 11; break; case _8PINO_TONE_MI_3: led_index = 10; break; case _8PINO_TONE_FA_SH_3: led_index = 9; break; case _8PINO_TONE_SO_3: led_index = 8; break; case _8PINO_TONE_RA_3: led_index = 7; break; case _8PINO_TONE_SI_3: led_index = 6; break; case _8PINO_TONE_DO_4: led_index = 5; break; } if( tone == _8PINO_TONE_STOP ){ for( i = 5; i < 12; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } }else{ for( i = 5; i < 12; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } for( i = led_index; i < 12; i++ ){ pixels.setPixelColor( i, 0, 255, 0); } } } }
「カノン」のコードはこちら
#include <Adafruit_NeoPixel.h> #ifdef __AVR_ATtiny85__ // Trinket, Gemma, etc. #include <avr/power.h> #endif #define NEOPIXEL_IN_PIN 0 #define NUM_OF_PIXELS 16 #define NEOPIXEL_BRIGHTNESS 30 Adafruit_NeoPixel pixels = Adafruit_NeoPixel( NUM_OF_PIXELS, NEOPIXEL_IN_PIN ); // Definitions #define _8PINO_TONE_START ( 0x00 ) #define _8PINO_TONE_STOP ( 0x01 ) #define _8PINO_TONE_NOT_USED ( 0 ) #define _8PINO_TONE_DO_2 ( 238 ) #define _8PINO_TONE_RE_2 ( 212 ) #define _8PINO_TONE_MI_2 ( 189 ) #define _8PINO_TONE_FA_2 ( 178 ) #define _8PINO_TONE_SO_2 ( 158 ) #define _8PINO_TONE_RA_2 ( 141 ) #define _8PINO_TONE_SI_2 ( 126 ) #define _8PINO_TONE_DO_3 ( 118 ) #define _8PINO_TONE_RE_3 ( 106 ) #define _8PINO_TONE_MI_3 ( 94 ) #define _8PINO_TONE_FA_3 ( 89 ) #define _8PINO_TONE_FA_SH_3 ( 83 ) #define _8PINO_TONE_SO_3 ( 79 ) #define _8PINO_TONE_RA_3 ( 70 ) #define _8PINO_TONE_SI_3 ( 62 ) #define _8PINO_TONE_SI_FL_3 ( 66 ) #define _8PINO_TONE_DO_4 ( 59 ) #define _8PINO_TONE_RE_4 ( 52 ) #define _8PINO_TONE_MI_4 ( 46 ) #define _8PINO_TONE_FA_4 ( 44 ) #define _8PINO_TONE_SO_4 ( 39 ) #define _8PINO_TONE_RA_4 ( 34 ) // 35 // Global variables #define _8PINO_TONE_SPEAKER_PIN_1 ( 1 ) #define _8PINO_TONE_SPEAKER_PIN_2 ( 4 ) #define SIZE_OF_TONE_ARRAY ( 12 * 16 ) PROGMEM prog_uint16_t noteArray1[] = { // 1 _8PINO_TONE_SO_4, _8PINO_TONE_STOP, _8PINO_TONE_MI_4, _8PINO_TONE_FA_4, _8PINO_TONE_SO_4, _8PINO_TONE_STOP, _8PINO_TONE_MI_4, _8PINO_TONE_FA_4, _8PINO_TONE_SO_4, _8PINO_TONE_SO_3, _8PINO_TONE_RA_3, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_RE_4, _8PINO_TONE_MI_4, _8PINO_TONE_FA_4, _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_RE_4, _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_MI_3, _8PINO_TONE_FA_3, _8PINO_TONE_SO_3, _8PINO_TONE_RA_3, _8PINO_TONE_SO_3, _8PINO_TONE_FA_3, _8PINO_TONE_SO_3, _8PINO_TONE_MI_3, _8PINO_TONE_FA_3, _8PINO_TONE_SO_3, _8PINO_TONE_FA_3, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_SO_3, _8PINO_TONE_FA_3, _8PINO_TONE_STOP, _8PINO_TONE_MI_3, _8PINO_TONE_RE_3, _8PINO_TONE_MI_3, _8PINO_TONE_RE_3, _8PINO_TONE_DO_3, _8PINO_TONE_RE_3, _8PINO_TONE_MI_3, _8PINO_TONE_FA_3, _8PINO_TONE_SO_3, _8PINO_TONE_RA_3, _8PINO_TONE_FA_3, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_SO_3, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_DO_3, _8PINO_TONE_SO_3, _8PINO_TONE_RA_3, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_RE_4, _8PINO_TONE_MI_4, _8PINO_TONE_FA_4, _8PINO_TONE_SO_4, // 5 _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_RE_4, _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_RE_4, _8PINO_TONE_DO_4, _8PINO_TONE_RE_4, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_RE_4, _8PINO_TONE_MI_4, _8PINO_TONE_RE_4, _8PINO_TONE_DO_4, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_STOP, _8PINO_TONE_DO_3, _8PINO_TONE_RE_3, _8PINO_TONE_MI_3, _8PINO_TONE_FA_3, _8PINO_TONE_MI_3, _8PINO_TONE_RE_3, _8PINO_TONE_MI_3, _8PINO_TONE_DO_4, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_SI_3, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_FA_3, _8PINO_TONE_SO_3, _8PINO_TONE_FA_3, _8PINO_TONE_MI_3, _8PINO_TONE_FA_3, _8PINO_TONE_SO_3, _8PINO_TONE_RA_3, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_RA_3, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_RE_4, _8PINO_TONE_DO_4, _8PINO_TONE_SI_3, _8PINO_TONE_DO_4, _8PINO_TONE_RA_3, _8PINO_TONE_SI_3, // 9 _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_4, _8PINO_TONE_STOP, _8PINO_TONE_SO_4, _8PINO_TONE_STOP, _8PINO_TONE_RA_4, _8PINO_TONE_STOP, _8PINO_TONE_SO_4, _8PINO_TONE_STOP, _8PINO_TONE_FA_4, _8PINO_TONE_STOP, _8PINO_TONE_MI_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_FA_4, _8PINO_TONE_STOP, _8PINO_TONE_MI_4, _8PINO_TONE_STOP, _8PINO_TONE_RE_4, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_STOP, _8PINO_TONE_SI_FL_3, _8PINO_TONE_STOP, _8PINO_TONE_RA_3, _8PINO_TONE_STOP, _8PINO_TONE_SI_FL_3, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_3, _8PINO_TONE_STOP, _8PINO_TONE_FA_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_4, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, }; PROGMEM prog_uint16_t noteArray2[] = { // 1 _8PINO_TONE_DO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_MI_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, // 5 _8PINO_TONE_DO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_MI_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, // 9 _8PINO_TONE_DO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_MI_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_3, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_MI_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_DO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_MI_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_FA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_RA_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SO_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, _8PINO_TONE_SI_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP, }; void setup(){ // Initialize PIN mode. pinMode( _8PINO_TONE_SPEAKER_PIN_1, OUTPUT ); pinMode( _8PINO_TONE_SPEAKER_PIN_2, OUTPUT ); // Configure Registers for PWM of PB1(PIN No.1) // 1. Waveform Generation Mode -> Fast PWM // 2. Clock Select -> 8MHz/256 = 32KHz. // 3. Compare Match Output B Mode // -> Clear OC0A/OC0B on Compare Match, // set OC0A/OC0B at BOTTOM TCCR0A = _BV (COM0B1) | _BV (WGM01) | _BV (WGM00); TCCR0B = _BV (WGM02) | _BV (CS02); // Configure Registers for PWM of PB4(PIN No.4) // 1. Comparator A Mode -> Set the OC1A output line. // 2. Time/Counter1 Prescale Select -> 8MHz/256 = 32KHz. // 3. Enable Pulse Width Modulator B. // 4. Comparator B Mode -> Set the OC1B output line TCCR1 = _BV (COM1A1) | _BV (COM1A0) | _BV (CS13) | _BV (CS10); GTCCR = _BV (PWM1B) | _BV (COM1B1) | _BV (COM1B0); // NeoPixel LED pinMode( NEOPIXEL_IN_PIN, OUTPUT ); #ifdef __AVR_ATtiny85__ // Trinket, Gemma, etc. if( F_CPU == 16000000 ) clock_prescale_set( clock_div_1 ); #endif pixels.begin(); pixels.setBrightness( NEOPIXEL_BRIGHTNESS ); pixels.show(); // Initialize all pixels to "off" } void loop(){ for( int count = 0; count < SIZE_OF_TONE_ARRAY; count++ ) { if( pgm_read_word( ¬eArray1[count] ) == _8PINO_TONE_NOT_USED ){ // Do Nothing. }else if( pgm_read_word( ¬eArray1[count] ) == _8PINO_TONE_STOP ){ _8pinoTone( _8PINO_TONE_SPEAKER_PIN_1, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_1, _8PINO_TONE_STOP ); }else{ _8pinoTone( _8PINO_TONE_SPEAKER_PIN_1, pgm_read_word( ¬eArray1[count] ), _8PINO_TONE_START ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_1, pgm_read_word( ¬eArray1[count] ) ); } if( pgm_read_word( ¬eArray2[count] ) == _8PINO_TONE_NOT_USED ){ // Do Nothing. }else if( pgm_read_word( ¬eArray2[count] ) == _8PINO_TONE_STOP ){ _8pinoTone( _8PINO_TONE_SPEAKER_PIN_2, _8PINO_TONE_NOT_USED, _8PINO_TONE_STOP ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_2, _8PINO_TONE_STOP ); }else{ _8pinoTone( _8PINO_TONE_SPEAKER_PIN_2, pgm_read_word( ¬eArray2[count] ), _8PINO_TONE_START ); setNeopixelColor( _8PINO_TONE_SPEAKER_PIN_2, pgm_read_word( ¬eArray2[count] ) ); } pixels.show(); delay( 8000 / OCR0A ); } } void _8pinoTone( int pin_speaker, uint8_t freq, uint8_t startstop ){ if( startstop == _8PINO_TONE_START ){ pinMode( pin_speaker, OUTPUT ); if( pin_speaker == _8PINO_TONE_SPEAKER_PIN_1 ){ OCR0A = freq; OCR0B = OCR0A - 1; }else{ OCR1C = freq; OCR1B = OCR1C - 1; } }else{ pinMode( pin_speaker, INPUT ); } } void setNeopixelColor( int speaker_id, int tone ){ uint8_t led_index = 0; int i = 0; int highlight = 0; if( speaker_id == _8PINO_TONE_SPEAKER_PIN_1 ){ switch( tone ){ case _8PINO_TONE_DO_3: led_index = 12; break; case _8PINO_TONE_RE_3: led_index = 12; highlight = 1; break; case _8PINO_TONE_MI_3: led_index = 13; break; case _8PINO_TONE_FA_3: led_index = 13; highlight = 1; break; case _8PINO_TONE_SO_3: led_index = 14; break; case _8PINO_TONE_RA_3: led_index = 14; highlight = 1; break; case _8PINO_TONE_SI_3: led_index = 15; break; case _8PINO_TONE_DO_4: led_index = 15; highlight = 1; break; case _8PINO_TONE_RE_4: led_index = 0; break; case _8PINO_TONE_MI_4: led_index = 0; highlight = 1; break; case _8PINO_TONE_FA_4: led_index = 1; break; case _8PINO_TONE_SO_4: led_index = 1; highlight = 1; break; case _8PINO_TONE_RA_4: led_index = 2; break; default: led_index = 12; break; } if( tone == _8PINO_TONE_STOP ){ for( i = 0; i < 4; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } for( i = 12; i < 16; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } }else{ for( i = 0; i < 4; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } for( i = 12; i < 16; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } if( led_index < 4 ){ for( i = 0; i < led_index + 1; i++ ){ pixels.setPixelColor( i, 255, 0, 0 ); } for( i = 12; i < 16; i++ ){ pixels.setPixelColor( i, 255, 0, 0 ); } }else{ for( i = 12; i < led_index + 1; i++ ){ pixels.setPixelColor( i, 255, 0, 0 ); } } if( highlight == 1 ){ pixels.setPixelColor( led_index, 255, 255, 255 ); } } }else{ switch( tone ){ case _8PINO_TONE_DO_2: led_index = 11; break; case _8PINO_TONE_MI_2: led_index = 10; break; case _8PINO_TONE_FA_2: led_index = 9; break; case _8PINO_TONE_SO_2: led_index = 8; break; case _8PINO_TONE_RA_2: led_index = 7; break; case _8PINO_TONE_SI_2: led_index = 6; break; case _8PINO_TONE_DO_3: led_index = 5; break; default: led_index = 11; break; } if( tone == _8PINO_TONE_STOP ){ for( i = 5; i < 12; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } }else{ for( i = 5; i < 12; i++ ){ pixels.setPixelColor( i, 0, 0, 0 ); } for( i = led_index; i < 12; i++ ){ pixels.setPixelColor( i, 0, 255, 0); } } } }
以上で
8pinoコンサートは終演となります。
お付き合い頂き、ありがとうございました。