diff --git a/python_payload/apps/gay_drums/__init__.py b/python_payload/apps/gay_drums/__init__.py index 56de22388ea30e3aba8b412808a01c4da6d87ffc..4b49571bfff6e416728ad49b07935c7546d1570f 100644 --- a/python_payload/apps/gay_drums/__init__.py +++ b/python_payload/apps/gay_drums/__init__.py @@ -20,9 +20,9 @@ else: class GayDrums(Application): def __init__(self, app_ctx: ApplicationContext) -> None: super().__init__(app_ctx) - self.blm = bl00mbox.Channel("gay drums") + self.blm = None self.num_samplers = 6 - self.seq = self.blm.new(bl00mbox.patches.sequencer, num_tracks=8, num_steps=32) + self.seq = None self.kick: Optional[bl00mbox.patches._Patch] = None self.hat: Optional[bl00mbox.patches._Patch] = None @@ -31,12 +31,9 @@ class GayDrums(Application): self.crash: Optional[bl00mbox.patches._Patch] = None self.snare: Optional[bl00mbox.patches._Patch] = None - self.seq.signals.bpm.value = 80 - self.track_names = ["kick", "hihat", "snare", "crash", "nya", "woof"] self.ct_prev: Optional[captouch.CaptouchState] = None self.track = 1 - self.blm.background_mute_override = True self.tap_tempo_press_counter = 0 self.track_back_press_counter = 0 self.stopped = False @@ -51,15 +48,14 @@ class GayDrums(Application): "count": 0, } self.track_back = False - self.bpm = self.seq.signals.bpm.value + self.bpm = 0 self.samples_loaded = 0 self.samples_total = len(self.track_names) self.loading_text = "" self.init_complete = False self.load_iter = self.iterate_loading() - self._render_list_2: List[Tuple[Rendee, Any]] = [] - self._render_list_1: List[Tuple[Rendee, Any]] = [] + self._render_list: List[Tuple[Rendee, Any]] = [] self._group_highlight_on = [False] * 4 self._group_highlight_redraw = [False] * 4 @@ -72,19 +68,50 @@ class GayDrums(Application): self.draw_background_counter = 0 self.full_redraw_timer_ms = 0 - self.steps = 16 self.bar = 0 + self._bpm_saved = None + self._steps_saved = None + self._seq_table_saved = None + @property def steps(self): - return self.seq.signals.step_end.value + 1 + if self.blm is not None: + return self.seq.signals.step_end.value + 1 + return 0 @steps.setter def steps(self, val): - self.seq.signals.step_start = 0 - self.seq.signals.step_end = val - 1 + if self.blm is not None: + self.seq.signals.step_start = 0 + self.seq.signals.step_end = val - 1 def iterate_loading(self) -> Iterator[Tuple[int, str]]: + if self.blm is None: + self.blm = bl00mbox.Channel("gay drums") + self.seq = self.blm.new(bl00mbox.patches.sequencer, num_tracks=8, num_steps=32) + + if self._bpm_saved is None: + bpm = 80 + else: + bpm = self._bpm_saved + if self._steps_saved is None: + steps = 16 + else: + steps = self._steps_saved + + self.steps = steps + self.seq.signals.bpm.value = bpm + self.bpm = self.seq.signals.bpm.value + + if self._seq_table_saved is not None: + self.seq.plugins.seq.table = self._seq_table_saved + self.seq.signals.bpm = 0 + self.seq.signals.sync_in.start() + self._render_list += [(self.draw_bpm, None)] + self.stopped = True + self.blm.foreground = False + yield 0, "kick.wav" self.nya = self.blm.new(bl00mbox.patches.sampler, "nya.wav") self.nya.signals.output = self.blm.mixer @@ -159,6 +186,13 @@ class GayDrums(Application): for step in range(16): self.draw_track_step_marker(ctx, (track, step)) + def tracks_are_empty(self): + for track in range(6): + for step in range(16): + if self.track_get_state(track, step): + return False + return True + def track_get_state(self, track: int, step: int) -> int: sequencer_track = track if track > 1: @@ -310,18 +344,6 @@ class GayDrums(Application): ctx.rgb(255, 255, 255) ctx.text(str(bpm) + " bpm") - def draw_volume_area(self, ctx: Context, data: None) -> None: - ctx.move_to(0, 0) - bar_len = 10 * (1 + self.num_samplers) - self.ctx_draw_centered_rect(ctx, 0, 0, 6 * 12, bar_len, (0, 0, 0)) - self.ctx_draw_centered_rect(ctx, 0, 0, 1, bar_len, (0.5, 0.5, 0.5)) - - for track in range(self.num_samplers): - for step in range(5, 16 - 5): - self.draw_track_step_marker(ctx, (track, step)) - for i in range(1, 3): - self._group_highlight_redraw[i] = True - def draw(self, ctx: Context) -> None: ctx.text_align = ctx.MIDDLE if not self.init_complete: @@ -365,23 +387,19 @@ class GayDrums(Application): return if self.draw_background_counter > 0: - self._render_list_1 += [(self.draw_background, None)] - self._render_list_1 += [(self.draw_background, None)] + self._render_list += [(self.draw_background, None)] + self._render_list += [(self.draw_background, None)] self.draw_background_counter -= 1 for i in range(4): if self._group_highlight_redraw[i]: self._group_highlight_redraw[i] = False - self._render_list_1 += [(self.draw_group_highlight, i)] + self._render_list += [(self.draw_group_highlight, i)] - for rendee in self._render_list_1: - fun, param = rendee - fun(ctx, param) - for rendee in self._render_list_2: + for rendee in self._render_list: fun, param = rendee fun(ctx, param) - # self._render_list_2 = self._render_list_1.copy() - self._render_list_1 = [] + self._render_list = [] size = 4 @@ -490,13 +508,13 @@ class GayDrums(Application): def think(self, ins: InputState, delta_ms: int) -> None: super().think(ins, delta_ms) - if self.full_redraw_timer_ms > 0: - self.full_redraw_timer_ms -= delta_ms - if self.full_redraw_timer_ms < 0: - self._render_list_1 += [(self.draw_volume_area, None)] - - if self.input.buttons.os.left.pressed or self.input.buttons.os.right.pressed: - self.full_redraw_timer_ms = 2000 + if not self.init_complete: + try: + self.samples_loaded, self.loading_text = next(self.load_iter) + except StopIteration: + self.init_complete = True + self._render_list += [(self.draw_background, None)] + return if self.input.buttons.app.left.pressed: if self.steps > 3: @@ -510,14 +528,6 @@ class GayDrums(Application): self.ct_prev = ins.captouch return - if not self.init_complete: - try: - self.samples_loaded, self.loading_text = next(self.load_iter) - except StopIteration: - self.init_complete = True - self._render_list_1 += [(self.draw_background, None)] - return - st = self.seq.signals.step.value rgb = self._track_col(self.track) leds.set_all_rgb(0, 0, 0) @@ -541,7 +551,7 @@ class GayDrums(Application): ): self.track_incr_state(self.track, self.bar * 16 + i * 4 + j) - self._render_list_1 += [ + self._render_list += [ (self.draw_track_step_marker, (self.track, i * 4 + j)) ] else: @@ -554,14 +564,14 @@ class GayDrums(Application): self.track_back = False else: self.track = (self.track - 1) % self.num_samplers - self._render_list_1 += [(self.draw_track_name, None)] + self._render_list += [(self.draw_track_name, None)] if ct.petals[0].pressed and not (self.ct_prev.petals[0].pressed): if self.stopped: self.seq.signals.bpm = self.bpm - self._render_list_1 += [(self.draw_bpm, None)] - self.blm.background_mute_override = True + self._render_list += [(self.draw_bpm, None)] self.stopped = False + self.blm.foreground = True elif self.tapping: t = self.tap["time_ms"] * 0.001 n = self.tap["count"] @@ -584,7 +594,7 @@ class GayDrums(Application): else: bpm = int(60 / T) self.seq.signals.bpm = bpm - self._render_list_1 += [(self.draw_bpm, None)] + self._render_list += [(self.draw_bpm, None)] self.bpm = bpm if not self.tapping: @@ -603,9 +613,9 @@ class GayDrums(Application): if self.tap_tempo_press_counter > 500: self.seq.signals.bpm = 0 self.seq.signals.sync_in.start() - self._render_list_1 += [(self.draw_bpm, None)] + self._render_list += [(self.draw_bpm, None)] self.stopped = True - self.blm.background_mute_override = False + self.blm.foreground = False else: self.tap_tempo_press_counter += delta_ms else: @@ -614,7 +624,7 @@ class GayDrums(Application): if ct.petals[5].pressed: if (self.track_back_press_counter > 500) and not self.track_back: self.track = (self.track + 1) % self.num_samplers - self._render_list_1 += [(self.draw_track_name, None)] + self._render_list += [(self.draw_track_name, None)] self.track_back = True else: self.track_back_press_counter += delta_ms @@ -629,6 +639,21 @@ class GayDrums(Application): self.ct_prev = None self.draw_background_counter = 2 + def on_exit(self): + super().on_exit() + self._bpm_saved = self.bpm + self._steps_saved = self.steps + self._seq_table_saved = self.seq.plugins.seq.table + if self.tracks_are_empty() or self.stopped: + self.blm.background_mute_override = False + self.blm.clear() + self.blm.free = True + self.blm = None + self.init_complete = False + self.load_iter = self.iterate_loading() + else: + self.blm.background_mute_override = True + # For running with `mpremote run`: if __name__ == "__main__": diff --git a/python_payload/apps/shoegaze/__init__.py b/python_payload/apps/shoegaze/__init__.py index a0cb9b4fd77d9f3c4f42276a15a211914ae49948..d3b9b32cb053c1b4c48def592b131b70e79e6359 100644 --- a/python_payload/apps/shoegaze/__init__.py +++ b/python_payload/apps/shoegaze/__init__.py @@ -12,6 +12,8 @@ import bl00mbox import leds import random +import sys_display + chords = [ [-5, -5, 2, 7, 10], [-4, -4, 0, 5, 8], @@ -151,7 +153,7 @@ class ShoegazeApp(Application): ctx.font = ctx.get_font_name(5) ctx.font_size = 35 - ctx.move_to(0, -112) + ctx.move_to(0, -105) ctx.rgb(0.2, 0, 0.2) ctx.text("bass") @@ -232,6 +234,7 @@ class ShoegazeApp(Application): def on_enter(self, vm: Optional[ViewManager]) -> None: super().on_enter(vm) + sys_display.set_mode(2313) if self.blm is None: self._build_synth() if self.blm is not None: # silly mypy diff --git a/python_payload/apps/tiny_sampler/__init__.py b/python_payload/apps/tiny_sampler/__init__.py index 1501275700825067228629b8f8d8981777ee3a9c..0cf22743a0dd4ccf125c2b22f1a573ec481cfc32 100644 --- a/python_payload/apps/tiny_sampler/__init__.py +++ b/python_payload/apps/tiny_sampler/__init__.py @@ -89,6 +89,10 @@ class TinySampler(Application): self.ct_prev = ct + def on_enter(self, vm) -> None: + super().on_enter(vm) + self.blm.foreground = True + def on_exit(self) -> None: super().on_exit() for i in range(5): @@ -96,3 +100,4 @@ class TinySampler(Application): self.samplers[i].signals.rec_trigger.stop() self.is_recording[i] = False audio.input_set_source(audio.INPUT_SOURCE_NONE) + self.blm.foreground = False