diff --git a/place.py b/place.py index 860da90..8870e7d 100644 --- a/place.py +++ b/place.py @@ -12,7 +12,8 @@ def beatify(bpm:float, offset:int, time:timedelta) -> float: def debeatify(bpm:float, offset:int, beat:int) -> timedelta: return timedelta(milliseconds=(beat*60000/bpm) + offset) -def f(intensity): return np.pi/2 - np.arctan(2*intensity - 5) +#def f(intensity): return np.pi/2 - np.arctan(2*intensity) + np.pi/5 +def f(intensity): return np.pi/2 def greedy(bpm:int, offset:int, timings:list, amplitudes:list): """ @@ -20,15 +21,20 @@ def greedy(bpm:int, offset:int, timings:list, amplitudes:list): output: list of object type / position """ flow = 1 - notes = [sl.HitObject(0, timedelta(milliseconds=0), 0)] * len(timings) + notes = [sl.HitObject(sl.Position(260, 188), timedelta(milliseconds=0), 0)] * len(timings) beats = [beatify(bpm, offset, timing) for timing in timings] + last_position = (260, 188) + max_x, max_y, min_x, min_y = -np.inf, -np.inf, np.inf, np.inf for (delta, note_beat, intensity, i) in zip(timings, beats, amplitudes, range(len(timings))): try: + print(notes[i-1].position.x) duration = note_beat - beats[i + 1] + """ if duration in (QUARTER, HALF): notes[i] = sl.Circle(sl.Position(0, 0), delta, 0) notes[i] = sl.Circle(sl.Position(0, 0), delta, 0) """ + """ elif duration % 2 == 0: rhythms.insert(0, f"slider {duration}") else: @@ -37,17 +43,36 @@ def greedy(bpm:int, offset:int, timings:list, amplitudes:list): except IndexError: notes[i] = sl.Circle(sl.Position(0, 0), delta, 0) # TODO mettre à jour flow - """ + if len(notes) > 2: - angle = flow * f(rhythm.intensite) - x1, y1 = notes[i-2].position - x2, y2 = notes[i-1].position - old_angle = np.arctan2((y1, y2), (x1, x2)) - x3 = x2 + (intensity * np.cos(angle + old_angle)) - y3 = y2 + (intensity * np.sin(angle + old_angle)) + if duration == QUARTER: + x2, y2 = int(notes[i-1].position.x), int(notes[i-1].position.y) + notes[i] = sl.Circle(sl.Position(x2, y2), delta, 0) + + else: + angle = flow * f(intensity/100) + x1, y1 = int(notes[i-2].position.x), int(notes[i-2].position.y) + x2, y2 = int(notes[i-1].position.x), int(notes[i-1].position.y) + old_angle = np.arctan2([y2-y1], [x2-x1]) + x3 = x2 + (duration*intensity * np.cos(angle + old_angle)) + y3 = y2 + (duration*intensity * np.sin(angle + old_angle)) + notes[i] = sl.Circle(sl.Position(int(x3[0]), int(y3[0])), delta, 0) else: - pass - """ + notes[i] = sl.Circle(sl.Position(260, 188), delta, 0) + if notes[i].position.x > max_x: + max_x = notes[i].position.x + elif notes[i].position.x < min_x: + min_x = notes[i].position.x + if notes[i].position.y > max_y: + max_y = notes[i].position.y + elif notes[i].position.y < min_y: + min_y = notes[i].position.y + factor_x = 1/(max_x - min_x) + factor_y = 1/(max_y - min_y) + for note in notes: + note.position = sl.Position((note.position.x-min_x)*factor_x*512, (note.position.y-min_y)*factor_y*384) + print(note.position.x, note.position.y) + return notes