diff options
Diffstat (limited to 'solo_tool_qt.py')
| -rw-r--r-- | solo_tool_qt.py | 175 | 
1 files changed, 175 insertions, 0 deletions
| diff --git a/solo_tool_qt.py b/solo_tool_qt.py new file mode 100644 index 0000000..5db6d3f --- /dev/null +++ b/solo_tool_qt.py @@ -0,0 +1,175 @@ +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import * +from MainWindow import Ui_MainWindow + +import vlc + +import logging +LOGLEVEL = logging.DEBUG + +import midi +import playlist +import control + +class MainWindow(QMainWindow, Ui_MainWindow): +    def __init__(self, *args, **kwargs): +        super(MainWindow, self).__init__(*args, **kwargs) +        self.setupUi(self) + +        self.midiEnabled = False +        self.player = vlc.MediaListPlayer() +        self.playlist = playlist.Playlist(self) +        self.control = control.Control(self) + +        """ +        self.player.durationChanged.connect(self.updateDuration) +        self.player.positionChanged.connect(self.updatePosition) + +        self.player.positionChanged.connect(self.positionChanged) + +        self.abListModel = AbListModel() +        self.abListView.setModel(self.abListModel) +        self.abListView.selectionModel().selectionChanged.connect(self.abListSelectionChanged) + +        self.saveAbButton.pressed.connect(self.addAb) +        self.internalState = dict() + +        self.saveSessionButton.pressed.connect(self.saveSession) +        self.loadSessionButton.pressed.connect(self.loadSession) + +        self.abRepeatButton.clicked.connect(self.abRepeatToggleClick) + +        self.initMidiButton.pressed.connect(self.initMidi) +        """ + +        self.show() + +    def playlistPositionChanged(self, i): +        if i > -1: +            ix = self.playlistModel.index(i) +            self.songListView.setCurrentIndex(ix) + +    def abListSelectionChanged(self, ix): +        if len(ix.indexes()) > 0: +            i = ix.indexes()[0].row() +            ab = self.abListModel.abList[i] +            self.aSlider.setValue(ab[0]) +            self.bSlider.setValue(ab[1]) + +    def addAb(self, song=None, a=None, b=None): +        currentSong = song or self.playlist.currentMedia().canonicalUrl().path() +        abState = [a or self.aSlider.value(), b or self.bSlider.value()] +        self.abListModel.abList.append(abState) +        self.abListModel.layoutChanged.emit() + + +        if self.midiEnabled: +            midi.button_on(midi.lp_key[0][1], (midi.GREEN if self.player.state() == QMediaPlayer.PlayingState else midi.RED)) + +    def updateDuration(self, duration): +        self.aSlider.setMaximum(duration) +        self.bSlider.setMaximum(duration) + +    def updatePosition(self, position): +        # Disable the events to prevent updating triggering a setPosition event (can cause stuttering). +        self.songSlider.blockSignals(True) +        self.songSlider.setValue(position) +        self.songSlider.blockSignals(False) + +    def positionChanged(self, position): +        if self.abRepeatButton.isChecked() and position > self.bSlider.value(): +            self.player.setPosition(self.aSlider.value()) + +    def loadSession(self): +        path, _ = QFileDialog.getOpenFileName(self, "Open file", "", "session (*.json)") +        if path: +            import json +            with open(path, "r") as f: +                session = json.load(f) +                self.reset() +                 +                for song in session: +                    self.addSong(song) +                    self.abListModel.abList = self.internalState[song] + +                    for ab in session[song]: +                        self.addAb(song=song, a=ab[0], b=ab[1]) + +    def saveSession(self): +        path, _ = QFileDialog.getSaveFileName(self, "Save file", "", "session (*.json)") +        if path: +            import json +            with open(path, "w") as f: +                json.dump(self.internalState, f) + +    def abRepeatToggleClick(self): +        midi.button_on(midi.lp_key[1][1], (midi.GREEN if self.abRepeatButton.isChecked() else midi.RED)) + +    def initMidi(self): +        if self.midiEnabled: +            return + +        try: +            midi.midi_init() +        except Exception as e: +            print(e) +            return +         +        self.midiEnabled = True + +        # play pause +        midi.button_on(midi.lp_key[0][1], (midi.GREEN if self.player.state() == QMediaPlayer.PlayingState else midi.RED)) +        midi.on_press(midi.lp_key[0][1], self.playPauseButton.click) + +        # next song +        midi.button_on(midi.lp_key[0][2], midi.YELLOW) +        midi.on_press(midi.lp_key[0][2], self.playlist.next) + +        # previous song +        midi.button_on(midi.lp_key[0][0], midi.YELLOW) +        midi.on_press(midi.lp_key[0][0], self.playlist.previous) + +        # a/b repeat +        midi.button_on(midi.lp_key[1][1], (midi.GREEN if self.abRepeatButton.isChecked() else midi.RED)) +        midi.on_press(midi.lp_key[1][1], self.abRepeatButton.click) + +        # next ab +        # TODO continue here +        midi.button_on(midi.lp_key[1][2], midi.YELLOW) +        #midi.on_press(midi.lp_key[1][2], nextAb) +         + +    def reset(self): +        self.playlist.clear() +        self.playlistModel.layoutChanged.emit() +        self.abListModel.abList.clear() +        self.abListModel.layoutChanged.emit() + +if __name__ == '__main__': +    logging.basicConfig(level=LOGLEVEL) + +    app = QApplication([]) +    app.setApplicationName("Solo Tool") +    app.setStyle("Fusion") + +    # Fusion dark palette from https://gist.github.com/QuantumCD/6245215. +    palette = QPalette() +    palette.setColor(QPalette.Window, QColor(53, 53, 53)) +    palette.setColor(QPalette.WindowText, Qt.white) +    palette.setColor(QPalette.Base, QColor(25, 25, 25)) +    palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53)) +    palette.setColor(QPalette.ToolTipBase, Qt.white) +    palette.setColor(QPalette.ToolTipText, Qt.white) +    palette.setColor(QPalette.Text, Qt.white) +    palette.setColor(QPalette.Button, QColor(53, 53, 53)) +    palette.setColor(QPalette.ButtonText, Qt.white) +    palette.setColor(QPalette.BrightText, Qt.red) +    palette.setColor(QPalette.Link, QColor(42, 130, 218)) +    palette.setColor(QPalette.Highlight, QColor(42, 130, 218)) +    palette.setColor(QPalette.HighlightedText, Qt.black) +    app.setPalette(palette) +    app.setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }") + +    window = MainWindow() +    app.exec_() | 
