working note length selection
This commit is contained in:
parent
e6927559df
commit
395fb1dc10
21
metronome.c
21
metronome.c
@ -91,11 +91,12 @@ static void timer_callback(void* ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static uint32_t bpm_to_sleep_ticks(double bpm) {
|
static uint32_t state_to_sleep_ticks(MetronomeState* metronome_state) {
|
||||||
// calculate time between beeps
|
// calculate time between beeps
|
||||||
uint32_t tps = furi_kernel_get_tick_frequency();
|
uint32_t tps = furi_kernel_get_tick_frequency();
|
||||||
double bps = (double)bpm / 60;
|
double multiplier = 4.0d/metronome_state->note_length;
|
||||||
return (uint32_t)round(tps / bps) - ((BEEP_DELAY_MS/1000)*tps);
|
double bps = (double)metronome_state->bpm / 60;
|
||||||
|
return (uint32_t)(round(tps / bps) - ((BEEP_DELAY_MS/1000)*tps)) * multiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_timer(MetronomeState* metronome_state) {
|
static void update_timer(MetronomeState* metronome_state) {
|
||||||
@ -103,7 +104,7 @@ static void update_timer(MetronomeState* metronome_state) {
|
|||||||
furi_timer_stop(metronome_state->timer);
|
furi_timer_stop(metronome_state->timer);
|
||||||
furi_timer_start(
|
furi_timer_start(
|
||||||
metronome_state->timer,
|
metronome_state->timer,
|
||||||
bpm_to_sleep_ticks(metronome_state->bpm)
|
state_to_sleep_ticks(metronome_state)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,6 +132,15 @@ static void cycle_beats_per_bar(MetronomeState* metronome_state) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cycle_note_length(MetronomeState* metronome_state) {
|
||||||
|
metronome_state->note_length *= 2;
|
||||||
|
if (metronome_state->note_length > 16) {
|
||||||
|
metronome_state->note_length = 2;
|
||||||
|
metronome_state->beats_per_bar = 1;
|
||||||
|
}
|
||||||
|
update_timer(metronome_state);
|
||||||
|
}
|
||||||
|
|
||||||
static void metronome_state_init(MetronomeState* const metronome_state) {
|
static void metronome_state_init(MetronomeState* const metronome_state) {
|
||||||
metronome_state->bpm = 120.0;
|
metronome_state->bpm = 120.0;
|
||||||
metronome_state->playing = false;
|
metronome_state->playing = false;
|
||||||
@ -187,7 +197,7 @@ int32_t metronome_app() {
|
|||||||
case InputKeyOk:
|
case InputKeyOk:
|
||||||
metronome_state->playing = !metronome_state->playing;
|
metronome_state->playing = !metronome_state->playing;
|
||||||
if (metronome_state->playing) {
|
if (metronome_state->playing) {
|
||||||
furi_timer_start(metronome_state->timer, bpm_to_sleep_ticks(metronome_state->bpm));
|
furi_timer_start(metronome_state->timer, state_to_sleep_ticks(metronome_state));
|
||||||
} else {
|
} else {
|
||||||
furi_timer_stop(metronome_state->timer);
|
furi_timer_stop(metronome_state->timer);
|
||||||
}
|
}
|
||||||
@ -199,6 +209,7 @@ int32_t metronome_app() {
|
|||||||
} else if (event.input.type == InputTypeLong) {
|
} else if (event.input.type == InputTypeLong) {
|
||||||
switch(event.input.key) {
|
switch(event.input.key) {
|
||||||
case InputKeyUp:
|
case InputKeyUp:
|
||||||
|
cycle_note_length(metronome_state);
|
||||||
break;
|
break;
|
||||||
case InputKeyDown:
|
case InputKeyDown:
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user