'''\r
import pickle\r
import os.path\r
'''\r
import pickle\r
import os.path\r
-from MidiToSong import MidiToSong\r
-from mxmMidi.MidiInFile import MidiInFile\r
+try :\r
+ from MidiToSong import MidiToSong\r
+ from mxmMidi.MidiInFile import MidiInFile\r
+except ImportError :\r
+ # loadSongFromMidi KO dans ce cas.\r
+ pass\r
"""
converstion d'un fichier musicxml en objet song minwii.
"""
converstion d'un fichier musicxml en objet song minwii.
from types import StringTypes
from xml.dom.minidom import parse
from optparse import OptionParser
from types import StringTypes
from xml.dom.minidom import parse
from optparse import OptionParser
# Do4 <=> midi 60
OCTAVE_REF = 4
# Do4 <=> midi 60
OCTAVE_REF = 4
class Note(object) :
def __init__(self, node, divisions) :
class Note(object) :
def __init__(self, node, divisions) :
- self.name = _getNodeValue(node, 'pitch/step')
+ self.step = _getNodeValue(node, 'pitch/step')
self.octave = int(_getNodeValue(node, 'pitch/octave'))
self._duration = float(_getNodeValue(node, 'duration'))
self.octave = int(_getNodeValue(node, 'pitch/octave'))
self._duration = float(_getNodeValue(node, 'duration'))
+ self.lyric = _getNodeValue(node, 'lyric/text')
+
self.divisions = divisions
@property
def midi(self) :
self.divisions = divisions
@property
def midi(self) :
- mid = DIATO_SCALE[self.name]
+ mid = DIATO_SCALE[self.step]
mid = mid + (self.octave - OCTAVE_REF) * 12
return mid
@property
def duration(self) :
mid = mid + (self.octave - OCTAVE_REF) * 12
return mid
@property
def duration(self) :
- return self._duration / self.divisions
+ return self._duration / self.divisions
-def musicXml2Song(input, output) :
+def musicXml2Song(input, output, partIndex=0) :
if isinstance(input, StringTypes) :
input = open(input, 'r')
if isinstance(input, StringTypes) :
input = open(input, 'r')
assert doc.nodeName == u'score-partwise'
parts = doc.getElementsByTagName('part')
assert doc.nodeName == u'score-partwise'
parts = doc.getElementsByTagName('part')
- # on suppose que la première partie est le chant
- leadPart = parts[0]
+ leadPart = parts[partIndex]
# divisions de la noire
divisions = 0
# divisions de la noire
divisions = 0
+ midiNotes, durations, lyrics = [], [], []
+
for measureNode in leadPart.getElementsByTagName('measure') :
divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
for noteNode in measureNode.getElementsByTagName('note') :
note = Note(noteNode, divisions)
for measureNode in leadPart.getElementsByTagName('measure') :
divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
for noteNode in measureNode.getElementsByTagName('note') :
note = Note(noteNode, divisions)
- print note.name, note.octave, note.midi, note.duration
+ midiNotes.append(note.midi)
+ durations.append(note.duration)
+ lyrics.append(note.lyric)
+
+ song = Song(None,
+ midiNoteNumbers = midiNotes,
+ noteLengths = durations,
+ lyrics = lyrics,
+ notesInExtendedScale=None)
+ song.save(output)
def main() :
usage = "%prog musicXmlFile.xml outputSongFile.smwi [options]"
op = OptionParser(usage)
def main() :
usage = "%prog musicXmlFile.xml outputSongFile.smwi [options]"
op = OptionParser(usage)
+ op.add_option("-i", "--part-index", dest="partIndex"
+ , default = 0
+ , help = "Index de la partie qui contient le champ.")
options, args = op.parse_args()
options, args = op.parse_args()
if len(args) != 2 :
raise SystemExit(op.format_help())
if len(args) != 2 :
raise SystemExit(op.format_help())