[SCM] python-midiutil/master: Imported Upstream version 0.89
umlaeute at users.alioth.debian.org
umlaeute at users.alioth.debian.org
Thu Mar 31 14:16:37 UTC 2016
The following commit has been merged in the master branch:
commit ed7e163dd24b41e3fbb47ab9cb7522a30787de66
Author: IOhannes m zmölnig <zmoelnig at umlautQ.umlaeute.mur.at>
Date: Thu Mar 31 15:24:23 2016 +0200
Imported Upstream version 0.89
diff --git a/CHANGELOG b/CHANGELOG
index c2611c3..679e052 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,10 @@
+Date: 1 December 2013
+Version: 0.89
+ * Updated MIDIFile to support non-integral note values better.
+ * Changed default temporal resolution to 960 ticks per beat.
+ * Updated Python3 support. It is still somewhat experimental.
+ * Misc. Bug Fixes.
+
Date: 20 October 2009
Version: 0.87
diff --git a/MANIFEST b/MANIFEST
index b62a96b..d062e4c 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -5,8 +5,10 @@ CHANGELOG
VERSION
MANIFEST
src/midiutil/MidiFile.py
+src/midiutil/MidiFile3.py
src/midiutil/__init__.py
examples/single-note-example.py
documentation/Extending.txt
documentation/ClassReference.txt
src/unittests/miditest.py
+src/unittests/miditest.py3
diff --git a/PKG-INFO b/PKG-INFO
index fb9beea..3cb019d 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,8 +1,8 @@
Metadata-Version: 1.0
Name: MIDIUtil
-Version: 0.87
+Version: 0.89
Summary: MIDIUtil, a MIDI Interface for Python
-Home-page: http://www.emergentmusics.org/midiutil/
+Home-page: www.emergentmusics.org
Author: Mark Conway Wirt
Author-email: emergentmusics) at (gmail . com
License: Copyright (C) 2009, Mark Conway Wirt. See License.txt for details.
diff --git a/README.txt b/README.txt
index 3518483..2b9972a 100644
--- a/README.txt
+++ b/README.txt
@@ -25,8 +25,16 @@ is provided.
This software was originally developed with Python 2.5.2 and it makes use
of some features that were introduced in 2.5. I have used it extensively
-in Python 2.6, so it should work in this or any later versions (but I
-have not tested it on Python 3).
+in Python 2.6.
+
+Included in this version is an intitial port to Python 3 (but which should
+work in 2.6.X also). The file is called MidiFile3.py. To use it, use
+the following import line in your code:
+
+ from midiutil.MidiFile3 import MIDIFile
+
+(This assumes that the code has been installed into your system path or that
+the midiutil directory is copied into your script's working directory.)
This software is distributed under an Open Source license and you are
free to use it as you see fit, provided that attribution is maintained.
@@ -116,3 +124,15 @@ the library is provided in the documentation directory.
Have fun!
+---------
+Thank You
+---------
+
+I'd like to mention the following people who have given feedback, but
+fixes, and suggestions on the library:
+
+ Bram de Jong
+ Mike Reeves-McMillan
+ Egg Syntax
+ Nils Gey
+ Francis G.
diff --git a/VERSION b/VERSION
index c58d90b..ff59572 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-This is version 0.87.
+This is version 0.89.
diff --git a/setup.py b/setup.py
index fa505f8..ad3d380 100644
--- a/setup.py
+++ b/setup.py
@@ -1,12 +1,12 @@
from distutils.core import setup
setup(name='MIDIUtil',
- version='0.87',
+ version='0.89',
description='MIDIUtil, a MIDI Interface for Python',
author='Mark Conway Wirt',
author_email='emergentmusics) at (gmail . com',
license='Copyright (C) 2009, Mark Conway Wirt. See License.txt for details.',
- url='http://www.emergentmusics.org/midiutil/',
+ url='www.emergentmusics.org',
packages=["midiutil"],
package_dir = {'midiutil': 'src/midiutil'},
package_data={'midiutil' : ['../../documentation/*']},
diff --git a/src/midiutil/MidiFile.py b/src/midiutil/MidiFile.py
index 3a65846..d349e9b 100644
--- a/src/midiutil/MidiFile.py
+++ b/src/midiutil/MidiFile.py
@@ -16,7 +16,7 @@ import struct, sys, math
# corresponds to one beat. This number is somewhat arbitrary, but should be chosen
# to provide adequate temporal resolution.
-TICKSPERBEAT = 128
+TICKSPERBEAT = 960
controllerEventTypes = {
'pan' : 0x0a
@@ -89,7 +89,6 @@ class GenericEvent():
return False
if self.type == 'controllerEvent':
if self.parameter1 != other.parameter1 or \
- self.parameter2 != other.parameter2 or \
self.channel != other.channel or \
self.eventType != other.eventType:
return False
@@ -453,6 +452,36 @@ class MIDITrack:
'''
Write the events in MIDIEvents to the MIDI stream.
'''
+ preciseTime = 0.0 # Actual time of event, ignoring round-off
+ actualTime = 0.0 # Time as written to midi stream, include round-off
+ for event in self.MIDIEventList:
+
+ preciseTime = preciseTime + event.time
+
+ # Convert the time to variable length and back, to see how much
+ # error is introduced
+
+ testBuffer = ""
+ varTime = writeVarLength(event.time)
+ for timeByte in varTime:
+ testBuffer = testBuffer + struct.pack('>B',timeByte)
+ (roundedVal,discard) = readVarLength(0,testBuffer)
+ roundedTime = actualTime + roundedVal
+ # print "Rounded, Precise: %15.10f %15.10f" % (roundedTime, preciseTime)
+
+ # Calculate the delta between the two and apply it to the event time.
+
+ delta = preciseTime - roundedTime
+ event.time = event.time + delta
+
+ # Now update the actualTime value, using the updated event time.
+
+ testBuffer = ""
+ varTime = writeVarLength(event.time)
+ for timeByte in varTime:
+ testBuffer = testBuffer + struct.pack('>B',timeByte)
+ (roundedVal,discard) = readVarLength(0,testBuffer)
+ actualTime = actualTime + roundedVal
for event in self.MIDIEventList:
if event.type == "NoteOn":
@@ -940,7 +969,7 @@ def writeVarLength(i):
significant bit is 1, then more bytes follow. If it is zero, then the
byte in question is the last in the stream
'''
- input = int(i)
+ input = int(i+0.5)
output = [0,0,0,0]
reversed = [0,0,0,0]
count = 0
@@ -961,6 +990,27 @@ def writeVarLength(i):
reversed[3] = output[0]
return reversed[4-count:4]
+# readVarLength is taken from the MidiFile class.
+
+def readVarLength(offset, buffer):
+ '''A function to read a MIDI variable length variable.
+
+ It returns a tuple of the value read and the number of bytes processed. The
+ input is an offset into the buffer, and the buffer itself.
+ '''
+ toffset = offset
+ output = 0
+ bytesRead = 0
+ while True:
+ output = output << 7
+ byte = struct.unpack_from('>B',buffer,toffset)[0]
+ toffset = toffset + 1
+ bytesRead = bytesRead + 1
+ output = output + (byte & 127)
+ if (byte & 128) == 0:
+ break
+ return (output, bytesRead)
+
def frequencyTransform(freq):
'''Returns a three-byte transform of a frequencyTransform
'''
diff --git a/src/midiutil/MidiFile.py b/src/midiutil/MidiFile3.py
similarity index 92%
copy from src/midiutil/MidiFile.py
copy to src/midiutil/MidiFile3.py
index 3a65846..8645792 100644
--- a/src/midiutil/MidiFile.py
+++ b/src/midiutil/MidiFile3.py
@@ -16,7 +16,7 @@ import struct, sys, math
# corresponds to one beat. This number is somewhat arbitrary, but should be chosen
# to provide adequate temporal resolution.
-TICKSPERBEAT = 128
+TICKSPERBEAT = 960
controllerEventTypes = {
'pan' : 0x0a
@@ -30,6 +30,20 @@ class MIDIEvent:
self.time=0
self.ord = 0
+ def __lt__(self, other):
+ ''' Sorting function for events.'''
+ if self.time < other.time:
+ return True
+ elif self.time > other.time:
+ return False
+ else:
+ if self.ord < other.ord:
+ return True
+ elif self.ord > other.ord:
+ return False
+ else:
+ return False
+
def __cmp__(self, other):
''' Sorting function for events.'''
if self.time < other.time:
@@ -89,7 +103,6 @@ class GenericEvent():
return False
if self.type == 'controllerEvent':
if self.parameter1 != other.parameter1 or \
- self.parameter2 != other.parameter2 or \
self.channel != other.channel or \
self.eventType != other.eventType:
return False
@@ -221,9 +234,9 @@ class MIDITrack:
def __init__(self, removeDuplicates, deinterleave):
'''Initialize the MIDITrack object.
'''
- self.headerString = struct.pack('cccc','M','T','r','k')
+ self.headerString = struct.pack('cccc',b'M',b'T',b'r',b'k')
self.dataLength = 0 # Is calculated after the data is in place
- self.MIDIdata = ""
+ self.MIDIdata = b""
self.closed = False
self.eventList = []
self.MIDIEventList = []
@@ -377,13 +390,13 @@ class MIDITrack:
self.MIDIEventList.append(event)
else:
- print "Error in MIDITrack: Unknown event type"
+ print ("Error in MIDITrack: Unknown event type")
sys.exit(2)
# Assumptions in the code expect the list to be time-sorted.
# self.MIDIEventList.sort(lambda x, y: x.time - y.time)
- self.MIDIEventList.sort(lambda x, y: int( 1000 * (x.time - y.time)))
+ self.MIDIEventList.sort(key=lambda x: (x.time))
if self.deinterleave:
self.deInterleaveNotes()
@@ -403,13 +416,13 @@ class MIDITrack:
for item in self.eventList:
tempDict[item] = 1
- self.eventList = tempDict.keys()
+ self.eventList = list(tempDict.keys())
# Sort on type, them on time. Necessary because keys() has no requirement to return
# things in any order.
- self.eventList.sort(lambda x, y: cmp(x.type , y.type))
- self.eventList.sort(lambda x, y: int( 1000 * (x.time - y.time))) #A bit of a hack.
+ self.eventList.sort(key=lambda x: (x.type))
+ self.eventList.sort(key=lambda x: (x.time)) #A bit of a hack.
def closeTrack(self):
'''Called to close a track before writing
@@ -453,6 +466,36 @@ class MIDITrack:
'''
Write the events in MIDIEvents to the MIDI stream.
'''
+ preciseTime = 0.0 # Actual time of event, ignoring round-off
+ actualTime = 0.0 # Time as written to midi stream, include round-off
+ for event in self.MIDIEventList:
+
+ preciseTime = preciseTime + event.time
+
+ # Convert the time to variable length and back, to see how much
+ # error is introduced
+
+ testBuffer = bytes()
+ varTime = writeVarLength(event.time)
+ for timeByte in varTime:
+ testBuffer = testBuffer + struct.pack('>B',timeByte)
+ (roundedVal,discard) = readVarLength(0,testBuffer)
+ roundedTime = actualTime + roundedVal
+ # print "Rounded, Precise: %15.10f %15.10f" % (roundedTime, preciseTime)
+
+ # Calculate the delta between the two and apply it to the event time.
+
+ delta = preciseTime - roundedTime
+ event.time = event.time + delta
+
+ # Now update the actualTime value, using the updated event time.
+
+ testBuffer = bytes()
+ varTime = writeVarLength(event.time)
+ for timeByte in varTime:
+ testBuffer = testBuffer + struct.pack('>B',timeByte)
+ (roundedVal,discard) = readVarLength(0,testBuffer)
+ actualTime = actualTime + roundedVal
for event in self.MIDIEventList:
if event.type == "NoteOn":
@@ -500,7 +543,7 @@ class MIDITrack:
dataLenghtVar = writeVarLength(dataLength)
for i in range(0,len(dataLenghtVar)):
self.MIDIdata = self.MIDIdata + struct.pack("b",dataLenghtVar[i])
- self.MIDIdata = self.MIDIdata + event.trackName
+ self.MIDIdata = self.MIDIdata + event.trackName.encode()
elif event.type == "ControllerEvent":
code = 0xB << 4 | event.channel
varTime = writeVarLength(event.time)
@@ -561,7 +604,7 @@ class MIDITrack:
for event in self.MIDIEventList:
if event.type == 'NoteOn':
- if stack.has_key(str(event.pitch)+str(event.channel)):
+ if str(event.pitch)+str(event.channel) in stack:
stack[str(event.pitch)+str(event.channel)].append(event.time)
else:
stack[str(event.pitch)+str(event.channel)] = [event.time]
@@ -584,8 +627,8 @@ class MIDITrack:
# the internal sort works, and is in essence creating a sort on a primary
# and secondary key.
- self.MIDIEventList.sort(lambda x, y: cmp(x.type , y.type))
- self.MIDIEventList.sort(lambda x, y: int( 1000 * (x.time - y.time)))
+ self.MIDIEventList.sort(key=lambda x: (x.type))
+ self.MIDIEventList.sort(key=lambda x: (x.time))
def adjustTime(self,origin):
'''
@@ -632,7 +675,7 @@ class MIDIHeader:
def __init__(self,numTracks):
''' Initialize the data structures
'''
- self.headerString = struct.pack('cccc','M','T','h','d')
+ self.headerString = struct.pack('cccc',b'M',b'T',b'h',b'd')
self.headerSize = struct.pack('>L',6)
# Format 1 = multi-track file
self.format = struct.pack('>H',1)
@@ -940,7 +983,7 @@ def writeVarLength(i):
significant bit is 1, then more bytes follow. If it is zero, then the
byte in question is the last in the stream
'''
- input = int(i)
+ input = int(i+0.5)
output = [0,0,0,0]
reversed = [0,0,0,0]
count = 0
@@ -960,6 +1003,25 @@ def writeVarLength(i):
reversed[2] = output[1]
reversed[3] = output[0]
return reversed[4-count:4]
+
+def readVarLength(offset, buffer):
+ '''A function to read a MIDI variable length variable.
+
+ It returns a tuple of the value read and the number of bytes processed. The
+ input is an offset into the buffer, and the buffer itself.
+ '''
+ toffset = offset
+ output = 0
+ bytesRead = 0
+ while True:
+ output = output << 7
+ byte = struct.unpack_from('>B',buffer,toffset)[0]
+ toffset = toffset + 1
+ bytesRead = bytesRead + 1
+ output = output + (byte & 127)
+ if (byte & 128) == 0:
+ break
+ return (output, bytesRead)
def frequencyTransform(freq):
'''Returns a three-byte transform of a frequencyTransform
diff --git a/src/unittests/miditest.py b/src/unittests/miditest.py
index 2ccc81a..3f11643 100644
--- a/src/unittests/miditest.py
+++ b/src/unittests/miditest.py
@@ -48,11 +48,11 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[2].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[2].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].time, 256)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].time, 1920)
def testTimeShift(self):
@@ -63,7 +63,7 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
# With two tracks
MyMIDI = MIDIFile(2)
@@ -73,11 +73,11 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].type, 'NoteOn')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 960)
# Negative Time
MyMIDI = MIDIFile(1)
@@ -86,7 +86,7 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
# Negative time, two tracks
@@ -97,11 +97,11 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].type, 'NoteOn')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 960)
def testFrequency(self):
freq = frequencyTransform(8.1758)
diff --git a/src/unittests/miditest.py b/src/unittests/miditest.py3
similarity index 74%
copy from src/unittests/miditest.py
copy to src/unittests/miditest.py3
index 2ccc81a..639f81c 100644
--- a/src/unittests/miditest.py
+++ b/src/unittests/miditest.py3
@@ -19,7 +19,7 @@ import sys, struct
sys.path.append('..')
import unittest
-from midiutil.MidiFile import MIDIFile, MIDIHeader, MIDITrack, writeVarLength, \
+from midiutil.MidiFile3 import MIDIFile, MIDIHeader, MIDITrack, writeVarLength, \
frequencyTransform, returnFrequency
import sys
@@ -48,11 +48,11 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[2].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[2].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].time, 256)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[3].time, 1920)
def testTimeShift(self):
@@ -63,7 +63,7 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
# With two tracks
MyMIDI = MIDIFile(2)
@@ -73,11 +73,11 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].type, 'NoteOn')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 960)
# Negative Time
MyMIDI = MIDIFile(1)
@@ -86,7 +86,7 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
# Negative time, two tracks
@@ -97,11 +97,11 @@ class TestMIDIUtils(unittest.TestCase):
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'NoteOn')
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].time, 0)
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[0].MIDIEventList[1].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].type, 'NoteOn')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[0].time, 960)
self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].type, 'NoteOff')
- self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 128)
+ self.assertEquals(MyMIDI.tracks[1].MIDIEventList[1].time, 960)
def testFrequency(self):
freq = frequencyTransform(8.1758)
@@ -182,51 +182,52 @@ class TestMIDIUtils(unittest.TestCase):
MyMIDI.addSysEx(0,0, 0, struct.pack('>B', 0x01))
MyMIDI.close()
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'SysEx')
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[0])[0], 0x00)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[1])[0], 0xf0)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[2])[0], 3)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[3])[0], 0x00)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[4])[0], 0x01)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[5])[0], 0xf7)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[0], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[1], 0xf0)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[2], 3)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[3], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[4], 0x01)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[5], 0xf7)
def testUniversalSysEx(self):
MyMIDI = MIDIFile(1)
MyMIDI.addUniversalSysEx(0,0, 1, 2, struct.pack('>B', 0x01))
MyMIDI.close()
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'UniversalSysEx')
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[0])[0], 0x00)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[1])[0], 0xf0)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[2])[0], 6)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[3])[0], 0x7E)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[4])[0], 0x7F)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[5])[0], 0x01)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[6])[0], 0x02)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[7])[0], 0x01)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[8])[0], 0xf7)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[0], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[1], 0xf0)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[2], 6)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[3], 0x7E)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[4], 0x7F)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[5], 0x01)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[6], 0x02)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[7], 0x01)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[8], 0xf7)
def testTuning(self):
MyMIDI = MIDIFile(1)
MyMIDI.changeNoteTuning(0, [(1, 440), (2, 880)])
MyMIDI.close()
self.assertEquals(MyMIDI.tracks[0].MIDIEventList[0].type, 'UniversalSysEx')
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[0])[0], 0x00)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[1])[0], 0xf0)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[2])[0], 15)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[3])[0], 0x7E)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[4])[0], 0x7F)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[5])[0], 0x08)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[6])[0], 0x02)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[7])[0], 0x00)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[8])[0], 0x2)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[9])[0], 0x1)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[10])[0], 69)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[11])[0], 0)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[12])[0], 0)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[13])[0], 0x2)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[14])[0], 81)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[15])[0], 0)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[16])[0], 0)
- self.assertEquals(struct.unpack('>B', MyMIDI.tracks[0].MIDIdata[17])[0], 0xf7)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[0], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[1], 0xf0)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[2], 15)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[3], 0x7E)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[4], 0x7F)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[5], 0x08)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[6], 0x02)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[7], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[8], 0x2)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[9], 0x1)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[10], 69)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[11], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[12], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[13], 0x02)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[14], 81)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[15], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[16], 0x00)
+ self.assertEquals(MyMIDI.tracks[0].MIDIdata[17], 0xf7)
+
MIDISuite = unittest.TestLoader().loadTestsFromTestCase(TestMIDIUtils)
--
python-midiutil packaging
More information about the pkg-multimedia-commits
mailing list