Dup Ver Goto 📝

MidiCCTable

To
102 lines, 249 words, 2524 chars Page 'MidiCCTable' does not exist.
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
from rtmidi import MidiIn, MidiOut
import sys
import random
from rtmidi import MidiIn, MidiOut
from time import sleep
from datetime import datetime
now = lambda: datetime.now().timestamp()

app = QApplication([])

# Define Widgets
class T(QTableWidget):
  def __init__(self):
    super().__init__()
    self.data = {}
    self.setRows(0)
    self.setCols(2)
    self.setHorizontalHeaderLabels(["i","x","y","z"])
    self.populate()
  def setRows(self,nrows):
    self.nrows = nrows
    self.setRowCount(nrows)
  def setCols(self,ncols):
    self.ncols = ncols
    self.setColumnCount(ncols)
  def addcc(self,cc,value):
    n = now()
    self.data[cc] = (value,n)
    self.populate()
  def populate(self):
    normalfont = QFont("Arial",14)
    boldfont = QFont("Arial",14,QFont.Bold)
    ks = list(sorted(self.data.keys()))
    self.setRows(len(ks))
    t = now()
    for i,n in enumerate(ks):
      (v,when) = self.data[n]
      print(i,n,t,when,t-when)
      if t - when > 1:
        color = QColor.fromRgb(0,0,0)
        brush = QBrush(color)
        font = boldfont
      else:
        color = QColor.fromRgb(255,0,0)
        brush = QBrush(color)
        font = normalfont
      ni = QTableWidgetItem(str(n))
      vi = QTableWidgetItem(str(v))
      ni.setFont(font)
      vi.setFont(font)
      ni.setForeground(color)
      vi.setForeground(color)
      self.setItem(i,0,ni)
      self.setItem(i,1,vi)

class MidiMix:
  def __init__(self,table):
    midiin = MidiIn()
    self.midiin = midiin
    self.table = table

    in_name_to_number = { midiin.get_port_name(i):i for i in range(midiin.get_port_count()) }
    in_matches = lambda t: [ x for x in in_name_to_number if t.lower() in x.lower() ]
    in_matches_idx = lambda t: [ midiin_name_to_number[x] for x in in_matches(t) ]

    in_ports = in_matches("midi mix")
    if len(in_ports) > 1:
      raise Exception("Multiple ports found")
    if len(in_ports) == 0:
      raise Exception("No ports found")

    midiin.set_callback(self.callback)
    if len(in_ports) > 0:
      midiin.open_port(in_name_to_number[in_ports[0]])

  def callback(self,msg,*xs):
    msg, ts = msg
    n, v = msg[1:3]
    print(n,v)
    self.table.addcc(n,v)

  def __del__(self):
    self.midiin.close_port()

# Instantiate Widgets
table = T()
midimix = MidiMix(table)
table.resize(400,800)
table.show()

# Loader
def main():
  exit(app.exec())

if __name__ == "__main__":
  main()