#!/usr/bin/env python3 # -*- coding: utf-8 -*- # JACK Sequencer # Copyright (C) 2012 Filipe Coelho # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # For a full copy of the GNU General Public License see the COPYING file # Imports (Global) from PyQt4.QtCore import qFatal, QSettings from PyQt4.QtCore import QLineF, QPointF, QRectF, QSizeF from PyQt4.QtGui import QGraphicsItem, QGraphicsScene from PyQt4.QtGui import QPainter from PyQt4.QtGui import QApplication, QMainWindow # Imports (Custom Stuff) import ui_caitlyn from caitlib_helpers import * from shared_settings import * try: from PyQt4.QtOpenGL import QGLWidget hasGL = True except: hasGL = False # ------------------------------------------------------------------------------ # Caitlyn Qt Graphics Scene class CaitlynCanvasScene(QGraphicsScene): def __init__(self, parent, view): QGraphicsScene.__init__(self, parent) self.m_view = view if not self.m_view: qFatal("CaitlynCanvasScene() - invalid view") # ------------------------------------------------------------------------------ # Caitlyn items class CaitlynCanvasTimelineTopBar(QGraphicsItem): def __init__(self, scene, parent=None): QGraphicsItem.__init__(self, parent, scene) # horizontal length, matches min(full length of song, window) self.m_length = 100 def boundingRect(self): return QRectF(0, 0, self.m_length*4, 4) def paint(self, painter, option, widget): painter.setRenderHint(QPainter.Antialiasing, False) painter.drawRect(0, 0, self.m_length*14, 16) class CaitlynCanvasBox(QGraphicsItem): def __init__(self, scene, parent=None): QGraphicsItem.__init__(self, parent, scene) self.m_length = 1.0 def length(self): return self.m_length def boundingRect(self): return QRectF(0, 0, self.m_length*4, 4) def paint(self, painter, option, widget): painter.setRenderHint(QPainter.Antialiasing, False) painter.drawRect(0, 0, self.m_length*14, 16) # ------------------------------------------------------------------------------ # Caitlyn Main Window class CaitlynMainW(QMainWindow, ui_caitlyn.Ui_CaitlynMainW): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.setupUi(self) self.settings = QSettings("Cadence", "Caitlyn") self.loadSettings(True) self.scene = CaitlynCanvasScene(self, self.graphicsView) self.graphicsView.setScene(self.scene) self.graphicsView.setRenderHint(QPainter.Antialiasing, False) self.graphicsView.setRenderHint(QPainter.TextAntialiasing, False) self.item1 = CaitlynCanvasBox(self.scene) # Sequencer test code self.m_seq = CailibInstance("Caitlyn") if self.m_seq.isOk(): self.m_port1 = self.m_seq.createPort("out1") m = 44 self.m_port1.addControl(0*m, 0, 7, 99) self.m_port1.addControl(0*m, 0, 10, 63) self.m_port1.addProgram(0*m, 0, 0, 0) # 0 On ch=1 n=64 v=90 # 325 Off ch=1 n=64 v=90 # 384 On ch=1 n=62 v=90 # 709 Off ch=1 n=62 v=90 # 768 On ch=1 n=60 v=90 # 1093 Off ch=1 n=60 v=90 self.m_port1.addNote( 0*m, 0, 64, 90, 325*m) self.m_port1.addNote(384*m, 0, 62, 90, 325*m) self.m_port1.addNote(768*m, 0, 60, 90, 325*m) # 1152 On ch=1 n=62 v=90 # 1477 Off ch=1 n=62 v=90 # 1536 On ch=1 n=64 v=90 # 1861 Off ch=1 n=64 v=90 # 1920 On ch=1 n=64 v=90 # 2245 Off ch=1 n=64 v=90 self.m_port1.addNote(1152*m, 0, 62, 90, 325*m) self.m_port1.addNote(1536*m, 0, 64, 90, 325*m) self.m_port1.addNote(1920*m, 0, 64, 90, 325*m) # 2304 On ch=1 n=64 v=90 # 2955 Off ch=1 n=64 v=90 # 3072 On ch=1 n=62 v=90 # 3397 Off ch=1 n=62 v=90 # 3456 On ch=1 n=62 v=90 # 3781 Off ch=1 n=62 v=90 self.m_port1.addNote(2304*m, 0, 64, 90, 650*m) self.m_port1.addNote(3072*m, 0, 62, 90, 325*m) self.m_port1.addNote(3456*m, 0, 62, 90, 325*m) # 3840 On ch=1 n=62 v=90 # 4491 Off ch=1 n=62 v=90 # 4608 On ch=1 n=64 v=90 # 4933 Off ch=1 n=64 v=90 # 4992 On ch=1 n=67 v=90 # 5317 Off ch=1 n=67 v=90 self.m_port1.addNote(3840*m, 0, 62, 90, 650*m) self.m_port1.addNote(4608*m, 0, 64, 90, 325*m) self.m_port1.addNote(4992*m, 0, 67, 90, 325*m) # 5376 On ch=1 n=67 v=90 # 6027 Off ch=1 n=67 v=90 # 6144 On ch=1 n=64 v=90 # 6469 Off ch=1 n=64 v=90 # 6528 On ch=1 n=62 v=90 # 6853 Off ch=1 n=62 v=90 self.m_port1.addNote(5376*m, 0, 67, 90, 650*m) self.m_port1.addNote(6144*m, 0, 64, 90, 325*m) self.m_port1.addNote(6528*m, 0, 62, 90, 325*m) # 6912 On ch=1 n=60 v=90 # 7237 Off ch=1 n=60 v=90 # 7296 On ch=1 n=62 v=90 # 7621 Off ch=1 n=62 v=90 # 7680 On ch=1 n=64 v=90 # 8005 Off ch=1 n=64 v=90 self.m_port1.addNote(6912*m, 0, 60, 90, 325*m) self.m_port1.addNote(7296*m, 0, 62, 90, 325*m) self.m_port1.addNote(7680*m, 0, 64, 90, 325*m) # 8064 On ch=1 n=64 v=90 # 8389 Off ch=1 n=64 v=90 # 8448 On ch=1 n=64 v=90 # 9099 Off ch=1 n=64 v=90 # 9216 On ch=1 n=62 v=90 # 9541 Off ch=1 n=62 v=90 self.m_port1.addNote(8064*m, 0, 64, 90, 325*m) self.m_port1.addNote(8448*m, 0, 64, 90, 650*m) self.m_port1.addNote(9216*m, 0, 62, 90, 325*m) # 9600 On ch=1 n=62 v=90 # 9925 Off ch=1 n=62 v=90 # 9984 On ch=1 n=64 v=90 # 10309 Off ch=1 n=64 v=90 # 10368 On ch=1 n=62 v=90 # 10693 Off ch=1 n=62 v=90 self.m_port1.addNote(9600*m, 0, 62, 90, 325*m) self.m_port1.addNote(9984*m, 0, 64, 90, 325*m) self.m_port1.addNote(10368*m, 0, 62, 90, 325*m) # 10752 On ch=1 n=60 v=90 # 12056 Off ch=1 n=60 v=90 self.m_port1.addNote(10752*m, 0, 60, 90, 650*m) def saveSettings(self): self.settings.setValue("Geometry", self.saveGeometry()) def loadSettings(self, geometry): if geometry: self.restoreGeometry(self.settings.value("Geometry", "")) self.m_savedSettings = { "Main/RefreshInterval": self.settings.value("Main/RefreshInterval", 120, type=int) } def closeEvent(self, event): if self.m_seq.isOk(): self.m_seq.close() self.scene.removeItem(self.item1) self.saveSettings() QMainWindow.closeEvent(self, event) #--------------- main ------------------ if __name__ == '__main__': # App initialization app = QApplication(sys.argv) app.setApplicationName("Caitlyn") app.setApplicationVersion(VERSION) app.setOrganizationName("Cadence") #app.setWindowIcon(QIcon(":/scalable/caitlyn.svg")) # Show GUI gui = CaitlynMainW() # Set-up custom signal handling setUpSignals(gui) gui.show() # App-Loop and exit sys.exit(app.exec_())