Spaces:
Running on Zero
Running on Zero
Karl ELHAJAL commited on
Commit ·
62b4e67
1
Parent(s): 3e285ec
Octave-fold generated notes instead of dropping out-of-range events
Browse files- engines.py +3 -3
- midi_model.py +20 -0
engines.py
CHANGED
|
@@ -8,7 +8,7 @@ from typing import List, Dict, Any
|
|
| 8 |
|
| 9 |
from midi_model import (
|
| 10 |
count_out_of_range_events,
|
| 11 |
-
|
| 12 |
get_model,
|
| 13 |
)
|
| 14 |
|
|
@@ -182,8 +182,8 @@ class GodzillaContinuationEngine:
|
|
| 182 |
)
|
| 183 |
out_of_range = count_out_of_range_events(new_events)
|
| 184 |
if out_of_range:
|
| 185 |
-
print(f"Godzilla:
|
| 186 |
-
return
|
| 187 |
|
| 188 |
|
| 189 |
# =============================================================================
|
|
|
|
| 8 |
|
| 9 |
from midi_model import (
|
| 10 |
count_out_of_range_events,
|
| 11 |
+
fold_events_to_keyboard_range,
|
| 12 |
get_model,
|
| 13 |
)
|
| 14 |
|
|
|
|
| 182 |
)
|
| 183 |
out_of_range = count_out_of_range_events(new_events)
|
| 184 |
if out_of_range:
|
| 185 |
+
print(f"Godzilla: remapped {out_of_range} out-of-range events by octave folding")
|
| 186 |
+
return fold_events_to_keyboard_range(new_events)
|
| 187 |
|
| 188 |
|
| 189 |
# =============================================================================
|
midi_model.py
CHANGED
|
@@ -346,6 +346,26 @@ def filter_events_to_keyboard_range(events: list[dict]) -> list[dict]:
|
|
| 346 |
]
|
| 347 |
|
| 348 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 349 |
def build_prime_tokens(score_tokens: list[int], seq_len: int) -> list[int]:
|
| 350 |
prime = [705, 384, 706]
|
| 351 |
if score_tokens:
|
|
|
|
| 346 |
]
|
| 347 |
|
| 348 |
|
| 349 |
+
def fold_note_to_keyboard_range(note: int) -> int:
|
| 350 |
+
min_note, max_note = keyboard_note_range()
|
| 351 |
+
folded = int(note)
|
| 352 |
+
while folded < min_note:
|
| 353 |
+
folded += 12
|
| 354 |
+
while folded > max_note:
|
| 355 |
+
folded -= 12
|
| 356 |
+
return max(min_note, min(max_note, folded))
|
| 357 |
+
|
| 358 |
+
|
| 359 |
+
def fold_events_to_keyboard_range(events: list[dict]) -> list[dict]:
|
| 360 |
+
out: list[dict] = []
|
| 361 |
+
for event in events:
|
| 362 |
+
copied = dict(event)
|
| 363 |
+
if copied.get("type") in {"note_on", "note_off"}:
|
| 364 |
+
copied["note"] = fold_note_to_keyboard_range(int(copied.get("note", 0)))
|
| 365 |
+
out.append(copied)
|
| 366 |
+
return out
|
| 367 |
+
|
| 368 |
+
|
| 369 |
def build_prime_tokens(score_tokens: list[int], seq_len: int) -> list[int]:
|
| 370 |
prime = [705, 384, 706]
|
| 371 |
if score_tokens:
|