BangleApps/apps/metronome/metronome.js

98 lines
2.9 KiB
JavaScript
Raw Normal View History

2020-04-19 11:55:20 +00:00
var tStart = Date.now();
var cindex=0; // index to iterate through colous
var bpm=60; // ininital bpm value
var time_diffs = [1000, 1000, 1000]; //array to calculate mean bpm
var tindex=0; //index to iterate through time_diffs
Bangle.setLCDTimeout(undefined); //do not deaktivate display while running this app
function changecolor() {
const maxColors = 2;
const colors = {
0: { value: 0xFFFF, name: "White" },
2020-05-10 14:42:27 +00:00
// 1: { value: 0x000F, name: "Navy" },
2020-04-19 11:55:20 +00:00
// 2: { value: 0x03E0, name: "DarkGreen" },
// 3: { value: 0x03EF, name: "DarkCyan" },
// 4: { value: 0x7800, name: "Maroon" },
// 5: { value: 0x780F, name: "Purple" },
// 6: { value: 0x7BE0, name: "Olive" },
// 7: { value: 0xC618, name: "LightGray" },
// 8: { value: 0x7BEF, name: "DarkGrey" },
// 9: { value: 0x001F, name: "Blue" },
// 10: { value: 0x07E0, name: "Green" },
// 11: { value: 0x07FF, name: "Cyan" },
2020-05-10 14:42:27 +00:00
1: { value: 0xF800, name: "Red" },
2020-04-19 11:55:20 +00:00
// 13: { value: 0xF81F, name: "Magenta" },
// 14: { value: 0xFFE0, name: "Yellow" },
// 15: { value: 0xFFFF, name: "White" },
// 16: { value: 0xFD20, name: "Orange" },
// 17: { value: 0xAFE5, name: "GreenYellow" },
// 18: { value: 0xF81F, name: "Pink" },
};
g.setColor(colors[cindex].value);
if (cindex == maxColors-1) {
cindex = 0;
}
else {
cindex += 1;
}
return cindex;
}
function updateScreen() {
2020-05-10 14:48:24 +00:00
g.clearRect(0, 50, 250, 150);
2020-04-19 11:55:20 +00:00
changecolor();
Bangle.buzz(50, 0.75);
g.setFont("Vector",48);
2020-05-10 14:48:24 +00:00
g.drawString(Math.floor(bpm)+"bpm", 5, 60);
2020-04-19 11:55:20 +00:00
}
Bangle.on('touch', function(button) {
// setting bpm by tapping the screen. Uses the mean time difference between several tappings.
if (tindex < time_diffs.length) {
if (Date.now()-tStart < 5000) {
time_diffs[tindex] = Date.now()-tStart;
}
} else {
tindex=0;
time_diffs[tindex] = Date.now()-tStart;
}
tindex += 1;
mean_time = 0.0;
for(count = 0; count < time_diffs.length; count++) {
mean_time += time_diffs[count];
}
time_diff = mean_time/count;
tStart = Date.now();
clearInterval(time_diff);
bpm = (60 * 1000/(time_diff));
2020-05-10 14:42:27 +00:00
updateScreen();
2020-04-19 11:55:20 +00:00
clearInterval(interval);
interval = setInterval(updateScreen, 60000 / bpm);
return bpm;
});
// enable bpm finetuning via buttons.
setWatch(() => {
bpm += 1;
clearInterval(interval);
interval = setInterval(updateScreen, 60000 / bpm);
}, BTN1, {repeat:true});
setWatch(() => {
if (bpm > 1) {
bpm -= 1;
clearInterval(interval);
interval = setInterval(updateScreen, 60000 / bpm);
}
}, BTN3, {repeat:true});
interval = setInterval(updateScreen, 60000 / bpm);
2020-05-10 14:42:27 +00:00
2020-05-10 14:48:24 +00:00
g.clear();
g.drawString('Touch the screen to set tempo.\nUse BTN1 to increase, and\nBTN3 to decrease bpm value by 1.', 15, 150);
2020-05-10 14:42:27 +00:00
Bangle.loadWidgets();
Bangle.drawWidgets();