Skip to content

Commit

Permalink
improve TR.P accuracy (monome#310)
Browse files Browse the repository at this point in the history
* TR pulse fix

* update docs
  • Loading branch information
scanner-darkly authored Apr 14, 2023
1 parent 64099d2 commit 1d68025
Show file tree
Hide file tree
Showing 12 changed files with 76 additions and 24 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
- **FIX**: support all line ending types for USB load
- **FIX**: fix `STATE` not accounting for `DEVICE.FLIP`
- **FIX**: fix MIDI IN ops channel number being off by 1
- **FIX**: improve `TR.P` accuracy
- **FIX**: fix `KILL` not stopping TR pulses in progress

## v4.0.0

Expand Down
2 changes: 2 additions & 0 deletions docs/whats_new.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
- **FIX**: support all line ending types for USB load
- **FIX**: fix `STATE` not accounting for `DEVICE.FLIP`
- **FIX**: fix MIDI IN ops channel number being off by 1
- **FIX**: improve `TR.P` accuracy
- **FIX**: fix `KILL` not stopping TR pulses in progress

## v4.0.0

Expand Down
37 changes: 37 additions & 0 deletions module/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ static softTimer_t monomePollTimer = {.next = NULL, .prev = NULL };
static softTimer_t monomeRefreshTimer = {.next = NULL, .prev = NULL };
static softTimer_t gridFaderTimer = {.next = NULL, .prev = NULL };
static softTimer_t midiScriptTimer = {.next = NULL, .prev = NULL };
static softTimer_t trPulseTimer[TR_COUNT];


////////////////////////////////////////////////////////////////////////////////
Expand All @@ -150,6 +151,7 @@ static void monome_poll_timer_callback(void* obj);
static void monome_refresh_timer_callback(void* obj);
static void grid_fader_timer_callback(void* obj);
static void midiScriptTimer_callback(void* obj);
static void trPulseTimer_callback(void* obj);

// event handler prototypes
static void handler_None(int32_t data);
Expand Down Expand Up @@ -1046,6 +1048,36 @@ void tele_tr(uint8_t i, int16_t v) {
gpio_set_pin_low(pin);
}

void tele_tr_pulse(uint8_t i, int16_t time) {
if (i >= TR_COUNT) return;
timer_remove(&trPulseTimer[i]);
timer_add(&trPulseTimer[i], time, &trPulseTimer_callback,
(void*)(int32_t)i);
}

void tele_tr_pulse_clear(uint8_t i) {
if (i >= TR_COUNT) return;
timer_remove(&trPulseTimer[i]);
}

void tele_tr_pulse_time(uint8_t i, int16_t time) {
if (i >= TR_COUNT) return;

u32 time_spent = trPulseTimer[i].ticks - trPulseTimer[i].ticksRemain;
timer_set(&trPulseTimer[i], time);
if (time_spent >= time) { timer_manual(&trPulseTimer[i]); }
else {
trPulseTimer[i].ticksRemain = time - time_spent;
}
}

void trPulseTimer_callback(void* obj) {
int i = (int)obj;
if (i >= TR_COUNT) return;
timer_remove(&trPulseTimer[i]);
tele_tr_pulse_end(&scene_state, i);
}

void tele_cv(uint8_t i, int16_t v, uint8_t s) {
int16_t t = v + aout[i].off;
if (t < 0)
Expand Down Expand Up @@ -1237,6 +1269,11 @@ int main(void) {
aout[2].slew = 1;
aout[3].slew = 1;

for (uint8_t i = 0; i < TR_COUNT; i++) {
trPulseTimer[i].next = NULL;
trPulseTimer[i].prev = NULL;
}

init_live_mode();
set_mode(M_LIVE);

Expand Down
15 changes: 15 additions & 0 deletions simulator/tt.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,21 @@ void tele_tr(uint8_t i, int16_t v) {
printf("\n");
}

void tele_tr_pulse(uint8_t i, int16_t time) {
printf("TR PULSE i:%" PRIu8 " time:%" PRId16, i, time);
printf("\n");
}

void tele_tr_pulse_clear(uint8_t i) {
printf("TR PULSE CLEAR i:%" PRIu8, i);
printf("\n");
}

void tele_tr_pulse_time(uint8_t i, int16_t time) {
printf("TR PULSE TIME i:%" PRIu8 " time:%" PRId16, i, time);
printf("\n");
}

void tele_cv(uint8_t i, int16_t v, uint8_t s) {
printf("CV i:%" PRIu8 " v:%" PRId16 " s:%" PRIu8, i, v, s);
printf("\n");
Expand Down
3 changes: 2 additions & 1 deletion src/ops/hardware.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ static void op_TR_TIME_set(const void *NOTUSED(data), scene_state_t *ss,
return;
else if (a < 4) {
ss->variables.tr_time[a] = b;
tele_tr_pulse_time(a, b);
}
else if (a < 20) {
uint8_t d[] = { II_ANSIBLE_TR_TIME, a & 0x3, b >> 8, b & 0xff };
Expand Down Expand Up @@ -447,8 +448,8 @@ static void op_TR_PULSE_get(const void *NOTUSED(data), scene_state_t *ss,
int16_t time = ss->variables.tr_time[a]; // pulse time
if (time <= 0) return; // if time <= 0 don't do anything
ss->variables.tr[a] = ss->variables.tr_pol[a];
ss->tr_pulse_timer[a] = time; // set time
tele_tr(a, ss->variables.tr[a]);
tele_tr_pulse(a, time);
}
else if (a < 20) {
uint8_t d[] = { II_ANSIBLE_TR_PULSE, a & 0x3 };
Expand Down
4 changes: 2 additions & 2 deletions src/ops/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ static void op_INIT_TR_get(const void *NOTUSED(data), scene_state_t *ss,
ss->variables.tr[v] = 0;
ss->variables.tr_pol[v] = 1;
ss->variables.tr_time[v] = 100;
ss->tr_pulse_timer[v] = 0;
tele_tr_pulse_clear(v);
tele_tr(v, 0);
}
}
Expand All @@ -156,7 +156,7 @@ static void op_INIT_TR_ALL_get(const void *NOTUSED(data), scene_state_t *ss,
ss->variables.tr[i] = 0;
ss->variables.tr_pol[i] = 1;
ss->variables.tr_time[i] = 100;
ss->tr_pulse_timer[i] = 0;
tele_tr_pulse_clear(i);
tele_tr(i, 0);
}
}
Expand Down
1 change: 0 additions & 1 deletion src/state.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ void ss_init(scene_state_t *ss) {
ss_rand_init(ss);
ss_midi_init(ss);
ss->delay.count = 0;
for (size_t i = 0; i < TR_COUNT; i++) { ss->tr_pulse_timer[i] = 0; }
for (size_t i = 0; i < NB_NBX_SCALES; i++) {
ss->variables.n_scale_bits[i] = bit_reverse(0b101011010101, 12);
ss->variables.n_scale_root[i] = 0;
Expand Down
1 change: 0 additions & 1 deletion src/state.h
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,6 @@ typedef struct {
scene_pattern_t patterns[PATTERN_COUNT];
scene_delay_t delay;
scene_stack_op_t stack_op;
int16_t tr_pulse_timer[TR_COUNT];
scene_script_t scripts[TOTAL_SCRIPT_COUNT];
scene_turtle_t turtle;
bool every_last;
Expand Down
27 changes: 8 additions & 19 deletions src/teletype.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ bool processing_delays = false;
// DELAY ////////////////////////////////////////////////////////

void clear_delays(scene_state_t *ss) {
for (int16_t i = 0; i < TR_COUNT; i++) { ss->tr_pulse_timer[i] = 0; }
for (int16_t i = 0; i < TR_COUNT; i++) {
tele_tr_pulse_clear(i);
tele_tr_pulse_end(ss, i);
}

for (int16_t i = 0; i < DELAY_SIZE; i++) { ss->delay.time[i] = 0; }

Expand Down Expand Up @@ -344,25 +347,11 @@ void tele_tick(scene_state_t *ss, uint8_t time) {
}
}
}
}

// process tr pulses
for (int16_t i = 0; i < TR_COUNT; i++) {
if (ss->tr_pulse_timer[i]) {
// prevent tr_pulse_timer from being greater than tr_time
int16_t tr_time = ss->variables.tr_time[i];
if (tr_time < 0) tr_time = 0;
if (ss->tr_pulse_timer[i] > tr_time)
ss->tr_pulse_timer[i] = tr_time;

ss->tr_pulse_timer[i] -= time;

if (ss->tr_pulse_timer[i] <= 0) {
ss->tr_pulse_timer[i] = 0;
ss->variables.tr[i] = ss->variables.tr_pol[i] == 0;
tele_tr(i, ss->variables.tr[i]);
}
}
}
void tele_tr_pulse_end(scene_state_t *ss, uint8_t i) {
ss->variables.tr[i] = ss->variables.tr_pol[i] == 0;
tele_tr(i, ss->variables.tr[i]);
}

/////////////////////////////////////////////////////////////////
Expand Down
2 changes: 2 additions & 0 deletions src/teletype.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ void tele_tick(scene_state_t *ss, uint8_t);

void clear_delays(scene_state_t *ss);

void tele_tr_pulse_end(scene_state_t *ss, uint8_t i);

const char *tele_error(error_t);

#endif
3 changes: 3 additions & 0 deletions src/teletype_io.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ extern void tele_metro_updated(void);
extern void tele_metro_reset(void);

extern void tele_tr(uint8_t i, int16_t v);
extern void tele_tr_pulse(uint8_t i, int16_t time);
extern void tele_tr_pulse_clear(uint8_t i);
extern void tele_tr_pulse_time(uint8_t i, int16_t time);
extern void tele_cv(uint8_t i, int16_t v, uint8_t s);
extern void tele_cv_slew(uint8_t i, int16_t v);

Expand Down
3 changes: 3 additions & 0 deletions tests/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ uint32_t tele_get_ticks() {
void tele_metro_updated() {}
void tele_metro_reset() {}
void tele_tr(uint8_t i, int16_t v) {}
void tele_tr_pulse(uint8_t i, int16_t time) {}
void tele_tr_pulse_clear(uint8_t i) {}
void tele_tr_pulse_time(uint8_t i, int16_t time) {}
void tele_cv(uint8_t i, int16_t v, uint8_t s) {}
void tele_cv_slew(uint8_t i, int16_t v) {}
void tele_update_adc(uint8_t force) {}
Expand Down

0 comments on commit 1d68025

Please sign in to comment.