mirror of
https://github.com/janishutz/midi-micro-bit_sound-converter.git
synced 2025-11-25 13:54:26 +00:00
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!
115 lines
4.0 KiB
Python
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()
|