# Path: note_seq/constants.py
# DEFAULT_QUARTERS_PER_MINUTE = 120.0
# DEFAULT_STEPS_PER_BAR = 16  # 4/4 music sampled at 4 steps per quarter note.
# DEFAULT_STEPS_PER_QUARTER = 4
# DEFAULT_STEPS_PER_SECOND = 100
# STANDARD_PPQ = 220
# NUM_SPECIAL_MELODY_EVENTS = 2
# MELODY_NOTE_OFF = -1
# MELODY_NO_EVENT = -2
# MIN_MELODY_EVENT = -2
# MAX_MELODY_EVENT = 127
# MIN_MIDI_PITCH = 0  # Inclusive.
# MAX_MIDI_PITCH = 127  # Inclusive.
# NUM_MIDI_PITCHES = MAX_MIDI_PITCH - MIN_MIDI_PITCH + 1
# NOTES_PER_OCTAVE = 12
# MIN_MIDI_VELOCITY = 1  # Inclusive.
# MAX_MIDI_VELOCITY = 127  # Inclusive.
# MIN_MIDI_PROGRAM = 0
# MAX_MIDI_PROGRAM = 127
# UNPITCHED_PROGRAMS = (
#     list(range(96, 104)) + list(range(112, 120)) + list(range(120, 128)))
# NO_CHORD = 'N.C.'
# MAJOR_SCALE = [0, 2, 4, 5, 7, 9, 11]
# NOTE_KEYS = [
#     [0, 1, 3, 5, 7, 8, 10],
#     [1, 2, 4, 6, 8, 9, 11],
#     [0, 2, 3, 5, 7, 9, 10],
#     [1, 3, 4, 6, 8, 10, 11],
#     [0, 2, 4, 5, 7, 9, 11],
#     [0, 1, 3, 5, 6, 8, 10],
#     [1, 2, 4, 6, 7, 9, 11],
#     [0, 2, 3, 5, 7, 8, 10],
#     [1, 3, 4, 6, 8, 9, 11],
#     [0, 2, 4, 5, 7, 9, 10],
#     [1, 3, 5, 6, 8, 10, 11],
#     [0, 2, 4, 6, 7, 9, 11]
# ]


import fractions
import xml.etree.ElementTree as ET
import zipfile
from note_seq import constants
    key_string = keys[self.key + 7] + ' ' + self.mode
    key_string += ' (@time: ' + str(self.time_position) + ')'
    return key_string

  def __eq__(self, other):
    isequal = self.key == other.key
    isequal = isequal and (self.mode == other.mode)
    isequal = isequal and (self.time_position == other.time_position)
    return isequal


class Tempo(object):
  """Internal representation of a MusicXML tempo."""

  def __init__(self, state, xml_sound=None):
    self.xml_sound = xml_sound
    self.qpm = -1
    self.time_position = -1
    self.state = state
    if xml_sound is not None:
      self._parse()

  def _parse(self):
    """Parse the MusicXML <sound> element and retrieve the tempo.

    If no tempo is specified, default to DEFAULT_QUARTERS_PER_MINUTE
    """
    self.qpm = float(self.xml_sound.get('tempo'))
    if self.qpm == 0:
      # If tempo is 0, set it to default

# Path: note_seq/constants.py
# DEFAULT_QUARTERS_PER_MINUTE = 120.0
# DEFAULT_STEPS_PER_BAR = 16  # 4/4 music sampled at 4 steps per quarter note.
# DEFAULT_STEPS_PER_QUARTER = 4
# DEFAULT_STEPS_PER_SECOND = 100
# STANDARD_PPQ = 220
# NUM_SPECIAL_MELODY_EVENTS = 2
# MELODY_NOTE_OFF = -1
# MELODY_NO_EVENT = -2
# MIN_MELODY_EVENT = -2
# MAX_MELODY_EVENT = 127
# MIN_MIDI_PITCH = 0  # Inclusive.
# MAX_MIDI_PITCH = 127  # Inclusive.
# NUM_MIDI_PITCHES = MAX_MIDI_PITCH - MIN_MIDI_PITCH + 1
# NOTES_PER_OCTAVE = 12
# MIN_MIDI_VELOCITY = 1  # Inclusive.
# MAX_MIDI_VELOCITY = 127  # Inclusive.
# MIN_MIDI_PROGRAM = 0
# MAX_MIDI_PROGRAM = 127
# UNPITCHED_PROGRAMS = (
#     list(range(96, 104)) + list(range(112, 120)) + list(range(120, 128)))
# NO_CHORD = 'N.C.'
# MAJOR_SCALE = [0, 2, 4, 5, 7, 9, 11]
# NOTE_KEYS = [
#     [0, 1, 3, 5, 7, 8, 10],
#     [1, 2, 4, 6, 8, 9, 11],
#     [0, 2, 3, 5, 7, 9, 10],
#     [1, 3, 4, 6, 8, 10, 11],
#     [0, 2, 4, 5, 7, 9, 11],
#     [0, 1, 3, 5, 6, 8, 10],
#     [1, 2, 4, 6, 7, 9, 11],
#     [0, 2, 3, 5, 7, 8, 10],
#     [1, 3, 4, 6, 8, 9, 11],
#     [0, 2, 4, 5, 7, 9, 10],
#     [1, 3, 5, 6, 8, 10, 11],
#     [0, 2, 4, 6, 7, 9, 11]
# ]


# Path: note_seq/musicxml_parser.py
import fractions
import xml.etree.ElementTree as ET
import zipfile
from note_seq import constants

    key_string = keys[self.key + 7] + ' ' + self.mode
    key_string += ' (@time: ' + str(self.time_position) + ')'
    return key_string

  def __eq__(self, other):
    isequal = self.key == other.key
    isequal = isequal and (self.mode == other.mode)
    isequal = isequal and (self.time_position == other.time_position)
    return isequal


class Tempo(object):
  """Internal representation of a MusicXML tempo."""

  def __init__(self, state, xml_sound=None):
    self.xml_sound = xml_sound
    self.qpm = -1
    self.time_position = -1
    self.state = state
    if xml_sound is not None:
      self._parse()

  def _parse(self):
    """Parse the MusicXML <sound> element and retrieve the tempo.

    If no tempo is specified, default to DEFAULT_QUARTERS_PER_MINUTE
    """
    self.qpm = float(self.xml_sound.get('tempo'))
    if self.qpm == 0:
      # If tempo is 0, set it to default

      self.qpm = constants.DEFAULT_QUARTERS_PER_MINUTE