Major update of all demo programs to use new PEP8 bindings, etc
This commit is contained in:
parent
3f7c87c562
commit
7f52778bcc
307 changed files with 19546 additions and 3297 deletions
|
@ -1,13 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
import sys
|
||||
if sys.version_info[0] >= 3:
|
||||
import PySimpleGUI as sg
|
||||
else:
|
||||
import PySimpleGUI27 as sg
|
||||
import PySimpleGUI as sg
|
||||
import os
|
||||
import mido
|
||||
import time
|
||||
import sys
|
||||
|
||||
PLAYER_COMMAND_NONE = 0
|
||||
PLAYER_COMMAND_EXIT = 1
|
||||
|
@ -18,6 +13,8 @@ PLAYER_COMMAND_RESTART_SONG = 4
|
|||
# ---------------------------------------------------------------------- #
|
||||
# PlayerGUI CLASS #
|
||||
# ---------------------------------------------------------------------- #
|
||||
|
||||
|
||||
class PlayerGUI():
|
||||
'''
|
||||
Class implementing GUI for both initial screen but the player itself
|
||||
|
@ -26,8 +23,10 @@ class PlayerGUI():
|
|||
def __init__(self):
|
||||
self.Window = None
|
||||
self.TextElem = None
|
||||
self.PortList = mido.get_output_names() # use to get the list of midi ports
|
||||
self.PortList = self.PortList[::-1] # reverse the list so the last one is first
|
||||
# use to get the list of midi ports
|
||||
self.PortList = mido.get_output_names()
|
||||
# reverse the list so the last one is first
|
||||
self.PortList = self.PortList[::-1]
|
||||
|
||||
# ---------------------------------------------------------------------- #
|
||||
# PlayerChooseSongGUI #
|
||||
|
@ -37,20 +36,27 @@ class PlayerGUI():
|
|||
|
||||
# ---------------------- DEFINION OF CHOOSE WHAT TO PLAY GUI ----------------------------
|
||||
|
||||
layout = [[sg.Text('MIDI File Player', font=("Helvetica", 15), size=(20, 1), text_color='green')],
|
||||
[sg.Text('File Selection', font=("Helvetica", 15), size=(20, 1))],
|
||||
[sg.Text('Single File Playback', justification='right'), sg.InputText(size=(65, 1), key='midifile'), sg.FileBrowse(size=(10, 1), file_types=(("MIDI files", "*.mid"),))],
|
||||
[sg.Text('Or Batch Play From This Folder', auto_size_text=False, justification='right'), sg.InputText(size=(65, 1), key='folder'), sg.FolderBrowse(size=(10, 1))],
|
||||
helv = ("Helvetica", 15)
|
||||
layout = [[sg.Text('MIDI File Player', font=helv15, size=(20, 1), text_color='green')],
|
||||
[sg.Text('File Selection', font=helv15, size=(20, 1))],
|
||||
[sg.Text('Single File Playback', justification='right'),
|
||||
sg.InputText(size=(65, 1), key='midifile'),
|
||||
sg.FileBrowse(size=(10, 1), file_types=(("MIDI files", "*.mid"),))],
|
||||
[sg.Text('Or Batch Play From This Folder', auto_size_text=False, justification='right'),
|
||||
sg.InputText(size=(65, 1), key='folder'),
|
||||
sg.FolderBrowse(size=(10, 1))],
|
||||
[sg.Text('_' * 250, auto_size_text=False, size=(100, 1))],
|
||||
[sg.Text('Choose MIDI Output Device', size=(22, 1)),
|
||||
sg.Listbox(values=self.PortList, size=(30, len(self.PortList) + 1), key='device')],
|
||||
[sg.Text('_' * 250, auto_size_text=False, size=(100, 1))],
|
||||
[sg.SimpleButton('PLAY', size=(12, 2), button_color=('red', 'white'), font=("Helvetica", 15), bind_return_key=True), sg.Text(' ' * 2, size=(4, 1)), sg.Cancel(size=(8, 2), font=("Helvetica", 15))]]
|
||||
[sg.SimpleButton('PLAY', size=(12, 2), button_color=('red', 'white'), font=helv15, bind_return_key=True),
|
||||
sg.Text(' ' * 2, size=(4, 1)),
|
||||
sg.Cancel(size=(8, 2), font=helv15)]]
|
||||
|
||||
window = sg.Window('MIDI File Player', auto_size_text=False, default_element_size=(30, 1), font=("Helvetica", 12)).Layout(layout)
|
||||
window = sg.Window('MIDI File Player', layout, auto_size_text=False,
|
||||
default_element_size=(30, 1), font=helv)
|
||||
self.Window = window
|
||||
return window.Read()
|
||||
|
||||
return window.read()
|
||||
|
||||
def PlayerPlaybackGUIStart(self, NumFiles=1):
|
||||
# ------- Make a new FlexForm ------- #
|
||||
|
@ -60,37 +66,44 @@ class PlayerGUI():
|
|||
image_next = './ButtonGraphics/Next.png'
|
||||
image_exit = './ButtonGraphics/Exit.png'
|
||||
|
||||
self.TextElem = sg.T('Song loading....', size=(70, 5 + NumFiles), font=("Helvetica", 14), auto_size_text=False)
|
||||
self.SliderElem = sg.Slider(range=(1, 100), size=(50, 8), orientation='h', text_color='#f0f0f0')
|
||||
self.TextElem = sg.Text('Song loading....',
|
||||
size=(70, 5 + NumFiles),
|
||||
font=("Helvetica", 14), auto_size_text=False)
|
||||
self.SliderElem = sg.Slider(range=(1, 100),
|
||||
size=(50, 8),
|
||||
orientation='h', text_color='#f0f0f0')
|
||||
css = {
|
||||
'image_size': (50, 50),
|
||||
'image_subsample': 2,
|
||||
'border_width': 0,
|
||||
'button_color': sg.TRANSPARENT_BUTTON
|
||||
}
|
||||
layout = [
|
||||
[sg.T('MIDI File Player', size=(30, 1), font=("Helvetica", 25))],
|
||||
[self.TextElem],
|
||||
[self.SliderElem],
|
||||
[sg.Button('', button_color=sg.TRANSPARENT_BUTTON,
|
||||
image_filename=image_pause, image_size=(50,50), image_subsample=2, border_width=0, key='PAUSE'), sg.T(' '),
|
||||
sg.Button('', button_color=sg.TRANSPARENT_BUTTON,
|
||||
image_filename=image_next, image_size=(50,50), image_subsample=2, border_width=0, key='NEXT'), sg.T(' '),
|
||||
sg.Button('', button_color=sg.TRANSPARENT_BUTTON,
|
||||
image_filename=image_restart, image_size=(50,50), image_subsample=2, border_width=0, key='Restart Song'), sg.T(' '),
|
||||
sg.Button('', button_color=sg.TRANSPARENT_BUTTON,
|
||||
image_filename=image_exit, image_size=(50,50), image_subsample=2, border_width=0,key='EXIT')]
|
||||
]
|
||||
[sg.Text('MIDI File Player', size=(30, 1), font=("Helvetica", 25))],
|
||||
[self.TextElem],
|
||||
[self.SliderElem],
|
||||
[sg.Button('', image_filename=image_pause, **css, key='PAUSE'), sg.Text(' '),
|
||||
sg.Button('', image_filename=image_next, **css, key='NEXT'), sg.Text(' '),
|
||||
sg.Button('', image_filename=image_restart, **css, key='Restart Song'), sg.Text(' '),
|
||||
sg.Button('', image_filename=image_exit, **css, key='EXIT')]
|
||||
]
|
||||
|
||||
window = sg.Window('MIDI File Player', default_element_size=(30, 1), font=("Helvetica", 25)).Layout(layout).Finalize()
|
||||
window = sg.Window('MIDI File Player', layout, default_element_size=(
|
||||
30, 1), font=("Helvetica", 25), finalize=True)
|
||||
self.Window = window
|
||||
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------- #
|
||||
# PlayerPlaybackGUIUpdate #
|
||||
# Refresh the GUI for the main playback interface (must call periodically #
|
||||
# ------------------------------------------------------------------------- #
|
||||
|
||||
def PlayerPlaybackGUIUpdate(self, DisplayString):
|
||||
window = self.Window
|
||||
if 'window' not in locals() or window is None: # if the widnow has been destoyed don't mess with it
|
||||
# if the widnow has been destoyed don't mess with it
|
||||
if 'window' not in locals() or window is None:
|
||||
return PLAYER_COMMAND_EXIT
|
||||
self.TextElem.Update(DisplayString)
|
||||
event, (values) = window.Read(timeout=0)
|
||||
self.TextElem.update(DisplayString)
|
||||
event, (values) = window.read(timeout=0)
|
||||
if event is None:
|
||||
return PLAYER_COMMAND_EXIT
|
||||
if event == 'PAUSE':
|
||||
|
@ -118,38 +131,42 @@ def main():
|
|||
'''
|
||||
return int(round(time.time() * 1000))
|
||||
|
||||
|
||||
pback = PlayerGUI()
|
||||
|
||||
button, values = pback.PlayerChooseSongGUI()
|
||||
if button != 'PLAY':
|
||||
sg.PopupCancel('Cancelled...\nAutoclose in 2 sec...', auto_close=True, auto_close_duration=2)
|
||||
sys.exit(69)
|
||||
sg.popup_cancel('Cancelled...\nAutoclose in 2 sec...',
|
||||
auto_close=True, auto_close_duration=2)
|
||||
return
|
||||
if values['device']:
|
||||
midi_port = values['device'][0]
|
||||
else:
|
||||
sg.PopupCancel('No devices found\nAutoclose in 2 sec...', auto_close=True, auto_close_duration=2)
|
||||
sg.popup_cancel('No devices found\nAutoclose in 2 sec...',
|
||||
auto_close=True, auto_close_duration=2)
|
||||
|
||||
batch_folder = values['folder']
|
||||
midi_filename = values['midifile']
|
||||
# ------ Build list of files to play --------------------------------------------------------- #
|
||||
if batch_folder:
|
||||
filelist = os.listdir(batch_folder)
|
||||
filelist = [batch_folder+'/'+f for f in filelist if f.endswith(('.mid', '.MID'))]
|
||||
filelist = [batch_folder+'/' +
|
||||
f for f in filelist if f.endswith(('.mid', '.MID'))]
|
||||
filetitles = [os.path.basename(f) for f in filelist]
|
||||
elif midi_filename: # an individual filename
|
||||
filelist = [midi_filename,]
|
||||
filetitles = [os.path.basename(midi_filename),]
|
||||
filelist = [midi_filename, ]
|
||||
filetitles = [os.path.basename(midi_filename), ]
|
||||
else:
|
||||
sg.PopupError('*** Error - No MIDI files specified ***')
|
||||
sys.exit(666)
|
||||
sg.popup_error('*** Error - No MIDI files specified ***')
|
||||
return
|
||||
|
||||
# ------ LOOP THROUGH MULTIPLE FILES --------------------------------------------------------- #
|
||||
pback.PlayerPlaybackGUIStart(NumFiles=len(filelist) if len(filelist) <=10 else 10)
|
||||
pback.PlayerPlaybackGUIStart(NumFiles=len(filelist) if len(filelist) <= 10 else 10)
|
||||
port = None
|
||||
|
||||
# Loop through the files in the filelist
|
||||
for now_playing_number, current_midi_filename in enumerate(filelist):
|
||||
display_string = 'Playing Local File...\n{} of {}\n{}'.format(now_playing_number+1, len(filelist), current_midi_filename)
|
||||
display_string = 'Playing Local File...\n{} of {}\n{}'.format(
|
||||
now_playing_number+1, len(filelist), current_midi_filename)
|
||||
midi_title = filetitles[now_playing_number]
|
||||
# --------------------------------- REFRESH THE GUI ----------------------------------------- #
|
||||
pback.PlayerPlaybackGUIUpdate(display_string)
|
||||
|
@ -164,16 +181,19 @@ def main():
|
|||
try:
|
||||
mid = mido.MidiFile(filename=midi_filename)
|
||||
except:
|
||||
print('****** Exception trying to play MidiFile filename = {}***************'.format(midi_filename))
|
||||
sg.PopupError('Exception trying to play MIDI file:', midi_filename, 'Skipping file')
|
||||
print(' Fail at playing Midi file = {}****'.format(midi_filename))
|
||||
sg.popup_error('Exception trying to play MIDI file:',
|
||||
midi_filename, 'Skipping file')
|
||||
continue
|
||||
|
||||
# Build list of data contained in MIDI File using only track 0
|
||||
midi_length_in_seconds = mid.length
|
||||
display_file_list = '>> ' + '\n'.join([f for i, f in enumerate(filetitles[now_playing_number:]) if i < 10])
|
||||
display_file_list = '>> ' + \
|
||||
'\n'.join([f for i, f in enumerate(
|
||||
filetitles[now_playing_number:]) if i < 10])
|
||||
paused = cancelled = next_file = False
|
||||
######################### Loop through MIDI Messages ###########################
|
||||
while(True):
|
||||
while True :
|
||||
start_playback_time = GetCurrentTime()
|
||||
port.reset()
|
||||
|
||||
|
@ -181,12 +201,14 @@ def main():
|
|||
#################### GUI - read values ##################
|
||||
if not midi_msg_number % 4: # update the GUI every 4 MIDI messages
|
||||
t = (GetCurrentTime() - start_playback_time)//1000
|
||||
display_midi_len = '{:02d}:{:02d}'.format(*divmod(int(midi_length_in_seconds),60))
|
||||
display_midi_len = '{:02d}:{:02d}'.format(
|
||||
*divmod(int(midi_length_in_seconds), 60))
|
||||
display_string = 'Now Playing {} of {}\n{}\n {:02d}:{:02d} of {}\nPlaylist:'.\
|
||||
format(now_playing_number+1, len(filelist), midi_title, *divmod(t, 60), display_midi_len)
|
||||
# display list of next 10 files to be played.
|
||||
pback.SliderElem.Update(t, range=(1,midi_length_in_seconds))
|
||||
rc = pback.PlayerPlaybackGUIUpdate(display_string + '\n' + display_file_list)
|
||||
# display list of next 10 files to be played.
|
||||
pback.SliderElem.update(t, range=(1, midi_length_in_seconds))
|
||||
rc = pback.PlayerPlaybackGUIUpdate(
|
||||
display_string + '\n' + display_file_list)
|
||||
else: # fake rest of code as if GUI did nothing
|
||||
rc = PLAYER_COMMAND_NONE
|
||||
if paused:
|
||||
|
@ -219,9 +241,9 @@ def main():
|
|||
if cancelled:
|
||||
break
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------- #
|
||||
# LAUNCH POINT -- program starts and ends here #
|
||||
# ---------------------------------------------------------------------- #
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue