音声メトロノーム用のスケッチです。
#include <AquesTalk.h>
#include <Wire.h> // I2CライブラリAquesTalkライブラリ内部で使用するので定義必要
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2); // LCD の変数を生成
const int ledPin = 13; // LED のピン番号
const int BL = 9; // LCD Back Light 制御用ピン番号
const int SW1 = 6; // Switch 1のピン番号
const int SW2 = 7; // Switch 2のピン番号
const int ARST = 8; // 追加基板上のリセットSW
long dt_1mini; // 1分当たりのミリ秒
AquesTalk atp; // インスタンス定義 変数名は任意
int Beat_s; // 拍子
int Max_Beat; // 最大拍子数
int Tempo_s ; // 速度
int Max_Tempo ; // 最速
int Min_Tempo ; // 最低速
int Interval_ms; // 時間間隔
int cur_beat; // 何拍目
int Led_St; // Ledの状態
int Ura_B ; // 裏拍子を刻むかを制御するフラグ
// ****** 以上 変数宣言 ******
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // LED端子を出力に
pinMode(BL, OUTPUT); // BL制御端子を出力に
pinMode(SW1, INPUT); // SW1端子を入力に
pinMode(SW2, INPUT); // SW2端子を入力に
pinMode(ARST, INPUT); // ARST端子を入力に
dt_1mini = 60000; // 60000ms
Beat_s = 2 ; // 2拍子
Max_Beat =8 ; // 8拍子まで
Tempo_s = 75; // 速度75
Max_Tempo = 100; // 最速 100
Min_Tempo = 35; // 最低速 35
cur_beat =1;
Led_St = HIGH; // 点灯状態
lcd.begin(16,2) ;
digitalWrite(BL,HIGH); // Back Lightを点灯
lcd.print(“Beat = “) ;
lcd.print(Beat_s,DEC) ;
lcd.setCursor(0,1) ;
lcd.print(“Tempo = “) ;
lcd.print(Tempo_s,DEC) ;
lcd.setCursor(6,0) ;
// 拍子の設定変更
lcd.cursor() ;
do {
if(digitalRead(SW1)==LOW){
delay(100) ;
if(digitalRead(SW1)==LOW){
Beat_s = Beat_s +1 ;
if(Beat_s > Max_Beat){
Beat_s = 2 ; // 拍子を初期値に戻す
}
lcd.setCursor(0,0) ; // 1行1列目にカーソルセット
lcd.print(“Beat = “) ; //
lcd.print(Beat_s,DEC) ;
lcd.setCursor(6,0) ;
}
}
} while ( digitalRead(ARST)==HIGH) ; // ARST SWが押されたら終了
lcd.setCursor(7,1) ;
delay(200) ;
// テンポの設定変更
do{
if(digitalRead(SW1) != digitalRead(SW2)) {
delay(100) ;
if(digitalRead(SW1) == LOW){
if(Tempo_s < Max_Tempo){
Tempo_s = Tempo_s +1 ;
}
}
if(digitalRead(SW2) == LOW){
if(Tempo_s > Min_Tempo){
Tempo_s = Tempo_s -1 ;
}
}
lcd.setCursor(0,1) ;
lcd.print(“Tempo = “) ;
lcd.print(Tempo_s,DEC) ;
lcd.print(” “) ;
lcd.setCursor(7,1) ;
}
} while (digitalRead(ARST)) ; // ARST SWが押されたら終了
lcd.noCursor() ;
Interval_ms = dt_1mini / (Tempo_s * 2) ; // 時間計算
Serial.println(“Interval_ms:”) ; // パソコンへ送信
Serial.println(Interval_ms) ; // パソコンへ送信
Serial.println(“=== Start ===”) ; // パソコンへ送信
digitalWrite(BL,LOW); // Back Lightを消灯
// イントロのBeep 音
atp.Synthe(“#K”) ; //発声
delay(Interval_ms * 2) ;
for(int i=1; i < Beat_s ; i++) {
atp.Synthe(“#J”); //発声
delay(Interval_ms * 2) ;
}
}
void loop() {
// 初期化処理の実行
if(digitalRead(ARST) == LOW){
cur_beat = 1;
if(digitalRead(SW1) == LOW){
Ura_B = HIGH ;
}
// イントロのBeep 音
atp.Synthe(“#K”); //発声
delay(Interval_ms * 2);
for(int i=1; i < Beat_s ; i++) {
atp.Synthe(“#J”); //発声
delay(Interval_ms * 2);
}
}
// 何拍子目かの判定
if(cur_beat > Beat_s){
cur_beat = 1; // 現拍子が最大を越えたら初期セット
}
// 拍子を刻む毎にLEDの状態を反転させる処理
digitalWrite(ledPin,Led_St);
Led_St = !Led_St;
switch(cur_beat){
case 1:
atp.Synthe(“ichi”); //発声
break;
case 2:
atp.Synthe(“ni”); //発声
break;
case 3:
atp.Synthe(“san”); //発声
break;
case 4:
atp.Synthe(“yon”); //発声
break;
case 5:
atp.Synthe(“go”); //発声
break;
case 6:
atp.Synthe(“roku”); //発声
break;
case 7:
atp.Synthe(“nana”); //発声
break;
case 8:
atp.Synthe(“hati”); //発声
break;
default:
break;
}
delay(Interval_ms);
// 裏拍子を刻む処理
if(Ura_B == HIGH) {
atp.Synthe(“#J”); // 裏拍子を発声
}
delay(Interval_ms);
Serial.println(cur_beat) ; // パソコンへ送信
cur_beat++ ;
}