diff --git a/QtTSApreferences.py b/QtTSApreferences.py index 2f0a4f1..02dc0e1 100644 --- a/QtTSApreferences.py +++ b/QtTSApreferences.py @@ -72,6 +72,7 @@ def setupUi(self, Preferences): self.label_12.setObjectName("label_12") self.gridLayout.addWidget(self.label_12, 3, 0, 1, 1) self.filterBox = QtWidgets.QComboBox(self.layoutWidget) + self.filterBox.setEditable(False) self.filterBox.setObjectName("filterBox") self.gridLayout.addWidget(self.filterBox, 3, 1, 1, 1) self.exportButton = QtWidgets.QPushButton(self.layoutWidget) diff --git a/QtTSAprefs.db b/QtTSAprefs.db index b74ccca..3e02207 100644 Binary files a/QtTSAprefs.db and b/QtTSAprefs.db differ diff --git a/QtTinySA.py b/QtTinySA.py index 08bf079..ff50d3c 100755 --- a/QtTinySA.py +++ b/QtTinySA.py @@ -169,7 +169,7 @@ def restoreSettings(self): self.freq_changed(False) # start/stop mode pointsChanged() ui.graphWidget.setXRange(ui.start_freq.value(), ui.stop_freq.value()) - logging.info(f'restoreSettings(): band = {numbers.tm.record(0).value("band")}') + logging.debug(f'restoreSettings(): band = {numbers.tm.record(0).value("band")}') # update trace and marker settings from the database. 1 = last saved (default) settings S1.dLoad(1) @@ -684,14 +684,14 @@ def updateMarker(self, frequencies, readings, fPeaks): # called by updateGUI() else: self.vline.label.setText(f'M{self.vline.name()} {self.vline.value():.3f}MHz {dBm:.1f}dBm') - def addFreqMarker(self, freq, colour, name): # adds simple frequency marker without full marker capability + def addFreqMarker(self, freq, colour, name, position): # adds simple freq marker without full marker capability if ui.presetLabel.isChecked(): - marker = ui.graphWidget.addLine(freq, 90, pen=pyqtgraph.mkPen(colour, width=0.5, style=QtCore.Qt.DashLine), - label=name, labelOpts={'position': 0.05, 'color': (colour)}) - marker.label.setMovable(True) + self.marker = ui.graphWidget.addLine(freq, 90, pen=pyqtgraph.mkPen(colour, width=0.5, style=QtCore.Qt.DashLine), + label=name, labelOpts={'position': position, 'color': (colour)}) + self.marker.label.setMovable(True) else: - marker = ui.graphWidget.addLine(freq, 90, pen=pyqtgraph.mkPen(colour, width=0.5, style=QtCore.Qt.DashLine)) - self.fifo.put(marker) # store the marker object in a queue + self.marker = ui.graphWidget.addLine(freq, 90, pen=pyqtgraph.mkPen(colour, width=0.5, style=QtCore.Qt.DashLine)) + self.fifo.put(self.marker) # store the marker object in a queue def delFreqMarkers(self): for i in range(0, self.fifo.qsize()): @@ -794,9 +794,11 @@ def createTableModel(self): self.dwm.setModel(self.tm) self.dwm.setSubmitPolicy(QDataWidgetMapper.AutoSubmit) - def addRow(self): # adds a blank row to the frequency bands table widget - self.tm.insertRow(self.currentRow + 1) - self.currentRow += 1 + def addRow(self): # adds a blank row to the frequency bands table widget above current row + if self.currentRow == 0: + self.tm.insertRow(0) + else: + self.tm.insertRow(self.currentRow) preferences.freqBands.selectRow(self.currentRow) def saveChanges(self): @@ -816,20 +818,11 @@ def tableClicked(self): self.currentRow = preferences.freqBands.currentIndex().row() # the row index from the QModelIndexObject logging.debug(f'row {self.currentRow} clicked') - def insertData(self, name, typeF, startF, stopF, visible, colour): + def insertData(self, **data): record = self.tm.record() - record.setValue('value', int(eval(visible))) # converts string(visible) 'True' 'False' to 1 or 0 - record.setValue('name', name) - record.setValue('startF', f'{startF:.6f}') - record.setValue('stopF', f'{stopF:.6f}') - bandstype.tm.setFilter('preset = "' + typeF + '"') # using relation directly doesn't seem to work - bandstype.tm.select() - record.setValue('preset', bandstype.tm.record(0).value('ID')) - colours.tm.setFilter('colour = "' + colour + '"') # using relation directly doesn't seem to work - colours.tm.select() - record.setValue('colour', colours.tm.record(0).value('ID')) + for key, value in data.items(): + record.setValue(str(key), value) self.tm.insertRecord(-1, record) - bandstype.tm.setFilter('') self.tm.select() self.tm.layoutChanged.emit() self.dwm.submit() @@ -849,19 +842,31 @@ def filterType(self, prefsDialog, boxText): def readCSV(self, fileName): with open(fileName, "r") as fileInput: - header = None - for row in csv.reader(fileInput): - if not header: - header = row - logging.info(f'header = {header}') - indx = self.findCols(header) - continue - if len(indx) == 6: # (name, preset(=type), startF, stopF, visible, colour) - logging.info(f'row = {row}') - bands.insertData(row[indx[0]], row[indx[1]], float(row[indx[2]]), float(row[indx[3]]), row[indx[4]], row[indx[5]]) - elif len(indx) == 3: - bands.insertData(row[indx[0]], 'RF mic', float(row[indx[1]]) / 1e3, 0, row[indx[2]].lower()) - logging.debug(f'colour = {row[indx[2]].lower()}') + reader = csv.DictReader(fileInput) + for row in reader: + record = self.tm.record() + for key, value in row.items(): + # don't understand how to make relation work for these fields + if key == 'preset': + value = presetID(value) + if key.lower() == 'colour': + value = colourID(value) + if key == 'value': + value = int(eval(value)) + # to match RF mic CSV files + if key == 'Frequency': + key = 'startF' + value = str(float(value) / 1e3) + if key != 'ID': # ID is the table primary key and is auto-populated + record.setValue(str(key), value) + if record.value('value') not in (0, 1): # because it's not present in RF mic CSV files + record.setValue('value', 1) + if record.value('preset') == '': # preset missing so use current preferences filterbox text + record.setValue('preset', presetID(preferences.filterBox.currentText())) + self.tm.insertRecord(-1, record) + self.tm.select() + self.tm.layoutChanged.emit() + self.dwm.submit() def writeCSV(self, fileName): header = [] @@ -875,23 +880,6 @@ def writeCSV(self, fileName): for columnNumber in range(1, 8)] output.writerow(fields) - def findCols(self, header): - indx = [] - try: - for i in range(1, self.tm.columnCount()): # start at 1 - don't include ID column - indx.append(header.index(self.tm.record().fieldName(i))) # Match to QtTinySA CSV export format - logging.info(f'i = {i} indx = {indx}') - except ValueError: - indx = [] - try: - indx.append(header.index('Name')) # Match to RF mic export format - indx.append(header.index('Frequency')) - indx.append(header.index('Colour')) - except ValueError: - popUp('CSV Import failed: Field headers were not identified', QMessageBox.Ok, QMessageBox.Critical) - return - return indx - def mapWidget(self, modelName): # maps the widget combo-box fields to the database tables, using the mapping table maps.tm.setFilter('model = "' + modelName + '"') for index in range(0, maps.tm.rowCount()): @@ -925,8 +913,10 @@ def addBandPressed(): message = 'M1 frequency >= M2 frequency' popUp(message, QMessageBox.Ok, QMessageBox.Information) return - name = 'M' + str(round(S1.vline.value(), 6)) - bands.insertData(name, ui.filterBox.currentText(), S1.vline.value(), S2.vline.value(), 'True', 'aliceblue') + bandName = 'M' + str(round(S1.vline.value(), 6)) + ID = presetID(str(ui.filterBox.currentText())) + bands.insertData(name=bandName, preset=ID, startF=f'{S1.vline.value():.6f}', + stopF=f'{S2.vline.value():.6f}', value=1, colour="aliceblue") else: message = 'M1 and M2 must both be enabled to add a new Band' popUp(message, QMessageBox.Ok, QMessageBox.Information) @@ -1050,17 +1040,25 @@ def popUp(message, button, icon): def freqMarkers(): + presetmarker.tm.select() S1.delFreqMarkers() S2.delFreqMarkers() - if ui.presetMarker.isChecked(): - for i in range(0, bands.tm.rowCount()): - startF = bands.tm.record(i).value('StartF') - colour = bands.tm.record(i).value('colour') - name = bands.tm.record(i).value('name') - S1.addFreqMarker(startF, colour, name) - stopF = bands.tm.record(i).value('StopF') - if bandstype.tm.record(ui.filterBox.currentIndex()).value('type') == 'band': - S2.addFreqMarker(stopF, colour, '') + for i in range(0, presetmarker.tm.rowCount()): + try: + startF = presetmarker.tm.record(i).value('StartF') + colour = presetmarker.tm.record(i).value('colour') + name = presetmarker.tm.record(i).value('name') + if ui.presetMarker.isChecked() and presetmarker.tm.record(i).value('visible')\ + and presetmarker.tm.record(i).value('type') != 'band': + S1.addFreqMarker(startF, colour, name, 0.05) + if ui.presetLabel.isChecked() and ui.presetLabel.checkState() == 2: + S1.marker.label.setAngle(90) + if presetmarker.tm.record(i).value('type') == 'band': + stopF = presetmarker.tm.record(i).value('StopF') + S1.addFreqMarker(startF, colour, name, 0.98) + S2.addFreqMarker(stopF, colour, name, 0.98) + except ValueError: + continue def freqMarkerLabel(): @@ -1069,14 +1067,14 @@ def freqMarkerLabel(): def exportData(): filename = QFileDialog.getSaveFileName(caption="Save As", filter="Comma Separated Values (*.csv)") - logging.info(f'filename {filename}') + logging.info(f'export filename is {filename[0]}') if filename[0] != '': bands.writeCSV(filename[0]) def importData(): filename = QFileDialog.getOpenFileName(caption="Select File to Import", filter="Comma Separated Values (*.csv)") - logging.info(f'filename {filename}') + logging.info(f'import filename is {filename[0]}') if filename[0] != '': bands.readCSV(filename[0]) @@ -1099,15 +1097,33 @@ def isMixerMode(): ui.centre_freq.setMaximum(100000) ui.stop_freq.setMaximum(100000) + +def presetID(typeF): # using the QSQLRelation directly doesn't work for preset. Can't see why. + for i in range(0, bandstype.tm.rowCount()): + preset = bandstype.tm.record(i).value('preset') + if preset == typeF: + ID = bandstype.tm.record(i).value('ID') + return ID + return 1 + + +def colourID(shade): # using the QSQLRelation directly doesn't work for colour. Can't see why. + for i in range(0, colours.tm.rowCount()): + colour = colours.tm.record(i).value('colour') + if colour == shade.lower(): + ID = colours.tm.record(i).value('ID') + return ID + return 1 + + ############################################################################### # Instantiate classes - tinySA = analyser() app = QtWidgets.QApplication([]) # create QApplication for the GUI app.setApplicationName('QtTinySA') -app.setApplicationVersion(' v0.10.2') +app.setApplicationVersion(' v0.10.3') window = QtWidgets.QMainWindow() ui = QtTinySpectrum.Ui_MainWindow() ui.setupUi(window) @@ -1137,6 +1153,7 @@ def isMixerMode(): colours = modelView('SVGColour') maps = modelView('mapping') +presetmarker = modelView(('frequencies')) ############################################################################### # GUI settings @@ -1169,7 +1186,6 @@ def isMixerMode(): S4.hline.setMovable(True) S4.hline.label.setFormat("{value:.1f}") - ############################################################################### # Connect signals from buttons and sliders. Connections for freq and rbw boxes are in 'initialise' Fn @@ -1206,9 +1222,10 @@ def isMixerMode(): ui.m4_type.activated.connect(S4.mType) # frequency band markers -ui.presetMarker.stateChanged.connect(freqMarkers) +ui.presetMarker.clicked.connect(freqMarkers) ui.presetLabel.stateChanged.connect(freqMarkerLabel) ui.mToBand.clicked.connect(addBandPressed) +ui.filterBox.currentTextChanged.connect(freqMarkers) # trace checkboxes ui.trace1.stateChanged.connect(S1.tEnable) @@ -1264,31 +1281,32 @@ def isMixerMode(): # table models - read/write views of the configuration data maps.createTableModel() maps.tm.select() -bands.createTableModel() # relational + +bands.createTableModel() bands.tm.setSort(3, QtCore.Qt.AscendingOrder) bands.tm.setHeaderData(5, QtCore.Qt.Horizontal, 'visible') bands.tm.setHeaderData(7, QtCore.Qt.Horizontal, 'LO') - +bands.tm.setEditStrategy(QSqlRelationalTableModel.OnFieldChange) +bands.tm.setRelation(2, QSqlRelation('freqtype', 'ID', 'preset')) # set 'type' column to a freq type choice combo box bands.tm.setRelation(5, QSqlRelation('boolean', 'ID', 'value')) # set 'view' column to a True/False choice combo box -boolean = QSqlRelationalDelegate(preferences.freqBands) -preferences.freqBands.setItemDelegate(boolean) - bands.tm.setRelation(6, QSqlRelation('SVGColour', 'ID', 'colour')) # set 'marker' column to a colours choice combo box -colour = QSqlRelationalDelegate(preferences.freqBands) -preferences.freqBands.setItemDelegate(colour) - -bands.tm.setRelation(2, QSqlRelation('freqtype', 'ID', 'preset')) # set 'type' column to a freq type choice combo box -fType = QSqlRelationalDelegate(preferences.freqBands) -preferences.freqBands.setItemDelegate(fType) - +presets = QSqlRelationalDelegate(preferences.freqBands) +preferences.freqBands.setItemDelegate(presets) colHeader = preferences.freqBands.horizontalHeader() colHeader.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) bandstype.createTableModel() +bandstype.tm.select() + colours.createTableModel() colours.tm.select() +presetmarker.createTableModel() +presetmarker.tm.setRelation(6, QSqlRelation('SVGColour', 'ID', 'colour')) +presetmarker.tm.setRelation(2, QSqlRelation('freqtype', 'ID', 'type')) +presetmarker.tm.select() + # populate the band presets combo box ui.band_box.setModel(bands.tm) ui.band_box.setModelColumn(1) @@ -1299,7 +1317,6 @@ def isMixerMode(): preferences.filterBox.setModelColumn(1) ui.filterBox.setModel(bandstype.tm) ui.filterBox.setModelColumn(1) -bandstype.tm.select() # connect the preferences dialogue box freq band table widget to the data model preferences.freqBands.setModel(bands.tm) diff --git a/QtTinySpectrum.py b/QtTinySpectrum.py index 68b4b46..89220d3 100644 --- a/QtTinySpectrum.py +++ b/QtTinySpectrum.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'QtTinySpectrum_small.ui' +# Form implementation generated from reading ui file 'QtTinySpectrum.ui' # # Created by: PyQt5 UI code generator 5.15.10 # @@ -500,6 +500,7 @@ def setupUi(self, MainWindow): font = QtGui.QFont() font.setPointSize(8) self.presetLabel.setFont(font) + self.presetLabel.setTristate(True) self.presetLabel.setObjectName("presetLabel") self.gridLayout_2.addWidget(self.presetLabel, 2, 10, 1, 1) self.marker3 = QtWidgets.QCheckBox(self.ViewNormal) @@ -976,7 +977,7 @@ def retranslateUi(self, MainWindow): self.filterBox.setToolTip(_translate("MainWindow", "Filter preset list")) self.centre_freq.setToolTip(_translate("MainWindow", "Sweep Centre")) self.scan_button.setText(_translate("MainWindow", "Run")) - self.presetMarker.setToolTip(_translate("MainWindow", "Mark preset freqs")) + self.presetMarker.setToolTip(_translate("MainWindow", "Show markers for preset freqs")) self.presetMarker.setText(_translate("MainWindow", "Presets")) self.band_box.setToolTip(_translate("MainWindow", "

