Files
midi-micro-bit_sound-converter/midi_converter.py
Janis Hutz 6fad58dd64 Major refactor
I have spent some time (like two hours) fixing up the app, getting it up
to a somewhat better level. Code is still bad, but that's that. If
anybody is interested to make the code neater, feel free to open a PR!
2025-03-07 17:18:15 +01:00

115 lines
4.0 KiB
Python

from typing import Optional
from kivy.uix.screenmanager import ScreenManager
from kivymd.uix.screen import MDScreen
from kivymd.uix.menu import MDDropdownMenu
from kivymd.uix.screen import MDScreen
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.uix.label import Label
from kivymd.app import MDApp
from mido import MidiFile
import os
import lib.midi_management
global tracks
tracks = []
global filepath
filepath = ''
class HomeScreen(MDScreen):
pass
class FileChooserScreen(MDScreen):
loadfile = ObjectProperty(None)
def load(self, path, filename):
global filepath
try:
self.path = os.path.join(path, filename[0])
try:
mid = MidiFile(self.path, clip=True)
filepath = self.path
global tracks
tracks = []
for i, track in enumerate(mid.tracks):
tracks.append('{} (Track {})'.format(track.name, i))
if len(tracks) > 1:
tracks.pop(0)
screen_manager.current = "Track"
screen_manager.transition.direction = "up"
else:
lib.midi_management.MidiManagement().analyse_track(str(self.path), tracks.pop(0))
screen_manager.get_screen("Home").ids.infobox.text = "The command has been copied to the clipboard"
screen_manager.current = "Home"
screen_manager.transition.direction = "right"
except Exception as e:
print(e)
self.popup_fe = Popup(title="FileError", content=Label(text="Please select a MIDI-File!"),
size_hint=(0.4, 0.4), auto_dismiss=True)
self.popup_fe.open()
except:
self.popup_foldererror = Popup(title="FileError", content=Label(text="Only MIDI-Files allowed, not folder"),
size_hint=(0.4, 0.4), auto_dismiss=True)
self.popup_foldererror.open()
class TrackChooseScreen(MDScreen):
def show_dropdown(self, button):
global tracks
menu_items = []
for track in tracks:
menu_items.append(
{
"viewclass": "OneLineListItem",
"text": track,
"on_release": lambda t=track, menu=None : self.extract(t, menu)
}
)
menu = MDDropdownMenu(
caller=button,
items=menu_items,
width_mult=8,
)
# Pass the menu to each item in the lambda callback to dismiss the menu
for item in menu_items:
item["on_release"] = lambda track=item["text"], menu=menu: self.extract(track, menu)
menu.open()
def extract(self, item: str, menu: Optional[MDDropdownMenu] = None):
global filepath
if menu != None:
menu.dismiss()
if item == "Select a track":
popup_ns = Popup(title="NoSelectionError", content=Label(text="Please select a Track!"),
size_hint=(0.4, 0.4), auto_dismiss=True)
popup_ns.open()
else:
lib.midi_management.MidiManagement().analyse_track(str(filepath), item)
screen_manager.get_screen("Home").ids.infobox.text = "The command has been copied to the clipboard"
screen_manager.current = "Home"
screen_manager.transition.direction = "right"
class MidiConverter(MDApp):
global screen_manager
screen_manager = ScreenManager()
def build(self):
self.title = "Midi-Microbit-Converter"
self.theme_cls.primary_palette = "Blue"
self.theme_cls.accent_palette = "BlueGray"
screen_manager.add_widget(Builder.load_file("./gui/gui.kv"))
screen_manager.add_widget(Builder.load_file("./gui/filechooser.kv"))
screen_manager.add_widget(Builder.load_file("./gui/loading_screen.kv"))
return screen_manager
MidiConverter().run()