From 80ed0dc4457a4850114008919e5f28296caf5681 Mon Sep 17 00:00:00 2001 From: pin Date: Fri, 5 Feb 2010 12:13:15 +0000 Subject: [PATCH] =?utf8?q?=C3=87a=20exporte=20en=20smwi=20mais,=20peu=20de?= =?utf8?q?=20chances=20que=20=C3=A7a=20marche.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@4 fe552daf-6dbe-4428-90eb-1537e0879342 --- src/songs/Song.py | 8 ++++++-- src/songs/musicxmltosong.py | 32 +++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/songs/Song.py b/src/songs/Song.py index c018eae..c1d6641 100755 --- a/src/songs/Song.py +++ b/src/songs/Song.py @@ -5,8 +5,12 @@ Created on 2 oct. 2009 ''' import pickle import os.path -from MidiToSong import MidiToSong -from mxmMidi.MidiInFile import MidiInFile +try : + from MidiToSong import MidiToSong + from mxmMidi.MidiInFile import MidiInFile +except ImportError : + # loadSongFromMidi KO dans ce cas. + pass class Song: ''' diff --git a/src/songs/musicxmltosong.py b/src/songs/musicxmltosong.py index 016593a..0db98be 100755 --- a/src/songs/musicxmltosong.py +++ b/src/songs/musicxmltosong.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ converstion d'un fichier musicxml en objet song minwii. @@ -8,6 +9,7 @@ import sys from types import StringTypes from xml.dom.minidom import parse from optparse import OptionParser +from Song import Song # Do4 <=> midi 60 OCTAVE_REF = 4 @@ -23,20 +25,22 @@ _marker = [] 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.lyric = _getNodeValue(node, 'lyric/text') + 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) : - return self._duration / self.divisions + return self._duration / self.divisions @@ -51,7 +55,7 @@ def _getNodeValue(node, path, default=_marker) : else : return default -def musicXml2Song(input, output) : +def musicXml2Song(input, output, partIndex=0) : if isinstance(input, StringTypes) : input = open(input, 'r') @@ -62,23 +66,37 @@ def musicXml2Song(input, output) : 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 + 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) - 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) + op.add_option("-i", "--part-index", dest="partIndex" + , default = 0 + , help = "Index de la partie qui contient le champ.") options, args = op.parse_args() + if len(args) != 2 : raise SystemExit(op.format_help()) -- 2.20.1