From a66a76adf2e817c69ad27f6568b5bad2929489e3 Mon Sep 17 00:00:00 2001 From: pin Date: Wed, 3 Mar 2010 11:47:16 +0000 Subject: [PATCH] =?utf8?q?Cr=C3=A9ation=20d'une=20classe=20Tone=20dont=20h?= =?utf8?q?=C3=A9rite=20Note.?= 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@61 fe552daf-6dbe-4428-90eb-1537e0879342 --- src/songs/musicxmltosong.py | 114 ++++++++++++++++++++++++++++-------- 1 file changed, 88 insertions(+), 26 deletions(-) diff --git a/src/songs/musicxmltosong.py b/src/songs/musicxmltosong.py index 7f5c8bb..7eedf53 100755 --- a/src/songs/musicxmltosong.py +++ b/src/songs/musicxmltosong.py @@ -22,6 +22,20 @@ DIATO_SCALE = {'C' : 60, 'A' : 69, 'B' : 71} +CHROM_SCALE = { 0 : ('C', 0), + 1 : ('C', 1), + 2 : ('D', 0), + 3 : ('E', -1), + 4 : ('E', 0), + 5 : ('F', 0), + 6 : ('F', 1), + 7 : ('G', 0), + 8 : ('G', 1), + 9 : ('A', 0), + 10 : ('B', -1), + 11 : ('B', 0)} + + FR_NOTES = {'C' : u'Do', 'D' : u'Ré', 'E' : u'Mi', @@ -176,9 +190,56 @@ class Barline(object) : return '|' __repr__ = __str__ + + +class Tone(object) : + + @staticmethod + def midi_to_step_alter_octave(midi): + stepIndex = midi % 12 + step, alter = CHROM_SCALE[stepIndex] + octave = midi / 12 - 1 + return step, alter, octave + + + def __init__(self, *args) : + if len(args) == 3 : + self.step, self.alter, self.octave = args + elif len(args) == 1 : + midi = args[0] + self.step, self.alter, self.octave = Tone.midi_to_step_alter_octave(midi) + + @property + def midi(self) : + mid = DIATO_SCALE[self.step] + mid = mid + (self.octave - OCTAVE_REF) * 12 + mid = mid + self.alter + return mid + + + @property + def name(self) : + name = '%s%d' % (self.step, self.octave) + if self.alter < 0 : + alterext = 'b' + else : + alterext = '#' + name = '%s%s' % (name, abs(self.alter) * alterext) + return name + + @property + def nom(self) : + name = FR_NOTES[self.step] + if self.alter < 0 : + alterext = 'b' + else : + alterext = '#' + name = '%s%s' % (name, abs(self.alter) * alterext) + return name + -class Note(object) : +class Note(Tone) : scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72] def __init__(self, node, divisions, previous) : @@ -212,36 +273,36 @@ class Note(object) : self._duration = self.duration + note.duration self.divisions = 1 - @property - def midi(self) : - mid = DIATO_SCALE[self.step] - mid = mid + (self.octave - OCTAVE_REF) * 12 - mid = mid + self.alter - return mid +# @property +# def midi(self) : +# mid = DIATO_SCALE[self.step] +# mid = mid + (self.octave - OCTAVE_REF) * 12 +# mid = mid + self.alter +# return mid @property def duration(self) : return self._duration / self.divisions - @property - def name(self) : - name = '%s%d' % (self.step, self.octave) - if self.alter < 0 : - alterext = 'b' - else : - alterext = '#' - name = '%s%s' % (name, abs(self.alter) * alterext) - return name - - @property - def nom(self) : - name = FR_NOTES[self.step] - if self.alter < 0 : - alterext = 'b' - else : - alterext = '#' - name = '%s%s' % (name, abs(self.alter) * alterext) - return name +# @property +# def name(self) : +# name = '%s%d' % (self.step, self.octave) +# if self.alter < 0 : +# alterext = 'b' +# else : +# alterext = '#' +# name = '%s%s' % (name, abs(self.alter) * alterext) +# return name +# +# @property +# def nom(self) : +# name = FR_NOTES[self.step] +# if self.alter < 0 : +# alterext = 'b' +# else : +# alterext = '#' +# name = '%s%s' % (name, abs(self.alter) * alterext) +# return name @property def column(self): @@ -303,6 +364,7 @@ def musicXml2Song(input, partIndex=0, printNotes=False) : part.pprint() return part + def main() : -- 2.20.1