Preset Frequency list

")) self.m4_type.setToolTip(_translate("MainWindow", "Marker Type")) @@ -985,8 +986,8 @@ def retranslateUi(self, MainWindow): self.m3_type.setToolTip(_translate("MainWindow", "Marker type")) self.marker4.setText(_translate("MainWindow", "M4")) self.start_freq.setToolTip(_translate("MainWindow", "Sweep Start")) - self.presetLabel.setToolTip(_translate("MainWindow", "Label preset freqs")) - self.presetLabel.setText(_translate("MainWindow", "Labels")) + self.presetLabel.setToolTip(_translate("MainWindow", "Show/hide/rotate preset marker labels")) + self.presetLabel.setText(_translate("MainWindow", "Label")) self.marker3.setText(_translate("MainWindow", "M3")) self.timeSpectrum.setToolTip(_translate("MainWindow", "3D spectrum")) self.timeSpectrum.setText(_translate("MainWindow", "3D")) diff --git a/QtTinySpectrum.ui b/QtTinySpectrum.ui index cad2e7f..b7814d7 100644 --- a/QtTinySpectrum.ui +++ b/QtTinySpectrum.ui @@ -848,7 +848,7 @@ - Mark preset freqs + Show markers for preset freqs Presets @@ -1065,10 +1065,13 @@ - Label preset freqs + Show/hide/rotate preset marker labels - Labels + Label + + + true diff --git a/Sample_preset_markers/TV_channels.csv b/Sample_preset_markers/TV_channels.csv new file mode 100644 index 0000000..65a5b0a --- /dev/null +++ b/Sample_preset_markers/TV_channels.csv @@ -0,0 +1,41 @@ +name,preset,startF,stopF,value,colour +21,marker,474,,TRUE,orange +22,marker,482,,TRUE,orange +23,marker,490,,TRUE,orange +24,marker,498,,TRUE,orange +25,marker,506,,TRUE,orange +26,marker,514,,TRUE,orange +27,marker,522,,TRUE,orange +28,marker,530,,TRUE,orange +29,marker,538,,TRUE,orange +30,marker,546,,TRUE,orange +31,marker,554,,TRUE,orange +32,marker,562,,TRUE,orange +33,marker,570,,TRUE,orange +34,marker,578,,TRUE,orange +35,marker,586,,TRUE,orange +36,marker,594,,TRUE,orange +37,marker,602,,TRUE,orange +38,marker,610,,TRUE,orange +39,marker,618,,TRUE,orange +40,marker,626,,TRUE,orange +41,marker,634,,TRUE,orange +42,marker,642,,TRUE,orange +43,marker,650,,TRUE,orange +44,marker,658,,TRUE,orange +45,marker,666,,TRUE,orange +46,marker,674,,TRUE,orange +47,marker,682,,TRUE,orange +48,marker,690,,TRUE,orange +49,marker,698,,TRUE,orange +50,marker,706,,TRUE,orange +51,marker,714,,TRUE,orange +52,marker,722,,TRUE,orange +53,marker,730,,TRUE,orange +54,marker,738,,TRUE,orange +55,marker,746,,TRUE,orange +56,marker,754,,TRUE,orange +57,marker,762,,TRUE,orange +58,marker,770,,TRUE,orange +59,marker,778,,TRUE,orange +60,marker,786,,TRUE,orange diff --git a/Sample_preset_markers/TV_channels.ods b/Sample_preset_markers/TV_channels.ods new file mode 100644 index 0000000..7ffaac2 Binary files /dev/null and b/Sample_preset_markers/TV_channels.ods differ diff --git a/Sample_preset_markers/TV_channels_test.csv b/Sample_preset_markers/TV_channels_test.csv new file mode 100644 index 0000000..3da8e48 --- /dev/null +++ b/Sample_preset_markers/TV_channels_test.csv @@ -0,0 +1,3 @@ +name,preset,startF,stopF,value,colour +21,marker,470,478,True,crimson +22,marker,478,486,True,blue diff --git a/Sample_preset_markers/broadcast.csv b/Sample_preset_markers/broadcast.csv new file mode 100644 index 0000000..a6f0ef7 --- /dev/null +++ b/Sample_preset_markers/broadcast.csv @@ -0,0 +1,79 @@ +name,preset,startF,stopF,value,colour +FM,broadcast,87.5,108,True,lime +DAB,broadcast,175,230,True,lime +TV,broadcast,470,700,True,lime +5B,marker,176.64,,True,orange +5C,marker,178.352,,True,orange +5D,marker,180.064,,True,orange +6A,marker,181.936,,True,orange +6B,marker,183.648,,True,orange +6C,marker,185.36,,True,orange +6D,marker,187.072,,True,orange +7A,marker,188.928,,True,orange +7B,marker,190.64,,True,orange +7C,marker,192.352,,True,orange +7D,marker,194.064,,True,orange +8A,marker,195.936,,True,orange +8B,marker,197.648,,True,orange +8C,marker,199.36,,True,orange +8D,marker,201.072,,True,orange +9A,marker,202.928,,True,orange +9B,marker,204.64,,True,orange +9C,marker,206.352,,True,orange +9D,marker,208.064,,True,orange +10A,marker,209.936,,True,orange +10B,marker,211.648,,True,orange +10C,marker,213.36,,True,orange +10D,marker,215.072,,True,orange +11A,marker,216.928,,True,orange +11B,marker,218.64,,True,orange +11C,marker,220.352,,True,orange +11D,marker,222.064,,True,orange +12A,marker,223.936,,True,orange +12B,marker,225.648,,True,orange +12C,marker,227.36,,True,orange +12D,marker,229.072,,True,orange +13A,marker,230.784,,True,orange +13B,marker,232.496,,True,orange +13C,marker,234.208,,True,orange +13D,marker,235.776,,True,orange +21,marker,474,,True,orange +22,marker,482,,True,orange +23,marker,490,,True,orange +24,marker,498,,True,orange +25,marker,506,,True,orange +26,marker,514,,True,orange +27,marker,522,,True,orange +28,marker,530,,True,orange +29,marker,538,,True,orange +30,marker,546,,True,orange +31,marker,554,,True,orange +32,marker,562,,True,orange +33,marker,570,,True,orange +34,marker,578,,True,orange +35,marker,586,,True,orange +36,marker,594,,True,orange +37,marker,602,,True,orange +38,marker,610,,True,orange +39,marker,618,,True,orange +40,marker,626,,True,orange +41,marker,634,,True,orange +42,marker,642,,True,orange +43,marker,650,,True,orange +44,marker,658,,True,orange +45,marker,666,,True,orange +46,marker,674,,True,orange +47,marker,682,,True,orange +48,marker,690,,True,orange +49,marker,698,,True,orange +50,marker,706,,True,orange +51,marker,714,,True,orange +52,marker,722,,True,orange +53,marker,730,,True,orange +54,marker,738,,True,orange +55,marker,746,,True,orange +56,marker,754,,True,orange +57,marker,762,,True,orange +58,marker,770,,True,orange +59,marker,778,,True,orange +60,marker,786,,True,orange diff --git a/Sample_preset_markers/markers.event.2024.csv b/Sample_preset_markers/markers.event.2024.csv new file mode 100644 index 0000000..1569573 --- /dev/null +++ b/Sample_preset_markers/markers.event.2024.csv @@ -0,0 +1,166 @@ +ID,Frequency,Name,Colour +1,470125,Guest 32,Red +2,470475,Guest 33,Red +3,470975,Guest 34,Red +4,471325,Guest 35,Red +5,473000,Guest 37,Red +6,473500,Guest 38,Red +7,473750,Guest 24,Red +8,473850,Guest 39,Red +9,474350,Guest 25,Red +10,474500,Guest 40,Red +11,475600,Guest 26,Red +12,476900,Guest 27,Red +13,477000,Guest 36,Red +14,477350,Guest 41,Red +15,486500,Guest 42,Red +16,486850,Guest 43,Red +17,488350,Guest 44,Red +18,488700,Guest 45,Red +19,490275,Guest 31,Red +20,490675,Guest 30,Red +21,511800,Guest 66,Red +22,513100,Guest 4,Green +23,514700,V2.4,Cyan +24,515100,G. CAPU,Cyan +25,515500,TB 3,Cyan +26,515900,TB 2,Cyan +27,516300,TB 1,Cyan +28,517100,TPT 3,Cyan +29,517500,TPT 2,Cyan +30,517900,TPT 1,Cyan +31,518300,Cor 4,Cyan +32,518700,Cor 3,Cyan +33,519100,Flute B,Cyan +34,519500,Flute A,Cyan +35,519900,Cello 6,Cyan +36,520300,Cello 5,Cyan +37,520700,Cello 3,Cyan +38,521100,Alto 6,Cyan +39,521500,Alto 5,Cyan +40,521900,Alto 4,Cyan +41,522300,Alto 3,Cyan +42,522700,V2.8,Cyan +43,523100,V2.7,Cyan +44,523500,V2.6,Cyan +45,523900,V2.5,Cyan +46,524600,Guest 3,Green +47,534600,V1.10,Cyan +48,535000,V1.9,Cyan +49,535400,V1.8,Cyan +50,535800,V1.7,Cyan +51,536200,V1.5,Cyan +52,536800,ITV 4,Red +53,538150,ITV 3,Red +54,538600,ITV 2,Red +55,539150,ITV 1,Red +56,540400,INSTR SP,Green +57,540800,ST SP,Green +58,541300,CH SP2,Green +59,550600,CH SP1,Green +60,551000,INSTRU 04,Green +61,551400,INSTRU 03,Green +62,551800,INSTRU 02,Green +63,552200,INSTRU 01,Green +64,552600,ST 03,Green +65,553000,ST 02,Green +66,553400,ST 01,Green +67,553800,CHANT 13,Green +68,554200,CHANT 12,Green +69,554600,CHANT 11,Green +70,555000,CHANT 10,Green +71,555400,CHANT 09,Green +72,555800,CHANT 08,Green +73,556200,CHANT 07,Green +74,556600,CHANT 06,Green +75,557050,Guest 2,Green +76,557500,Guest 1,Green +77,566500,COM ORC1,Magenta +78,566900,COM ORC2,Magenta +79,567325,COM PLA1,Magenta +80,567725,COM PLA2,Magenta +81,568175,COM PLA3,Magenta +82,568575,COM PLA4,Magenta +83,569100,CHANT 05,Green +84,569700,Guest 46,Red +85,570100,Guest 47,Red +86,570550,Guest 48,Red +87,570950,Guest 49,Red +88,571450,Guest 50,Red +89,571850,Guest 51,Red +90,572300,Guest 52,Red +91,572700,Guest 53,Red +92,573250,Guest 54,Red +93,573850,Guest 55,Red +94,574250,Guest 56,Red +95,574800,Guest 57,Red +96,575450,Guest 58,Red +97,575900,Guest 59,Red +98,576500,Guest 60,Red +99,576950,Guest 61,Red +100,577350,Guest 62,Red +101,577800,Guest 63,Red +102,578300,CHANT 04,Green +103,578950,Guest 64,Red +104,579400,CHANT 03,Green +105,580900,CHANT 02,Green +106,581500,CHANT 01,Green +107,593750,FX,Red +108,594700,Guest 22,Red +109,598550,Guest 21,Red +110,600800,Guest 23,Red +111,601900,Guest 19,Red +112,602550,Guest 18,Red +113,603850,Guest 17,Red +114,604800,Guest 16,Red +115,606250,Guest 15,Red +116,606750,FIX 15,Green +117,608300,Guest 20,Red +118,609450,FIX 05,Green +119,612350, COM PLAT,Red +120,616200,PFL,Green +121,616750,FIX 14,Green +122,617150,FIX 13,Green +123,618250,FIX 12,Green +124,618600,FIX 11,Green +125,619600,FIX 10,Green +126,621400,FIX 09,Green +127,621750,FIX 08,Green +128,622300,FIX 07,Green +129,622650,FIX 06,Green +130,623750,FIX 04,Green +131,624350,FIX 03,Green +132,625525,FIX 02,Green +133,625875,FIX 01,Green +134,647700,Guest 05,Red +135,648050,Guest 06,Red +136,648550,Guest 07,Red +137,648900,Guest 08,Red +138,649550,Guest 09,Red +139,649900,Guest 10,Red +140,650400,Guest 11,Red +141,650750,Guest 12,Red +142,652400,Guest 13,Red +143,653250,Guest 14,Red +144,653600,ENG,Red +145,654250,V2,Cyan +146,654600,ALTO,Cyan +147,655100,CELLO,Cyan +148,655450,VENTS,Cyan +149,657450,COR,Cyan +150,661800,CUIVRES,Cyan +151,662650,PERCS,Cyan +152,664650,SPARE,Cyan +153,665500,SPARE,Cyan +154,667350,SOLISTES,Cyan +155,668650,CHEFS,Cyan +156,669500,H. BORSA,Cyan +157,671500,ASSIST,Cyan +158,677050,ITV IEM,Red +159,680900,PFL,Cyan +160,682000,SPARE,Cyan +161,684900,V1,Cyan +162,692050,SYS TUNING,Red +163,693000,Mise en scene,Red +164,693475,REAL choff,Red +165,734375,FOH,Red diff --git a/Sample_preset_markers/markers.event.2024_subset.csv b/Sample_preset_markers/markers.event.2024_subset.csv new file mode 100644 index 0000000..86c5c7b --- /dev/null +++ b/Sample_preset_markers/markers.event.2024_subset.csv @@ -0,0 +1,4 @@ +ID,Frequency,Name,Colour +1,470125,Guest 32,Red +2,470475,Guest 33,Cyan +3,470975,Guest 34,Green diff --git a/Screenshots/3D_20240418_103532.png b/Screenshots/3D_20240418_103532.png new file mode 100644 index 0000000..ae646e7 Binary files /dev/null and b/Screenshots/3D_20240418_103532.png differ diff --git a/Screenshots/3D_20240418_103613.png b/Screenshots/3D_20240418_103613.png new file mode 100644 index 0000000..a745214 Binary files /dev/null and b/Screenshots/3D_20240418_103613.png differ diff --git a/Screenshots/tv_channels.png b/Screenshots/tv_channels.png new file mode 100644 index 0000000..42efa5d Binary files /dev/null and b/Screenshots/tv_channels.png differ diff --git a/preferences.ui b/preferences.ui index 6a2c8d8..128a4c9 100644 --- a/preferences.ui +++ b/preferences.ui @@ -111,7 +111,11 @@ - + + + false + +