書式 | 引数 | 説明 |
Keypad::Keypad(char userKeymap, byte rowPins, byte colPins, byte rows, byte cols) |
userKeymap:キー配列 rowPins:行ピンNo配列 colPins:列ピンNo配列 rows:行数 cols:列数 |
KeyPadオブジェクトを作成し、 ピンを割り当てる |
Keypad::makeKeymap(char hexKeymap) | hexKeymap:キー配列 | キーマップ作成 |
char Keypad::getKey() | 押されたキーを取得 |
/************************************************* * pitches.h : 音階(NOTE_B0 - DS8)の周波数(Hz)を定義 * https://www.arduino.cc/en/Tutorial/ToneMelody * Public Constants *************************************************/ #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 … #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978
/************************************************* * 【melodyList.h】 メロディ リスト * [0] 音階 [ NOTE_xx, 0:休符 ] * [1] 音の長さ[ 4:四分音符, 8:八分音符 ] *------------------------------------------------- * ①ドレミの歌 [ドレミファソラシド] * ②きらきらぼし * ③ゆかいな牧場 * ④にんげんっていいな * ⑤おもちゃのチャチャチャ ************************************************/ // 音階の周波数(Hz) #include "pitches.h" #define NOTE 0 // 音階 #define DURATIONS 1 // 音の長さ //------------------------------------------------- // ドレミの歌 //------------------------------------------------- // ド[C] int aryMelodyC[][7] = { { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_E4, NOTE_C4, NOTE_E4 }, { 2, 4, 2, 4, 2, 2, 2 } }; // レ[D] int aryMelodyD[][7] = { { NOTE_D4, NOTE_E4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_F4 }, { 2, 4, 2, 4, 2, 2, 2 } }; // ミ[E] int aryMelodyE[][7] = { { NOTE_E4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_G4, NOTE_E4, NOTE_G4 }, { 2, 4, 2, 4, 2, 2, 2 } }; // ファ[F] int aryMelodyF[][7] = { { NOTE_F4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_A4 }, { 2, 4, 8, 8, 8, 8, 2 } }; // ソ[G] int aryMelodyG[][7] = { { NOTE_G4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4 }, { 2, 4, 8, 8, 8, 8, 2 } }; // ラ[A] int aryMelodyA[][7] = { { NOTE_A4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4 }, { 2, 4, 8, 8, 8, 8, 2 } }; // シ[B] int aryMelodyB[][7] = { { NOTE_B4, NOTE_E4, NOTE_FS4, NOTE_GS4, NOTE_A4, NOTE_B4, NOTE_C5 }, { 2, 4, 8, 8, 8, 8, 2 } }; // ド[C5] int aryMelodyC5[][7] = { { NOTE_B4, NOTE_B4, NOTE_A4, NOTE_F4, NOTE_B4, NOTE_G4, NOTE_C5 }, { 8, 8, 4, 4, 4, 4, 2 } }; // C4 -> C5 int aryMelodyC4_C5[][8] = { { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 }, { 4, 4, 4, 4, 4, 4, 4, 4 } }; // C5 -> C4 int aryMelodyC5_C4[][8] = { { NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4 }, { 4, 4, 4, 4, 4, 4, 4, 4 } }; //------------------------------------------------- // きらきらぼし //------------------------------------------------- int aryMelodyStar[][14] = { { NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4}, { 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 2 } }; //------------------------------------------------- // ゆかいな牧場 //------------------------------------------------- int aryMelodyCow[][13] = { { NOTE_G4, NOTE_G4, NOTE_G4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_D4, 0, NOTE_B4, NOTE_B4, NOTE_A4, NOTE_A4, NOTE_G4 }, { 8, 8, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, 2 } }; //------------------------------------------------- // にんげんっていいな //------------------------------------------------- int aryMelodyHuman[][14] = { { NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_D4, NOTE_C4, 0, NOTE_E4, NOTE_E4, 0, NOTE_G4, NOTE_F4, NOTE_D4, NOTE_E4 }, { 4, 4, 4, 4, 4, 4, 8, 2, 4, 16, 8, 4, 4, 4 } }; //------------------------------------------------- // おもちゃのチャチャチャ //------------------------------------------------- int aryMelodyCha[][24] = { { NOTE_C4, NOTE_C4, NOTE_C4, NOTE_E4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_GS4, NOTE_G4, NOTE_B4, NOTE_C5 }, { 8, 8, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 } };
/************************************************** * 【 Elegoo:11 】膜(メンブレイン)スイッチモジュール * キーパッドでミュージックボックス *************************************************/ /*--------------------------------------------*/ /* Keypadライブラリ */ /*--------------------------------------------*/ #include <keypad .h> // 行列数 const byte bytRows = 4; // 行数 const byte bytCols = 4; // 列数 // 行列ピンNo byte aryRowPins[bytRows] = {9, 8, 7, 6}; // 行ピンNo byte aryColPins[bytCols] = {5, 4, 3, 2}; // 列ピンNo // キー配列 char hexKeymap[bytRows][bytCols] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; // Keypadオブジェクトを作成 Keypad objKeypad = Keypad( makeKeymap(hexKeymap), // キーマップ作成 aryRowPins, aryColPins, // 行列ピンNo bytRows, bytCols // 行列数 ); /*--------------------------------------------*/ /* ブザー */ /*--------------------------------------------*/ // ピンの定義 #define BUZZER 12 // D12 /*--------------------------------------------*/ /* メロディ */ /*--------------------------------------------*/ #include "pitches.h" // 音階の周波数(Hz) #include "melodyList.h" // メロディリスト /*****************************************/ /* 関数名:メロディ 出力 */ /* 引数:rAryNote [音階 ] */ /* :rAryDurations [音の長さ] */ /* :rBytNoteNum [音階総数] */ /*****************************************/ void outputMelody( int *rAryNote, int *rAryDurations, byte rBytNoteNum){ // -------------------------------------------------- // 音階数の周波数を音の長さだけ出力する // -------------------------------------------------- for( int i = 0; i < rBytNoteNum; i++){ tone( BUZZER, rAryNote[i],( 1000 / rAryDurations[i] ) ); delay( 500 ); //演奏速度 } // -------------------------------------------------- // 周波数の出力を停止する // -------------------------------------------------- noTone( BUZZER ); delay( 500 ); } /********/ /* loop */ /********/ void loop() { byte bytNoteNum; // 音階総数 // 押されたキーを取得する char chrKey = objKeypad.getKey(); // -------------------------------------------------- // 押されたキー別にメロディを出力する // メロディ[0] 音階 // メロディ[1] 音の長さ // -------------------------------------------------- if (chrKey){ switch(chrKey){ // -------------------------------------------------- // 1:ド case '1': // 音階総数 bytNoteNum = sizeof( aryMelodyC[NOTE] ) / sizeof( aryMelodyC[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyC[NOTE], aryMelodyC[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 2:レ case '2': // 音階総数 bytNoteNum = sizeof( aryMelodyD[NOTE] ) / sizeof( aryMelodyD[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyD[NOTE], aryMelodyD[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 3:ミ case '3': // 音階総数 bytNoteNum = sizeof( aryMelodyE[NOTE] ) / sizeof( aryMelodyE[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyE[NOTE], aryMelodyE[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 4:ファ case '4': // 音階総数 bytNoteNum = sizeof( aryMelodyF[NOTE] ) / sizeof( aryMelodyF[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyF[NOTE], aryMelodyF[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 5:ソ case '5': // 音階総数 bytNoteNum = sizeof( aryMelodyG[NOTE] ) / sizeof( aryMelodyG[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyG[NOTE], aryMelodyG[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 6:ラ case '6': // 音階総数 bytNoteNum = sizeof( aryMelodyA[NOTE] ) / sizeof( aryMelodyA[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyA[NOTE], aryMelodyA[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 7:シ case '7': // 音階総数 bytNoteNum = sizeof( aryMelodyB[NOTE] ) / sizeof( aryMelodyB[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyB[NOTE], aryMelodyB[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 8:ド case '8': // 音階総数 bytNoteNum = sizeof( aryMelodyC5[NOTE] ) / sizeof( aryMelodyC5[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyC5[NOTE], aryMelodyC5[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 9:ド[C4 -> C5] case '9': // 音階総数 bytNoteNum = sizeof( aryMelodyC4_C5[NOTE] ) / sizeof( aryMelodyC4_C5[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyC4_C5[NOTE], aryMelodyC4_C5[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // 0:ド[C5 -> C4] case '0': // 音階総数 bytNoteNum = sizeof( aryMelodyC5_C4[NOTE] ) / sizeof( aryMelodyC5_C4[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyC5_C4[NOTE], aryMelodyC5_C4[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // A:きらきらぼし case 'A': // 音階総数 bytNoteNum = sizeof( aryMelodyStar[NOTE] ) / sizeof( aryMelodyStar[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyStar[NOTE], aryMelodyStar[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // B:ゆかいな牧場 case 'B': // 音階総数 bytNoteNum = sizeof( aryMelodyCow[NOTE] ) / sizeof( aryMelodyCow[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyCow[NOTE], aryMelodyCow[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // C:にんげんっていいな case 'C': // 音階総数 bytNoteNum = sizeof( aryMelodyHuman[NOTE] ) / sizeof( aryMelodyHuman[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyHuman[NOTE], aryMelodyHuman[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // D:おもちゃのチャチャチャ case 'D': // 音階総数 bytNoteNum = sizeof( aryMelodyCha[NOTE] ) / sizeof( aryMelodyCha[NOTE][0] ); // メロディ 出力 outputMelody( aryMelodyCha[NOTE], aryMelodyCha[DURATIONS], bytNoteNum ); break; // -------------------------------------------------- // その他:シリアルモニタに表示 default: Serial.println(chrKey); } } } /*********/ /* setup */ /*********/ void setup(){ // pinの設定 pinMode( BUZZER, OUTPUT ); // BUZZER : 出力用 // シリアルモニタ開始 Serial.begin( 9600 ); }
ドレミの歌
ボタン1→2→3→4:ド→レ→ミ→ファ
ボタンA:きらきらぼし
ボタンB:ゆかいな牧場
ボタンD:おもちゃのチャチャチャ
0 件のコメント:
コメントを投稿