From 506d3c87499cc8523df3f0ab2c9df3112df2d360 Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Wed, 14 Jan 2026 12:20:53 +1100 Subject: [PATCH] grid lines and some ui fixes :D --- src/120 bpm track.mp3 | Bin 0 -> 180733 bytes src/assets/style.tcss | 2 +- src/audio.py | 0 src/main.py | 14 ++++++- src/test_project.tdp | Bin 353011 -> 353011 bytes src/ui/app.py | 3 ++ src/ui/widgets/chunk_types/audio.py | 16 ++++--- src/ui/widgets/chunk_types/chunk.py | 17 ++++++-- src/ui/widgets/timeline.py | 62 +++++++++++++++++++++------- 9 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 src/120 bpm track.mp3 create mode 100644 src/audio.py diff --git a/src/120 bpm track.mp3 b/src/120 bpm track.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..315d89fe21b0232a3348d65ca69ce1b01ee16ef2 GIT binary patch literal 180733 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 literal 0 HcmV?d00001 diff --git a/src/assets/style.tcss b/src/assets/style.tcss index e0cdb13..cc9d1de 100644 --- a/src/assets/style.tcss +++ b/src/assets/style.tcss @@ -1,3 +1,3 @@ App { - layers: bottom top; + layers: top bottom; } \ No newline at end of file diff --git a/src/audio.py b/src/audio.py new file mode 100644 index 0000000..e69de29 diff --git a/src/main.py b/src/main.py index 6c32ff6..ddaef68 100644 --- a/src/main.py +++ b/src/main.py @@ -1,10 +1,20 @@ from ui.app import AppUI -from project import Project +from project import Project, ProjectChannel, AudioChannelChunk +import librosa if __name__ == "__main__": print("Loading project...") - test_project = Project.from_file("test_project.tdp") + test_project = Project(channels=[ + ProjectChannel(chunks=[ + AudioChannelChunk(*librosa.load("120 bpm amen break.mp3"), position=0), + AudioChannelChunk(*librosa.load("120 bpm amen break.mp3"), position=1), + AudioChannelChunk(*librosa.load("120 bpm amen break.mp3"), position=2) + ], name="drums"), + ProjectChannel(chunks=[ + + ], name="piano") + ])#.from_file("test_project.tdp") # start the ui print("Starting UI...") diff --git a/src/test_project.tdp b/src/test_project.tdp index 2cfefce2ba26778da7d587d60a6db1a4cdd1b42c..1b5fe57b8137e5cefecf2bab001162ad014dffda 100644 GIT binary patch delta 29 lcmex-RP^&v(Fv}M9~#|S-56Wlm|ESKTisZ;y0NZJ0sz9$3vB=Z delta 29 lcmex-RP^&v(Fv}M6^(AKZj7yNOs#Irt!^w^-B{Nq0RXvh3iSX0 diff --git a/src/ui/app.py b/src/ui/app.py index 4020b68..cbfd6df 100644 --- a/src/ui/app.py +++ b/src/ui/app.py @@ -9,9 +9,12 @@ from ui.widgets.project_settings import ProjectSettings class AppUI(App): CSS_PATH = "../assets/style.tcss" + theme = "atom-one-dark" + def __init__(self, project): super().__init__() self.zoom_level = 0.05 + self.last_zoom_level = self.zoom_level self.project = project diff --git a/src/ui/widgets/chunk_types/audio.py b/src/ui/widgets/chunk_types/audio.py index 732eba3..c20549a 100644 --- a/src/ui/widgets/chunk_types/audio.py +++ b/src/ui/widgets/chunk_types/audio.py @@ -14,6 +14,7 @@ from ui.widgets.chunk_types.chunk import Chunk class AudioChunk(Chunk): DEFAULT_CSS = """ AudioChunk { + border: tab $accent; PlotWidget { height: 1fr; @@ -25,8 +26,8 @@ class AudioChunk(Chunk): } """ - def __init__(self, audio_data: np.ndarray, sample_rate: int, chunk_name: str = "Sample"): - super().__init__(chunk_name) + def __init__(self, audio_data: np.ndarray, sample_rate: int, chunk_name: str = "Sample", bar_pos: float = 0.0): + super().__init__(chunk_name, bar_pos) self.audio = audio_data self.sample_rate = sample_rate @@ -42,10 +43,15 @@ class AudioChunk(Chunk): self.meter = pyln.Meter(self.sample_rate) self.loudness_values = [] - self.styles.width = int((self.num_samples / self.sample_rate) / self.app.zoom_level) + self.calculate_size() + + def calculate_size(self): + self.styles.width = round((self.num_samples / self.sample_rate) / self.app.zoom_level) def on_mount(self): for plot in self.query(PlotWidget): + plot: PlotWidget = plot # just for type checking + plot.margin_top = 0 plot.margin_left = 0 plot.margin_bottom = 0 @@ -85,8 +91,8 @@ class AudioChunk(Chunk): x, y, 1.0, - bar_style=self.app.theme_variables["primary"], - hires_mode=HiResMode.HALFBLOCK + bar_style=self.app.theme_variables["warning"], + hires_mode=HiResMode.BRAILLE ) diff --git a/src/ui/widgets/chunk_types/chunk.py b/src/ui/widgets/chunk_types/chunk.py index b5ee648..fc9da32 100644 --- a/src/ui/widgets/chunk_types/chunk.py +++ b/src/ui/widgets/chunk_types/chunk.py @@ -8,12 +8,23 @@ class Chunk(Container): DEFAULT_CSS = """ Chunk { - border: panel $secondary; + border: tab $surface; background: $surface-darken-1; + dock: left; } """ - def __init__(self, chunk_name: str = "Chunk"): + def __init__(self, chunk_name: str = "Chunk", bar_pos: float = 0.0): super().__init__() self.chunk_name = chunk_name - self.border_title = chunk_name \ No newline at end of file + self.border_title = chunk_name + self.bar_pos = bar_pos + self.update_offset() + + def update_offset(self, timeline=None): + if timeline == None: + timeline = self.app.query_one("#timeline") + self.offset = (timeline.bar_offset * self.bar_pos * 4, 0) + + def calculate_size(self): + pass \ No newline at end of file diff --git a/src/ui/widgets/timeline.py b/src/ui/widgets/timeline.py index fca9f6e..7c99909 100644 --- a/src/ui/widgets/timeline.py +++ b/src/ui/widgets/timeline.py @@ -1,6 +1,7 @@ from textual.containers import Vertical, VerticalScroll, Horizontal, VerticalGroup, HorizontalGroup from textual.widgets import Rule from textual.app import ComposeResult +from textual import on, events from ui.widgets.chunk_types.audio import AudioChunk, Chunk from ui.widgets.play_head import PlayHead @@ -19,7 +20,6 @@ class TimelineRow(Horizontal): class Timeline(Vertical): DEFAULT_CSS = """ Timeline { - #rows { hatch: "-" $surface-lighten-1; padding: 1 0; @@ -49,36 +49,68 @@ class Timeline(Vertical): """ def __init__(self): - super().__init__() + super().__init__(id="timeline") - self.bar_offset = self.app.project.bpm / 8 * (0.0333 / self.app.zoom_level) + self.calc_bar_offset() + + def calc_bar_offset(self): + self.bar_offset = self.app.project.bpm / 8 * (0.03333333333 / self.app.zoom_level) + + @on(events.MouseScrollDown) + async def mouse_scroll_down(self, event: events.MouseScrollDown): + self.app.zoom_level += (self.app.scroll_sensitivity_x / 200) + self.calc_bar_offset() + self.app.last_zoom_level = self.app.zoom_level + self.handle_zoom() + + @on(events.MouseScrollUp) + async def mouse_scroll_up(self, event: events.MouseScrollUp): + self.app.zoom_level = max(self.app.zoom_level - self.app.scroll_sensitivity_x/200, 0.001) + + if self.app.zoom_level != self.app.last_zoom_level: + self.app.last_zoom_level = self.app.zoom_level + self.calc_bar_offset() + self.handle_zoom() + + def handle_zoom(self): + for chunk in self.query(Chunk): + chunk.calculate_size() + chunk.update_offset(self) + + for bar_line in self.query(Rule): + if not isinstance(bar_line, PlayHead): + bar_line.offset = (self.bar_offset * bar_line.index, 0) def compose(self) -> ComposeResult: + with VerticalScroll(id="rows"): + + + for channel in self.app.project.channels: + self.notify(str(channel)) + + with TimelineRow(): + for chunk in channel.chunks: + if chunk.chunk_type == ChunkType.CHUNK: + yield Chunk(chunk_name=chunk.name, bar_pos=chunk.position) + elif chunk.chunk_type == ChunkType.AUDIO: + yield AudioChunk(chunk.audio_data, chunk.sample_rate, chunk.name, chunk.position) + for i in range(1, 17): bar = None - if (i) % 4 == 0: + if i % 4 == 0: bar = Rule.vertical(classes="bar-line", line_style="double") else: bar = Rule.vertical(classes="beat-line") bar.offset = (self.bar_offset * i, 0) + bar.index = i yield bar - - for channel in self.app.project.channels: - - - with TimelineRow(): - for chunk in channel.chunks: - if chunk.chunk_type == ChunkType.CHUNK: - yield Chunk(chunk_name=chunk.name) - elif chunk.chunk_type == ChunkType.AUDIO: - yield AudioChunk(chunk.audio_data, chunk.sample_rate, chunk.name) - + #yield PlayHead() \ No newline at end of file