diff options
Diffstat (limited to 'muse2/share/scripts/SwingQuantize1')
-rwxr-xr-x | muse2/share/scripts/SwingQuantize1 | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/muse2/share/scripts/SwingQuantize1 b/muse2/share/scripts/SwingQuantize1 new file mode 100755 index 00000000..11fded84 --- /dev/null +++ b/muse2/share/scripts/SwingQuantize1 @@ -0,0 +1,105 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# MusE external midi processing script +# By: Robert Jonsson 2009 +# Quantize + +import sys,time +from PyQt4 import QtGui, QtCore +import random + +class Quantize(QtGui.QWidget): + def __init__(self, parent=None): + QtGui.QWidget.__init__(self, parent) + + self.setWindowTitle('Swing quantize V1') + + + self.beatEdit = QtGui.QComboBox() + self.beatEdit.addItem('1/1',1) + self.beatEdit.addItem('1/2',2) + self.beatEdit.addItem('1/4',4) + self.beatEdit.addItem('1/8',8) + self.beatEdit.addItem('1/16',16) + self.beatEdit.addItem('1/32',32) + self.beatEdit.setCurrentIndex(2) + self.spreadEdit = QtGui.QLineEdit() + self.spreadEdit.setText('10') + + button = QtGui.QPushButton("Execute") + self.connect(button, QtCore.SIGNAL('clicked()'), self.execute) + + grid = QtGui.QGridLayout() + grid.setSpacing(3) + + grid.addWidget(QtGui.QLabel('Beat granularity:'), 1, 0) + grid.addWidget(self.beatEdit, 1, 1) + grid.addWidget(QtGui.QLabel('Spread/Swing(ticks)'), 2, 0) + grid.addWidget(self.spreadEdit, 2, 1) + grid.addWidget(button, 3, 1) + + self.setLayout(grid) + self.resize(200, 100) + button.setFocus() + + def execute(self): + testFile = file(sys.argv[1],"r") + inputEvents = testFile.readlines() + testFile.close() + + beatDiv = self.beatEdit.itemData(self.beatEdit.currentIndex()).toInt()[0] + minSize=0 # fill in when we get the beat size value + outputEvents=[] + quantLen=0 + + #get beat length to calculate minimum length of event + for line in inputEvents: + if line.startswith('BEATLEN'): + tag,tick = line.split(' ') + beatLen=int(tick) + quantLen=int(tick)/beatDiv*4 + print "quantLen=%d beatDiv=%d"%(quantLen, beatDiv) + print line.strip() + #loop through events and quantize to the given beat + eventList=[] + for line in inputEvents: + if line.startswith('NOTE'): + tag,tick,pitch,length,velocity = line.split(' ') + + # over quantize + lowerBound=(int(tick)/quantLen)*quantLen + upperBound=lowerBound+quantLen + lowDiff=int(tick)-lowerBound + highDiff=upperBound - int(tick) + if( lowDiff < highDiff): + newTick=lowerBound + else: + newTick=upperBound + + # apply swing factor to every other 8 beat + print "float =%f int = %d"%((float(newTick+beatLen)) / beatLen/2,((newTick+beatLen))/beatLen/2) + if ((float(newTick+beatLen)) / beatLen/2 - ((newTick+beatLen))/beatLen/2) < 0.1: + print "adding swing to:",newTick + newTick=int(random.gauss(newTick,self.spreadEdit.text().toInt()[0])) + if (newTick < 0): + newTick=0 + + newLine="NOTE "+ str(newTick)+" " + pitch + " "+ length + " " + velocity + print "newLine:",newLine.strip() + outputEvents.append(newLine) + else: + outputEvents.append(line) + + + + testFile = file(sys.argv[1],"w") + testFile.writelines(outputEvents) + testFile.close() + + quit() + + +app = QtGui.QApplication(sys.argv) +qb = Quantize() +qb.show() +sys.exit(app.exec_()) |