def __unpack_events(self, anotes, singers): """unpackする Args: anotes: 音符イベントのリスト singers: 歌手変更イベントのリスト Returns: events: イベント情報(ID#xxxxタグ以下の情報)のリスト details: イベント詳細情報(h#xxxxタグ以下の情報)のリスト """ soprano_notes = [] for i in range(0, len(anotes)): soprano_notes.append(anotes[i].note) # !!! execAutoChorus(anotes, 調, 分子, 分母)[パート] をpack !!! packed = MAutoChorus.execAutoChorus(anotes, aeks.aeks(soprano_notes), self._nn, self._dd)[self._part] + singers packed.sort(key=lambda x: int(x.start)) details = [] events = [] for p in packed: e = p.event if e['Type'] == 'Anote': e.update({'LyricHandle': 'h#%04d' % len(details)}) details.append(p.lyric_event) vibrato = p.vibrato_event if vibrato: e.update({'VibratoHandle': 'h#%04d' % len(details)}) details.append(vibrato) elif e['Type'] == 'Singer': e.update({'IconHandle': 'h#%04d' % len(details)}) details.append(p.singer_event) events.append(e) return events, details
def __init__(self, anotes, nn, dd): self._nn = nn self._dd = 2 ** dd self._anotes = copy.deepcopy(anotes) soprano_notes = [anote.note for anote in self._anotes] self._key = aeks.aeks(soprano_notes) self._lyrics = [] self._chords = [] self.__chord_and_length()
def parse(self): """ vsqxファイルを受け取ってコーラスのを返す Rets: XMLファイルの文字列 """ elem = ET.fromstring(self._vsqx) xmlns = '{http://www.yamaha.co.jp/vocaloid/schema/vsq3/}' masterTrack = elem.find(xmlns+"masterTrack") timeSig = masterTrack.find(xmlns+"timeSig") vsTrack = elem.find(xmlns + "vsTrack") musicalPart = vsTrack.find(xmlns + "musicalPart") self._nn = int(timeSig.findtext(xmlns+"nume")) self._dd = int(timeSig.findtext(xmlns+"denomi")) anotes = AnoteList() for i, note in enumerate(musicalPart.findall(xmlns+"note")): time=note.findtext(xmlns+"posTick") #相対開始時間 length=note.findtext(xmlns+"durTick") #音の長さ anote=note.findtext(xmlns+"noteNum") #音の高さ anotes.append(Anote(int(time), int(anote), length=int(length))) soprano_notes = [n.note for n in anotes] packed = MAC.execAutoChorus(anotes, aeks(soprano_notes), self._nn, self._dd)[self._part] notes = [] for p in packed: notes.append(p.note) for i, note in enumerate(musicalPart.findall(xmlns+"note")): noteNum = note.find(xmlns+"noteNum") noteNum.text = str(notes[i]) #return ET.dump(elem) return ET.tostring(elem)