Japanino (Arduino)の調べ 将棋の調べ 鉄道の調べ 旅先料理の調べ ビールコレクション
JukeBox.sk
/*
Juke Box
2曲の歌をスイッチを入れる度に交互に演奏する
操作法
(1) スイッチを ON (左側に倒した位置)にすると演奏。
(2) スイッチを OFF にすると演奏停止。
(3) 次にスイッチを ON にすると、次の曲を演奏。
Copyright (C) GOMI Hiroshi 2010 All right reserved.
*/
#include "pitches.h"
int tonePin = 14; // トーンピン
int inputPin = 6; // 入力ピン
int ledPin[] = {7, 8, 9, 10, 11, 12, 13}; // LEDピン
int ledp = 0; // 現在の LEDピン
int oledp = 0; // 直前の LEDピン
int no = 1; // 現在の演奏曲ナンバー
// 音楽データ
/*
tempounit 16分音符の長さ(ms)
tempoe 拍子(2/4 のときは 8, 3/4 のときは 12, 4/4 のときは 16)
score[] 楽譜データ {音程、長さ}* 長さは16分音符を1とする
length 楽譜サイズ
例.
int tempounit0 = 100;
int temp0 = 16;
int score0[] = {
NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4,
NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4,
NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4,
NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4, NOTE_X4, 4
};
int length0 = sizeof(score0) / (2 * 4);
*/
// 海
int tempounit1 = 100;
int tempo1 = 12;
int score1[] = {
NOTE_B4, 4, NOTE_A4, 4, NOTE_G4, 4, NOTE_E4, 2, NOTE_A4, 2, NOTE_G4, 4, NOTE_E4, 4,
NOTE_D4, 2, NOTE_D4, 2, NOTE_G4, 4, NOTE_G4, 4, NOTE_A4, 8, 0, 4,
NOTE_B4, 4, NOTE_B4, 4, NOTE_D5, 4, NOTE_B4, 2, NOTE_B4, 2, NOTE_A4, 4, NOTE_G4, 4,
NOTE_E4, 2, NOTE_E4, 2, NOTE_D4, 4, NOTE_A4, 4, NOTE_G4, 8, 0, 4
};
int length1 = sizeof(score1) / (2 * 4);
// 夕やけこやけ
int tempounit2 = 100;
int tempo2 = 8;
int score2[] = {
NOTE_G4, 2, NOTE_G4, 2, NOTE_G4, 2, NOTE_A4, 2, NOTE_G4, 2, NOTE_G4, 2, NOTE_G4, 2, NOTE_E4, 2,
NOTE_C4, 2, NOTE_C4, 2, NOTE_D4, 2, NOTE_E4, 2, NOTE_D4, 6, 0, 2,
NOTE_E4, 4, NOTE_E4, 2, NOTE_G4, 2, NOTE_A4, 2, NOTE_C5, 2, NOTE_C5, 2, NOTE_A4, 2,
NOTE_G4, 2, NOTE_G4, 2, NOTE_A4, 2, NOTE_G4, 2, NOTE_C5, 6, 0, 2,
NOTE_C5, 3, NOTE_D5, 1, NOTE_C5, 2, NOTE_A4, 2, NOTE_C5, 2, NOTE_C5, 2, NOTE_G4, 2, NOTE_G4, 2,
NOTE_A4, 2, NOTE_G4, 2, NOTE_A4, 2, NOTE_G4, 2, NOTE_E4, 6, 0, 2,
NOTE_G4, 2, NOTE_E4, 2, NOTE_D4, 2, NOTE_C4, 2, NOTE_D4, 2, NOTE_D4, 2, NOTE_G4, 2, NOTE_D4, 2,
NOTE_E4, 2, NOTE_G4, 2, NOTE_A4, 2, NOTE_G4, 2, NOTE_C5, 6, 0, 2
};
int length2 = sizeof(score2) / (2 * 4);
void setup() {
for (int led = 0; led < 7; led++) {
pinMode(ledPin[led], OUTPUT);
digitalWrite(ledPin[led], LOW); // set the LED off
}
pinMode(inputPin, INPUT);
digitalWrite(inputPin, HIGH);
}
void loop() {
// 入力スイッチ(inputPin)が ON になるまで待つ
for (;;) {
if (digitalRead(inputPin) == LOW) break;
delay(10);
}
// スイッチを入れると次の曲を演奏する
if (no == 1) {
play(tempounit1, tempo1, length1, score1);
no = 2;
} else {
play(tempounit2, tempo2, length2, score2);
no = 1;
}
// LED を消灯して1秒待つ
digitalWrite(ledPin[ledp], LOW); // set the LED off
digitalWrite(ledPin[oledp], LOW); // set the LED off
delay(1000);
ledp = 0;
oledp = 0;
}
/*
演奏(ループ)
入力(inputPin)が OFF になるまで無限ループで演奏する
演奏中は小節ごとにLEDが順に点灯する
@param tempounit 16分音符の長さ(ms)
@param tempobase 拍子(2/4 のときは 8, 3/4 のときは 12, 4/4 のときは 16)
@param length 楽譜サイズ
@param score[] 楽譜データ {音程、長さ}* 長さは16分音符を1とする
*/
void play(int tempounit, int tempobase, int length, int score[]) {
for (;;) {
int current = 0;
for (int note = 0; note < length; note++) {
int duration = tempounit * score[note * 2 + 1];
current += score[note * 2 + 1];
if (current >= tempobase) {
digitalWrite(ledPin[ledp], HIGH); // set the LED on
current = 0;
ledp++;
if (ledp >= 7) ledp = 0;
} else {
digitalWrite(ledPin[oledp], LOW); // set the LED off
oledp = ledp;
}
tone(tonePin, score[note * 2], duration);
int pause = duration * 1.30;
delay(pause);
if (digitalRead(inputPin) == HIGH) return;
}
}
}
更新記録
Japanino (Arduino)の調べ 将棋の調べ 鉄道の調べ 旅先料理の調べ ビールコレクション
Copyright © 2010 GOMI Hiroshi All Rights Reserved