Skip to content
Snippets Groups Projects
Commit d0a9a721 authored by moon2's avatar moon2 :speech_balloon:
Browse files

gay drums: updating to new api, nicer savefile

parent b8c39e47
No related branches found
No related tags found
No related merge requests found
...@@ -73,83 +73,77 @@ class GayDrums(Application): ...@@ -73,83 +73,77 @@ class GayDrums(Application):
self._bpm_saved = None self._bpm_saved = None
self._steps_saved = None self._steps_saved = None
self._seq_table_saved = None self._seq_beat_saved = None
self._file_settings = None self._file_settings = None
self.settings_path = "/flash/gay_drums.json"
self._load_settings() self.try_loading = True
def _try_load_settings(self, path): def _try_load_settings(self, path):
try: try:
with open(path, "r") as f: with open(path, "r") as f:
return json.load(f) settings = json.load(f)
self._file_settings = settings
return settings
except OSError as e: except OSError as e:
if e.errno != errno.ENOENT: pass
raise # ignore file not found
def _try_write_default_settings(self, path: str, default_path: str) -> None:
with open(path, "w") as outfile, open(default_path, "r") as infile:
outfile.write(infile.read())
def _try_save_settings(self, path, settings): def _try_save_settings(self, path, settings):
try: try:
with open(path, "w+") as f: with open(path, "w+") as f:
f.write(json.dumps(settings)) f.write(json.dumps(settings))
f.close() f.close()
self._file_settings = settings
except OSError as e: except OSError as e:
if e.errno != errno.ENOENT: pass
raise # ignore file not found
def _save_settings(self): def _save_settings(self):
default_path = self.app_ctx.bundle_path + "/gay_drums-default.json" if not self.init_complete:
settings_path = "/flash/gay_drums.json" return
settings = self._try_load_settings(default_path)
assert settings is not None, "failed to load default settings"
file_difference = False file_difference = False
for i, beat in enumerate(settings["beats"]): settings = {}
beat = {}
settings["beats"] = [beat]
beat["bpm"] = self.bpm beat["bpm"] = self.bpm
beat["steps"] = self.steps beat["steps"] = self.steps
beat["sequencer_table"] = self.seq.plugins.seq.table beat["pattern"] = self.tracks_dump_pattern()
if self._file_settings is None: if self._file_settings is None:
file_difference = True file_difference = True
else: else:
file_beat = self._file_settings["beats"][i] file_beat = self._file_settings["beats"][0]
for i in beat: for i in beat:
if beat.get(i) != file_beat.get(i): if beat.get(i) != file_beat.get(i):
file_difference = True file_difference = True
break break
if file_difference: if file_difference:
self._try_save_settings(settings_path, settings) self._try_save_settings(self.settings_path, settings)
self._file_settings = settings
def _load_settings(self): def _load_settings(self):
default_path = self.app_ctx.bundle_path + "/gay_drums-default.json" settings = self._try_load_settings(self.settings_path)
settings_path = "/flash/gay_drums.json"
settings = self._try_load_settings(default_path) if settings is None:
assert settings is not None, "failed to load default settings"
user_settings = self._try_load_settings(settings_path)
if user_settings is None:
self._try_write_default_settings(settings_path, default_path)
self._file_settings = settings
self.stopped = False self.stopped = False
elif self.blm is not None:
beat = settings["beats"][0]
if "sequencer_table" in beat:
# legacy support
a = beat["sequencer_table"]
pattern = {}
tracks = []
for i in range(8):
track = {}
track["type"] = "trigger"
track["steps"] = a[(33 * i) + 1 : 33 * (i + 1)]
tracks += [track]
pattern["tracks"] = tracks
self.seq.load_pattern(pattern)
else: else:
settings.update(user_settings) self.tracks_load_pattern(beat["pattern"])
self._file_settings = user_settings
for i, beat in enumerate(settings["beats"]):
if self.blm is None:
self._bpm_saved = beat["bpm"]
self._steps_saved = beat["steps"]
self._seq_table_saved = beat["sequencer_table"]
else:
self.bpm = beat["bpm"] self.bpm = beat["bpm"]
if not self.stopped: if not self.stopped:
self.seq.signals.bpm.value = self.bpm self.seq.signals.bpm.value = self.bpm
self.steps = beat["steps"] self.steps = beat["steps"]
self.seq.plugins.seq.table = beat["sequencer_table"]
self._tracks_empty = self.tracks_are_empty() self._tracks_empty = self.tracks_are_empty()
@property @property
...@@ -167,7 +161,10 @@ class GayDrums(Application): ...@@ -167,7 +161,10 @@ class GayDrums(Application):
def iterate_loading(self) -> Iterator[Tuple[int, str]]: def iterate_loading(self) -> Iterator[Tuple[int, str]]:
if self.blm is None: if self.blm is None:
self.blm = bl00mbox.Channel("gay drums") self.blm = bl00mbox.Channel("gay drums")
self.seq = self.blm.new(bl00mbox.patches.sequencer, num_tracks=8, num_steps=32) self.seq = self.blm.new(bl00mbox.plugins.sequencer, 8, 32)
if self.try_loading:
self._load_settings()
self.try_loading = False
if self._bpm_saved is None: if self._bpm_saved is None:
bpm = 80 bpm = 80
...@@ -182,8 +179,8 @@ class GayDrums(Application): ...@@ -182,8 +179,8 @@ class GayDrums(Application):
self.seq.signals.bpm = bpm self.seq.signals.bpm = bpm
self.bpm = self.seq.signals.bpm.value self.bpm = self.seq.signals.bpm.value
if self._seq_table_saved is not None: if self._seq_beat_saved is not None:
self.seq.plugins.seq.table = self._seq_table_saved self.tracks_load_pattern(self._seq_beat_saved)
self._tracks_empty = self.tracks_are_empty() self._tracks_empty = self.tracks_are_empty()
if self.stopped: if self.stopped:
self.seq.signals.bpm = 0 self.seq.signals.bpm = 0
...@@ -192,35 +189,50 @@ class GayDrums(Application): ...@@ -192,35 +189,50 @@ class GayDrums(Application):
self.blm.foreground = False self.blm.foreground = False
yield 0, "kick.wav" yield 0, "kick.wav"
self.nya = self.blm.new(bl00mbox.patches.sampler, "nya.wav") self.nya = self.blm.new(bl00mbox.plugins.sampler, "/flash/sys/samples/nya.wav")
self.nya.signals.output = self.blm.mixer self.nya.signals.playback_output = self.blm.mixer
self.nya.signals.trigger = self.seq.plugins.seq.signals.track6 self.nya.signals.playback_trigger = self.seq.signals.track[6]
self.kick = self.blm.new(bl00mbox.patches.sampler, "kick.wav") self.kick = self.blm.new(
self.kick.signals.output = self.blm.mixer bl00mbox.plugins.sampler, "/flash/sys/samples/kick.wav"
self.kick.signals.trigger = self.seq.plugins.seq.signals.track0 )
self.kick.signals.playback_output = self.blm.mixer
self.kick.signals.playback_trigger = self.seq.signals.track[0]
yield 1, "hihat.wav" yield 1, "hihat.wav"
self.woof = self.blm.new(bl00mbox.patches.sampler, "bark.wav") self.woof = self.blm.new(
self.woof.signals.output = self.blm.mixer bl00mbox.plugins.sampler, "/flash/sys/samples/bark.wav"
self.woof.signals.trigger = self.seq.plugins.seq.signals.track7 )
self.hat = self.blm.new(bl00mbox.patches.sampler, "hihat.wav") self.woof.signals.playback_output = self.blm.mixer
self.hat.signals.output = self.blm.mixer self.woof.signals.playback_trigger = self.seq.signals.track[7]
self.hat.signals.trigger = self.seq.plugins.seq.signals.track1 self.hat = self.blm.new(
bl00mbox.plugins.sampler, "/flash/sys/samples/hihat.wav"
)
self.hat.signals.playback_output = self.blm.mixer
self.hat.signals.playback_trigger = self.seq.signals.track[1]
yield 2, "close.wav" yield 2, "close.wav"
self.close = self.blm.new(bl00mbox.patches.sampler, "close.wav") self.close = self.blm.new(
self.close.signals.output = self.blm.mixer bl00mbox.plugins.sampler, "/flash/sys/samples/close.wav"
self.close.signals.trigger = self.seq.plugins.seq.signals.track2 )
self.close.signals.playback_output = self.blm.mixer
self.close.signals.playback_trigger = self.seq.signals.track[2]
yield 3, "open.wav" yield 3, "open.wav"
self.open = self.blm.new(bl00mbox.patches.sampler, "open.wav") self.open = self.blm.new(
self.open.signals.output = self.blm.mixer bl00mbox.plugins.sampler, "/flash/sys/samples/open.wav"
self.open.signals.trigger = self.seq.plugins.seq.signals.track3 )
self.open.signals.playback_output = self.blm.mixer
self.open.signals.playback_trigger = self.seq.signals.track[3]
yield 4, "snare.wav" yield 4, "snare.wav"
self.snare = self.blm.new(bl00mbox.patches.sampler, "snare.wav") self.snare = self.blm.new(
self.snare.signals.output = self.blm.mixer bl00mbox.plugins.sampler, "/flash/sys/samples/snare.wav"
self.snare.signals.trigger = self.seq.plugins.seq.signals.track4 )
self.snare.signals.playback_output = self.blm.mixer
self.snare.signals.playback_trigger = self.seq.signals.track[4]
yield 5, "crash.wav" yield 5, "crash.wav"
self.crash = self.blm.new(bl00mbox.patches.sampler, "crash.wav") self.crash = self.blm.new(
self.crash.signals.output = self.blm.mixer bl00mbox.plugins.sampler, "/flash/sys/samples/crash.wav"
self.crash.signals.trigger = self.seq.plugins.seq.signals.track5 )
self.crash.signals.playback_output = self.blm.mixer
self.crash.signals.playback_speed.tone = 2
self.crash.signals.playback_trigger = self.seq.signals.track[5]
yield 6, "" yield 6, ""
def _highlight_petal(self, num: int, r: int, g: int, b: int) -> None: def _highlight_petal(self, num: int, r: int, g: int, b: int) -> None:
...@@ -272,6 +284,26 @@ class GayDrums(Application): ...@@ -272,6 +284,26 @@ class GayDrums(Application):
return False return False
return True return True
def tracks_dump_pattern(self):
tracks = [None] * 6
for t in range(6):
track = {}
steps = [0] * 16
for s in range(16):
steps[s] = self.track_get_state(t, s)
track["steps"] = steps
track["name"] = self.track_names[t]
tracks[t] = track
beat = {}
beat["tracks"] = tracks
return beat
def tracks_load_pattern(self, beat):
for track in range(6):
steps = beat["tracks"][track]["steps"]
for step in range(16):
self.track_set_state(track, step, steps[step])
def track_get_state(self, track: int, step: int) -> int: def track_get_state(self, track: int, step: int) -> int:
sequencer_track = track sequencer_track = track
if track > 1: if track > 1:
...@@ -296,6 +328,14 @@ class GayDrums(Application): ...@@ -296,6 +328,14 @@ class GayDrums(Application):
else: else:
return 2 return 2
def track_set_state(self, track, step, state):
# lol
last = self.track_get_state(track, step)
while self.track_get_state(track, step) != state:
self.track_incr_state(track, step)
if last == self.track_get_state(track, step):
break
def track_incr_state(self, track: int, step: int) -> None: def track_incr_state(self, track: int, step: int) -> None:
sequencer_track = track sequencer_track = track
step = step % 16 step = step % 16
...@@ -329,6 +369,14 @@ class GayDrums(Application): ...@@ -329,6 +369,14 @@ class GayDrums(Application):
step += 16 step += 16
else: else:
state = self.seq.trigger_state(sequencer_track, step) state = self.seq.trigger_state(sequencer_track, step)
if track == 3:
if state == 0:
new_state = 10000
elif state > 16500:
new_state = 0
else:
new_state = 20000
else:
if state == 0: if state == 0:
new_state = 16000 new_state = 16000
elif state == 32767: elif state == 32767:
...@@ -611,7 +659,7 @@ class GayDrums(Application): ...@@ -611,7 +659,7 @@ class GayDrums(Application):
self.ct_prev = ins.captouch self.ct_prev = ins.captouch
return return
st = self.seq.signals.step.value st = self.seq.signals.step.value % 16
rgb = self._track_col(self.track) rgb = self._track_col(self.track)
leds.set_all_rgb(0, 0, 0) leds.set_all_rgb(0, 0, 0)
self._highlight_petal(10 - (4 - (st // 4)), *rgb) self._highlight_petal(10 - (4 - (st // 4)), *rgb)
...@@ -732,7 +780,7 @@ class GayDrums(Application): ...@@ -732,7 +780,7 @@ class GayDrums(Application):
self._bpm_saved = self.bpm self._bpm_saved = self.bpm
self._steps_saved = self.steps self._steps_saved = self.steps
self._save_settings() self._save_settings()
self._seq_table_saved = self.seq.plugins.seq.table self._seq_beat_saved = self.tracks_dump_pattern()
if self.tracks_are_empty() or self.stopped: if self.tracks_are_empty() or self.stopped:
self.blm.background_mute_override = False self.blm.background_mute_override = False
self.blm.clear() self.blm.clear()
......
{
"beats": [
{ "bpm": 80, "steps": 16, "sequencer_table": [0]}
]
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment