trying to fix bugs and failing miserably
This commit is contained in:
12
src/main.py
12
src/main.py
@@ -8,23 +8,23 @@ import mp3
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print("Loading project...")
|
"""print("Loading project...")
|
||||||
test_project = Project(song_length=64,bpm=120)
|
test_project = Project(song_length=64,bpm=120,sample_rate=24000)
|
||||||
|
|
||||||
screams = ProjectChannel(
|
screams = ProjectChannel(
|
||||||
test_project,
|
test_project,
|
||||||
name="screams of the damned",
|
name="Drums",
|
||||||
)
|
)
|
||||||
sample = AudioChannelChunk(
|
sample = AudioChannelChunk(
|
||||||
screams,
|
screams,
|
||||||
*librosa.load("cool sample 2.mp3", sr=None, mono=False),
|
*librosa.load("120 bpm amen break.mp3", sr=None, mono=False),
|
||||||
name="cool sample 2.mp3"
|
name="120 bpm amen break.mp3"
|
||||||
)
|
)
|
||||||
screams.chunks.append(sample)
|
screams.chunks.append(sample)
|
||||||
|
|
||||||
test_project.channels.append(screams)
|
test_project.channels.append(screams)
|
||||||
|
|
||||||
test_project.write_to_file("test_project.tdp")
|
test_project.write_to_file("test_project.tdp")"""
|
||||||
#test_project = Project.from_file("test_project.tdp")
|
#test_project = Project.from_file("test_project.tdp")
|
||||||
|
|
||||||
# start the ui
|
# start the ui
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import sounddevice as sd
|
import sounddevice as sd
|
||||||
from project import Project
|
from project import Project
|
||||||
from ui.widgets.play_head import PlayHead
|
from ui.widgets.play_head import PlayHead
|
||||||
|
from textual.timer import Timer
|
||||||
|
|
||||||
|
|
||||||
class SongPlayer:
|
class SongPlayer:
|
||||||
@@ -13,6 +14,13 @@ class SongPlayer:
|
|||||||
|
|
||||||
self.timeline = timeline
|
self.timeline = timeline
|
||||||
|
|
||||||
|
# set up our timer for updating the ui playhead
|
||||||
|
self.timer = Timer(
|
||||||
|
timeline,
|
||||||
|
0.1,
|
||||||
|
pause=True
|
||||||
|
)
|
||||||
|
|
||||||
def play_callback(self, out, frames, time, status):
|
def play_callback(self, out, frames, time, status):
|
||||||
if self.paused or self.audio is None:
|
if self.paused or self.audio is None:
|
||||||
out.fill(0)
|
out.fill(0)
|
||||||
@@ -57,6 +65,7 @@ class SongPlayer:
|
|||||||
def pause(self):
|
def pause(self):
|
||||||
self.paused = True
|
self.paused = True
|
||||||
self.stream.close()
|
self.stream.close()
|
||||||
|
self.timer.pause()
|
||||||
|
|
||||||
play_btn = self.timeline.app.query_one("#play-button")
|
play_btn = self.timeline.app.query_one("#play-button")
|
||||||
play_btn.variant = "success"
|
play_btn.variant = "success"
|
||||||
@@ -67,30 +76,30 @@ class SongPlayer:
|
|||||||
self.project = project
|
self.project = project
|
||||||
self.audio = project.render()
|
self.audio = project.render()
|
||||||
|
|
||||||
|
self.timer.resume()
|
||||||
|
play_btn = self.timeline.app.query_one("#play-button")
|
||||||
|
play_btn.variant = "error"
|
||||||
|
play_btn.label = "⏸"
|
||||||
|
self.paused = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
|
||||||
if not self.stream.closed:
|
if not self.stream.closed:
|
||||||
self.stream.close()
|
self.stream.close()
|
||||||
|
|
||||||
self.stream = sd.OutputStream(
|
self.stream = sd.OutputStream(
|
||||||
samplerate=project.sample_rate,
|
|
||||||
channels=self.audio.shape[1] if self.audio.ndim > 1 else 1,
|
channels=self.audio.shape[1] if self.audio.ndim > 1 else 1,
|
||||||
callback=self.play_callback,
|
callback=self.play_callback,
|
||||||
blocksize=256
|
blocksize=256,
|
||||||
|
device=7
|
||||||
)
|
)
|
||||||
|
|
||||||
self.paused = False
|
|
||||||
|
|
||||||
self.stream.start()
|
self.stream.start()
|
||||||
|
|
||||||
|
|
||||||
play_btn = self.timeline.app.query_one("#play-button")
|
|
||||||
play_btn.variant = "error"
|
|
||||||
play_btn.label = "⏸"
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
except sd.PortAudioError as e: # woopsies
|
except sd.PortAudioError as e: # woopsies
|
||||||
self.paused = True
|
self.pause()
|
||||||
self.timeline.app.notify(f"Error: \"{e}\"\n\nSometimes errors can occur if the device you selected in your settings doesn't exist, or it's already in use.", title="Error while playing song", timeout=60, severity="error")
|
self.timeline.app.notify(f"Error: \"{e}\"\n\nSometimes errors can occur if the device you selected in your settings doesn't exist, or it's already in use.", title="Error while playing song", timeout=60, severity="error")
|
||||||
|
|
||||||
return False
|
return False
|
||||||
Binary file not shown.
@@ -71,6 +71,8 @@ class Channel(VerticalGroup):
|
|||||||
if event.slider.id == "volume":
|
if event.slider.id == "volume":
|
||||||
self.volume = round(event.value, 2)
|
self.volume = round(event.value, 2)
|
||||||
self.query_one("#volume-text").update(f"Volume ({self.volume}Db):")
|
self.query_one("#volume-text").update(f"Volume ({self.volume}Db):")
|
||||||
|
|
||||||
|
self.project_channel.volume = self.volume
|
||||||
elif event.slider.id == "pan":
|
elif event.slider.id == "pan":
|
||||||
self.pan = round(event.value)
|
self.pan = round(event.value)
|
||||||
pan_text = self.query_one("#pan-text")
|
pan_text = self.query_one("#pan-text")
|
||||||
@@ -81,6 +83,8 @@ class Channel(VerticalGroup):
|
|||||||
pan_text.update(f"Pan ({-self.pan}% left):")
|
pan_text.update(f"Pan ({-self.pan}% left):")
|
||||||
elif self.pan > 0:
|
elif self.pan > 0:
|
||||||
pan_text.update(f"Pan ({self.pan}% right):")
|
pan_text.update(f"Pan ({self.pan}% right):")
|
||||||
|
|
||||||
|
self.project_channel.pan = self.pan
|
||||||
|
|
||||||
def compose(self) -> ComposeResult:
|
def compose(self) -> ComposeResult:
|
||||||
yield Input(placeholder="Channel Name", compact=True, id="name", value=self.channel_name)
|
yield Input(placeholder="Channel Name", compact=True, id="name", value=self.channel_name)
|
||||||
|
|||||||
@@ -78,6 +78,10 @@ class Timeline(Vertical):
|
|||||||
for row in self.query(TimelineRow):
|
for row in self.query(TimelineRow):
|
||||||
row.styles.width = self.bar_offset * self.app.project.song_length
|
row.styles.width = self.bar_offset * self.app.project.song_length
|
||||||
|
|
||||||
|
@on(events.Timer)
|
||||||
|
async def playhead_timer_tick(self, event: events.Timer):
|
||||||
|
await self.song_player.update_visual_playhead()
|
||||||
|
|
||||||
@on(events.MouseScrollDown)
|
@on(events.MouseScrollDown)
|
||||||
async def mouse_scroll_down(self, event: events.MouseScrollDown):
|
async def mouse_scroll_down(self, event: events.MouseScrollDown):
|
||||||
self.app.zoom_level += (self.app.scroll_sensitivity_x / 200)
|
self.app.zoom_level += (self.app.scroll_sensitivity_x / 200)
|
||||||
|
|||||||
Reference in New Issue
Block a user