class MusicMatrix: # 음악을 인자로 받는다. 매트릭스 틀을 잡는 코드 def __init__(self, song=None): self._previous_note = None # 음계와 쉼표 매트릭스를 따로 만든다 if song is not None: notes = np.array(song, dtype=str)[:, 0] durations = np.array(song, dtype=str)[:, 1] for i, d in enumerate(durations): durations[i] = self.float2str(durations[i]) # 음악에 쓰인 음표와 쉼표를 추출해서 매트릭스에 입력. self._markov = MarkovBuilder(np.unique(notes).tolist()) self._timings = MarkovBuilder(np.unique(durations).tolist()) for note in song: self.add(note) else: self._markov = MarkovBuilder(["a", "a#", "b", "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#"]) self._timings = MarkovBuilder([1, 2, 4, 8, 16]) # print(self._markov._value_lookup) # print(self._timings._value_lookup) #쉼표 분수로 만들기. def float2str(self, d): if float(d) >= 1: return '%d' % int(float(d)) else: return '%.2f' % float(d) def add(self, to_note): """Add a path from a note to another note. Re-adding a path between notes will increase the associated weight.""" to_note = list(to_note) to_note[1] = self.float2str(to_note[1]) if(self._previous_note is None): self._previous_note = to_note return from_note = self._previous_note self._markov.add(from_note[0], to_note[0]) self._timings.add(from_note[1], to_note[1]) self._previous_note = to_note def next_note(self, from_note): from_note = list(from_note) from_note[1] = self.float2str(from_note[1]) return [self._markov.next_value(from_note[0]), float(self._timings.next_value(from_note[1]))]
class MusicMatrix: def __init__(self): self._previous_note = None self._markov = MarkovBuilder(["a", "a#", "b", "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#"]) self._timings = MarkovBuilder([1, 2, 4, 8, 16]) def add(self, to_note): """Add a path from a note to another note. Re-adding a path between notes will increase the associated weight.""" if(self._previous_note is None): self._previous_note = to_note return from_note = self._previous_note self._markov.add(from_note[0], to_note[0]) self._timings.add(from_note[1], to_note[1]) self._previous_note = to_note def next_note(self, from_note): return [self._markov.next_value(from_note[0]), self._timings.next_value(from_note[1])]