From 72ea5015f4e7d7168cca5d214c5d6dbf8a969aee Mon Sep 17 00:00:00 2001 From: cclauss Date: Tue, 23 Jan 2018 14:48:52 +0100 Subject: [PATCH] Modernize Python 2 code to get ready for Python 3 --- examples/example_1.py | 3 ++- examples/example_2.py | 3 ++- scripts/mididump.py | 5 +++-- scripts/mididumphw.py | 3 ++- scripts/midilisten.py | 5 +++-- scripts/midiplay.py | 5 +++-- setup.py | 5 ++--- src/__init__.py | 9 +++++---- src/containers.py | 6 ++++++ src/events.py | 14 ++++++++++---- src/fileio.py | 31 +++++++++++++++--------------- src/sequencer.py | 8 ++++---- src/sequencer_alsa/__init__.py | 3 ++- src/sequencer_alsa/sequencer.py | 20 +++++++++---------- src/sequencer_osx/sequencer_osx.py | 4 ++-- src/sequencer_osx/test.py | 16 +++++++++++---- src/util.py | 2 +- tests/tests.py | 14 ++++++++++---- 18 files changed, 95 insertions(+), 61 deletions(-) diff --git a/examples/example_1.py b/examples/example_1.py index 60acb87..d311ac6 100644 --- a/examples/example_1.py +++ b/examples/example_1.py @@ -1,3 +1,4 @@ +from __future__ import print_function import midi # Instantiate a MIDI Pattern (contains a list of tracks) pattern = midi.Pattern() @@ -15,6 +16,6 @@ eot = midi.EndOfTrackEvent(tick=1) track.append(eot) # Print out the pattern -print pattern +print(pattern) # Save the pattern to disk midi.write_midifile("example.mid", pattern) diff --git a/examples/example_2.py b/examples/example_2.py index ecc4a87..2306eda 100644 --- a/examples/example_2.py +++ b/examples/example_2.py @@ -1,3 +1,4 @@ +from __future__ import print_function import midi pattern = midi.read_midifile("example.mid") -print pattern +print(pattern) diff --git a/scripts/mididump.py b/scripts/mididump.py index 1497a3d..01148b6 100644 --- a/scripts/mididump.py +++ b/scripts/mididump.py @@ -2,13 +2,14 @@ """ Print a description of a MIDI file. """ +from __future__ import print_function import midi import sys if len(sys.argv) != 2: - print "Usage: {0} ".format(sys.argv[0]) + print("Usage: {0} ".format(sys.argv[0])) sys.exit(2) midifile = sys.argv[1] pattern = midi.read_midifile(midifile) -print repr(pattern) +print(repr(pattern)) diff --git a/scripts/mididumphw.py b/scripts/mididumphw.py index 42aef0b..a40cc69 100644 --- a/scripts/mididumphw.py +++ b/scripts/mididumphw.py @@ -2,8 +2,9 @@ """ Print a description of the available devices. """ +from __future__ import print_function import midi.sequencer as sequencer s = sequencer.SequencerHardware() -print s +print(s) diff --git a/scripts/midilisten.py b/scripts/midilisten.py index b86ee5c..92cf1ee 100644 --- a/scripts/midilisten.py +++ b/scripts/midilisten.py @@ -2,13 +2,14 @@ """ Attach to a MIDI device and print events to standard output. """ +from __future__ import print_function import sys import time import midi import midi.sequencer as sequencer if len(sys.argv) != 3: - print "Usage: {0} ".format(sys.argv[0]) + print("Usage: {0} ".format(sys.argv[0])) exit(2) client = sys.argv[1] @@ -21,4 +22,4 @@ while True: event = seq.event_read() if event is not None: - print event + print(event) diff --git a/scripts/midiplay.py b/scripts/midiplay.py index 3fb6121..f334ddc 100644 --- a/scripts/midiplay.py +++ b/scripts/midiplay.py @@ -2,13 +2,14 @@ """ Attach to a MIDI device and send the contents of a MIDI file to it. """ +from __future__ import print_function import sys import time import midi import midi.sequencer as sequencer if len(sys.argv) != 4: - print "Usage: {0} ".format(sys.argv[0]) + print("Usage: {0} ".format(sys.argv[0])) exit(2) client = sys.argv[1] @@ -45,4 +46,4 @@ seq.drain() time.sleep(.5) -print 'The end?' +print('The end?') diff --git a/setup.py b/setup.py index bb5b591..9e84cba 100755 --- a/setup.py +++ b/setup.py @@ -1,5 +1,6 @@ #!/usr/bin/env python +from __future__ import print_function import os from setuptools import setup, Extension import setuptools.command.install @@ -60,12 +61,10 @@ def configure_platform(): # currently, only the ALSA sequencer is supported if platform.startswith('linux'): setup_alsa(ns) - pass else: - print "No sequencer available for '%s' platform." % platform + print("No sequencer available for '%s' platform." % platform) return ns if __name__ == "__main__": setup(**configure_platform()) - diff --git a/src/__init__.py b/src/__init__.py index 0092665..6496eab 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,5 +1,6 @@ -from containers import * -from events import * +from __future__ import absolute_import +from .containers import * +from .events import * from struct import unpack, pack -from util import * -from fileio import * +from .util import * +from .fileio import * diff --git a/src/containers.py b/src/containers.py index 006dbac..61642e0 100644 --- a/src/containers.py +++ b/src/containers.py @@ -1,5 +1,11 @@ from pprint import pformat, pprint +try: + xrange # Python 2 +except NameError: + xrange = range # Python 3 + + class Pattern(list): def __init__(self, tracks=[], resolution=220, format=1, tick_relative=True): self.format = format diff --git a/src/events.py b/src/events.py index 24f41eb..cff7720 100644 --- a/src/events.py +++ b/src/events.py @@ -1,5 +1,11 @@ import math +try: + xrange # Python 2 +except NameError: + xrange = range # Python 3 + + class EventRegistry(object): Events = {} MetaEvents = {} @@ -15,7 +21,7 @@ def register_event(cls, event, bases): "Event %s already registered" % event.name cls.MetaEvents[event.metacommand] = event else: - raise ValueError, "Unknown bases class in event type: "+event.name + raise ValueError("Unknown bases class in event type: "+event.name) register_event = classmethod(register_event) @@ -138,13 +144,13 @@ class AfterTouchEvent(Event): statusmsg = 0xA0 length = 2 name = 'After Touch' - + def get_pitch(self): return self.data[0] def set_pitch(self, val): self.data[0] = val pitch = property(get_pitch, set_pitch) - + def get_value(self): return self.data[1] def set_value(self, val): @@ -226,7 +232,7 @@ def __init__(self, **kw): super(MetaEventWithText, self).__init__(**kw) if 'text' not in kw: self.text = ''.join(chr(datum) for datum in self.data) - + def __repr__(self): return self.__baserepr__(['text']) diff --git a/src/fileio.py b/src/fileio.py index c709819..507e8e7 100644 --- a/src/fileio.py +++ b/src/fileio.py @@ -1,10 +1,11 @@ +from __future__ import absolute_import from warnings import * -from containers import * -from events import * +from .containers import * +from .events import * from struct import unpack, pack -from constants import * -from util import * +from .constants import * +from .util import * class FileReader(object): def read(self, midifile): @@ -17,7 +18,7 @@ def parse_file_header(self, midifile): # First four bytes are MIDI header magic = midifile.read(4) if magic != 'MThd': - raise TypeError, "Bad header in MIDI file." + raise TypeError("Bad header in MIDI file.") # next four bytes are header size # next two bytes specify the format version # next two bytes specify the number of tracks @@ -38,7 +39,7 @@ def parse_track_header(self, midifile): # First four bytes are Track header magic = midifile.read(4) if magic != 'MTrk': - raise TypeError, "Bad track header in MIDI file: " + magic + raise TypeError("Bad track header in MIDI file: " + magic) # next four bytes are track size trksz = unpack(">L", midifile.read(4))[0] return trksz @@ -58,23 +59,23 @@ def parse_midi_event(self, trackdata): # first datum is varlen representing delta-time tick = read_varlen(trackdata) # next byte is status message - stsmsg = ord(trackdata.next()) + stsmsg = ord(next(trackdata)) # is the event a MetaEvent? if MetaEvent.is_event(stsmsg): - cmd = ord(trackdata.next()) + cmd = ord(next(trackdata)) if cmd not in EventRegistry.MetaEvents: - warn("Unknown Meta MIDI Event: " + `cmd`, Warning) + warn("Unknown Meta MIDI Event: " + repr(cmd), Warning) cls = UnknownMetaEvent else: cls = EventRegistry.MetaEvents[cmd] datalen = read_varlen(trackdata) - data = [ord(trackdata.next()) for x in range(datalen)] + data = [ord(next(trackdata)) for x in range(datalen)] return cls(tick=tick, data=data, metacommand=cmd) # is this event a Sysex Event? elif SysexEvent.is_event(stsmsg): data = [] while True: - datum = ord(trackdata.next()) + datum = ord(next(trackdata)) if datum == 0xF7: break data.append(datum) @@ -89,15 +90,15 @@ def parse_midi_event(self, trackdata): cls = EventRegistry.Events[key] channel = self.RunningStatus & 0x0F data.append(stsmsg) - data += [ord(trackdata.next()) for x in range(cls.length - 1)] + data += [ord(next(trackdata)) for x in range(cls.length - 1)] return cls(tick=tick, channel=channel, data=data) else: self.RunningStatus = stsmsg cls = EventRegistry.Events[key] channel = self.RunningStatus & 0x0F - data = [ord(trackdata.next()) for x in range(cls.length)] + data = [ord(next(trackdata)) for x in range(cls.length)] return cls(tick=tick, channel=channel, data=data) - raise Warning, "Unknown MIDI Event: " + `stsmsg` + raise Warning("Unknown MIDI Event: " + repr(stsmsg)) class FileWriter(object): def write(self, midifile, pattern): @@ -146,7 +147,7 @@ def encode_midi_event(self, event): ret += chr(event.statusmsg | event.channel) ret += str.join('', map(chr, event.data)) else: - raise ValueError, "Unknown MIDI Event: " + str(event) + raise ValueError("Unknown MIDI Event: " + str(event)) return ret def write_midifile(midifile, pattern): diff --git a/src/sequencer.py b/src/sequencer.py index c7842d1..6bcbca9 100644 --- a/src/sequencer.py +++ b/src/sequencer.py @@ -50,9 +50,9 @@ def __init__(self, stream, window): self.ttpts.append(stream.endoftrack.tick) self.ttpts = iter(self.ttpts) # Setup next tempo timepoint - self.ttp = self.ttpts.next() + self.ttp = next(self.ttpts) self.tempomap = iter(self.stream.tempomap) - self.tempo = self.tempomap.next() + self.tempo = next(self.tempomap) self.endoftrack = False def __iter__(self): @@ -67,7 +67,7 @@ def __next_edge(self): # We're past the tempo-marker. oldttp = self.ttp try: - self.ttp = self.ttpts.next() + self.ttp = next(self.ttpts) except StopIteration: # End of Track! self.window_edge = self.ttp @@ -77,7 +77,7 @@ def __next_edge(self): # account the tempo change. msused = (oldttp - lastedge) * self.tempo.mpt msleft = self.window_length - msused - self.tempo = self.tempomap.next() + self.tempo = next(self.tempomap) ticksleft = msleft / self.tempo.mpt self.window_edge = ticksleft + self.tempo.tick diff --git a/src/sequencer_alsa/__init__.py b/src/sequencer_alsa/__init__.py index f9ca70d..4fae19f 100644 --- a/src/sequencer_alsa/__init__.py +++ b/src/sequencer_alsa/__init__.py @@ -1,4 +1,5 @@ +from __future__ import absolute_import try: - from sequencer import * + from .sequencer import * except ImportError: pass diff --git a/src/sequencer_alsa/sequencer.py b/src/sequencer_alsa/sequencer.py index 9a9c3ef..b5e5e78 100644 --- a/src/sequencer_alsa/sequencer.py +++ b/src/sequencer_alsa/sequencer.py @@ -1,3 +1,4 @@ +from __future__ import print_function import select import sequencer_alsa as S import midi @@ -72,7 +73,7 @@ def get_nonblock(self): def _error(self, errcode): strerr = S.snd_strerror(errcode) msg = "ALSAError[%d]: %s" % (errcode, strerr) - raise RuntimeError, msg + raise RuntimeError(msg) def _init_handle(self): ret = S.open_client(self.alsa_sequencer_name, @@ -90,8 +91,8 @@ def _init_handle(self): def _init_port(self): err = S.snd_seq_create_simple_port(self.client, - self.alsa_port_name, - self.alsa_port_caps, + self.alsa_port_name, + self.alsa_port_caps, self.alsa_port_type) if err < 0: self._error(err) self.port = err @@ -126,13 +127,13 @@ def _new_address(self, client, port): addr.client = int(client) addr.port = int(port) return addr - + def _init_queue(self): err = S.snd_seq_alloc_named_queue(self.client, self.alsa_queue_name) if err < 0: self._error(err) self.queue = err adjtempo = int(60.0 * 1000000.0 / self.sequencer_tempo) - S.init_queue_tempo(self.client, self.queue, + S.init_queue_tempo(self.client, self.queue, adjtempo, self.sequencer_resolution) def _control_queue(self, ctype, cvalue, event=None): @@ -180,7 +181,7 @@ def stop_sequencer(self, event=None): if self._queue_running: self._control_queue(S.SND_SEQ_EVENT_STOP, 0, event) self._queue_running = False - + def drain(self): S.snd_seq_drain_output(self.client) @@ -269,9 +270,9 @@ def event_write(self, event, direct=False, relative=False, tick=False): seqev.data.control.value = event.pitch ## Unknown else: - print "Warning :: Unknown event type: %s" % event + print("Warning :: Unknown event type: %s" % event) return None - + err = S.snd_seq_event_output(self.client, seqev) if (err < 0): self._error(err) self.drain() @@ -332,7 +333,7 @@ def __len__(self): def get_port(self, key): return self._ports[key] __getitem__ = get_port - + class Port(object): def __init__(self, port, name, caps): self.port = port @@ -451,4 +452,3 @@ def subscribe_write_port(self, client, port): dest = self._new_address(client, port) subscribe = self._new_subscribe(sender, dest, read=False) self._subscribe_port(subscribe) - diff --git a/src/sequencer_osx/sequencer_osx.py b/src/sequencer_osx/sequencer_osx.py index bb8228b..b77b3d0 100644 --- a/src/sequencer_osx/sequencer_osx.py +++ b/src/sequencer_osx/sequencer_osx.py @@ -31,7 +31,7 @@ def _swig_getattr(self,class_type,name): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) - raise AttributeError,name + raise AttributeError(name) def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() @@ -40,7 +40,7 @@ def _swig_repr(self): import types try: - _object = types.ObjectType + _object = object _newclass = 1 except AttributeError: class _object : pass diff --git a/src/sequencer_osx/test.py b/src/sequencer_osx/test.py index 97873e0..2ec3bad 100644 --- a/src/sequencer_osx/test.py +++ b/src/sequencer_osx/test.py @@ -1,9 +1,17 @@ +from __future__ import print_function + import sequencer_osx -print "MIDIGetNumberOfDevices:", sequencer_osx._MIDIGetNumberOfDevices() + +print("MIDIGetNumberOfDevices:", sequencer_osx._MIDIGetNumberOfDevices()) client = sequencer_osx._MIDIClientCreate("python") endpoint = sequencer_osx._MIDISourceCreate(client, "python-source") port = sequencer_osx._MIDIOutputPortCreate(client, "python-port") sequencer_osx._MIDIPortConnectSource(port, endpoint) -print client, endpoint, endpoint -raw_input() -#sequencer_osx._MIDIClientDispose(handle) +print(client, endpoint, endpoint) + +try: + raw_input() # Python 2 +except NameError: + input() # Python 3 + +# sequencer_osx._MIDIClientDispose(handle) diff --git a/src/util.py b/src/util.py index 688730b..ee50fd5 100644 --- a/src/util.py +++ b/src/util.py @@ -3,7 +3,7 @@ def read_varlen(data): NEXTBYTE = 1 value = 0 while NEXTBYTE: - chr = ord(data.next()) + chr = ord(next(data)) # is the hi-bit set? if not (chr & 0x80): # no next BYTE diff --git a/tests/tests.py b/tests/tests.py index 2dc9b2c..9dc7090 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -9,20 +9,26 @@ except ImportError: sequencer = None +try: + xrange # Python 2 +except NameError: + xrange = range # Python 3 + + def get_sequencer_type(): if sequencer == None: return None return sequencer.Sequencer.SEQUENCER_TYPE class TestMIDI(unittest.TestCase): - def test_varlen(self): + def test_varlen(self): maxval = 0x0FFFFFFF for inval in xrange(0, maxval, maxval / 1000): datum = midi.write_varlen(inval) outval = midi.read_varlen(iter(datum)) self.assertEqual(inval, outval) - def test_mary(self): + def test_mary(self): midi.write_midifile("mary.mid", mary_test.MARY_MIDI) pattern1 = midi.read_midifile("mary.mid") midi.write_midifile("mary.mid", pattern1) @@ -47,7 +53,7 @@ def get_loop_client_port(self): assert loop != None, "Could not find Midi Through port!" loop_port = loop.get_port("Midi Through Port-0") return (loop.client, loop_port.port) - + def get_reader_sequencer(self): (client, port) = self.get_loop_client_port() seq = sequencer.SequencerRead(sequencer_resolution=self.RESOLUTION) @@ -59,7 +65,7 @@ def get_writer_sequencer(self): seq = sequencer.SequencerWrite(sequencer_resolution=self.RESOLUTION) seq.subscribe_port(client, port) return seq - + @unittest.skipIf(get_sequencer_type() != "alsa", "ALSA Sequencer not found, skipping test") @unittest.skipIf(not os.path.exists("/dev/snd/seq"), "/dev/snd/seq is not available, skipping test") def test_loopback_sequencer(self):