Karl ELHAJAL commited on
Commit
62b4e67
·
1 Parent(s): 3e285ec

Octave-fold generated notes instead of dropping out-of-range events

Browse files
Files changed (2) hide show
  1. engines.py +3 -3
  2. 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
- filter_events_to_keyboard_range,
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: dropped {out_of_range} out-of-range events")
186
- return filter_events_to_keyboard_range(new_events)
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: