Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion examples/example_1.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from __future__ import print_function
import midi
# Instantiate a MIDI Pattern (contains a list of tracks)
pattern = midi.Pattern()
Expand All @@ -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)
3 changes: 2 additions & 1 deletion examples/example_2.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from __future__ import print_function
import midi
pattern = midi.read_midifile("example.mid")
print pattern
print(pattern)
5 changes: 3 additions & 2 deletions scripts/mididump.py
Original file line number Diff line number Diff line change
Expand Up @@ -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} <midifile>".format(sys.argv[0])
print("Usage: {0} <midifile>".format(sys.argv[0]))
sys.exit(2)

midifile = sys.argv[1]
pattern = midi.read_midifile(midifile)
print repr(pattern)
print(repr(pattern))
3 changes: 2 additions & 1 deletion scripts/mididumphw.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
5 changes: 3 additions & 2 deletions scripts/midilisten.py
Original file line number Diff line number Diff line change
Expand Up @@ -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} <client> <port>".format(sys.argv[0])
print("Usage: {0} <client> <port>".format(sys.argv[0]))
exit(2)

client = sys.argv[1]
Expand All @@ -21,4 +22,4 @@
while True:
event = seq.event_read()
if event is not None:
print event
print(event)
5 changes: 3 additions & 2 deletions scripts/midiplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -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} <client> <port> <file>".format(sys.argv[0])
print("Usage: {0} <client> <port> <file>".format(sys.argv[0]))
exit(2)

client = sys.argv[1]
Expand Down Expand Up @@ -45,4 +46,4 @@
seq.drain()
time.sleep(.5)

print 'The end?'
print('The end?')
5 changes: 2 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python

from __future__ import print_function
import os
from setuptools import setup, Extension
import setuptools.command.install
Expand Down Expand Up @@ -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())


9 changes: 5 additions & 4 deletions src/__init__.py
Original file line number Diff line number Diff line change
@@ -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 *
6 changes: 6 additions & 0 deletions src/containers.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
14 changes: 10 additions & 4 deletions src/events.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import math

try:
xrange # Python 2
except NameError:
xrange = range # Python 3


class EventRegistry(object):
Events = {}
MetaEvents = {}
Expand All @@ -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)


Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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'])

Expand Down
31 changes: 16 additions & 15 deletions src/fileio.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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):
Expand Down Expand Up @@ -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):
Expand Down
8 changes: 4 additions & 4 deletions src/sequencer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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
Expand All @@ -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

Expand Down
3 changes: 2 additions & 1 deletion src/sequencer_alsa/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from __future__ import absolute_import
try:
from sequencer import *
from .sequencer import *
except ImportError:
pass
20 changes: 10 additions & 10 deletions src/sequencer_alsa/sequencer.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from __future__ import print_function
import select
import sequencer_alsa as S
import midi
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)

Loading