Fixed bug that crashed on saving after importing.
[epichord.git] / src / metronome.cpp
blob185dfed6c16c36fec02a37dfcd39a4149d790ef1
1 #include <stdio.h>
2 #include <math.h>
4 #include <fltk/Widget.h>
5 #include <fltk/events.h>
6 #include <fltk/draw.h>
8 #include "metronome.h"
10 using namespace fltk;
12 Metronome::Metronome(int x, int y, int w, int h, const char* label = 0) : fltk::Widget(x, y, w, h, label) {
13 N = 4;
14 n = 2;
16 last_beat = 0;
17 plus = 0;
19 r=255; g=0; b=0;
21 update(0);
24 int Metronome::handle(int event){
25 return 0;
28 void Metronome::draw(){
29 draw_box();
31 //setcolor(fltk::color(r,g,b));
32 //fillrect(2,2,w()-4,h()-4);
34 setcolor(fltk::WHITE);
35 int X = last_beat%N*(w()-4)/N+2;
36 int W = (w()-4)/N;
37 int H = h()-4;
38 fillrect(X,2,W,h()-4);
40 //int W2 = W/2;
41 //int H2 = H/2;
42 //setcolor(fltk::color(r,g,b));
43 //fillrect(X+W/2-W2/2,h()/2-H2/2,W2,H2);
45 //setcolor(fltk::BLACK);
46 //int C = (getascent()-getdescent())/2;
47 //drawtext(label(),X+W/2-getwidth(label())/2,h()/2+C);
51 //div N is the greatest divisor of N less than or equal to sqrt(N)
52 int div(int N){
53 int d = 0;
54 for(int i=1; i<=sqrt(N); i++){
55 if(N%i==0){
56 d=i;
59 if(d==1){
60 //prime
62 return d;
65 void Metronome::update(int tick){
66 int now_beat = tick/128;
68 if(now_beat != last_beat){
69 int step = last_beat - now_beat;
70 last_beat = now_beat;
72 char buf[16];
73 snprintf(buf,16,"%d",now_beat%N + plus);
74 copy_label(buf);
76 if(now_beat%N == 0){
77 r=255; g=0; b=0;
79 else if(now_beat%n == 0){
80 r=128; g=0; b=0;
82 else{
83 r=0; g=0; b=0;
86 redraw();
90 void Metronome::set_N(int zN){
91 N = zN;
92 n = div(zN);