| """Offset / silence duration calculation.""" |
|
|
| from midmid.beat_tracker import BeatData |
|
|
|
|
| def calculate_offset( |
| beat_data: BeatData, |
| bpm: float, |
| beats_per_measure: int = 4, |
| min_lead_in: float = 2.0, |
| ) -> float: |
| """Calculate silence duration to prepend to the audio.""" |
| if len(beat_data.downbeats) == 0: |
| return min_lead_in |
|
|
| first_downbeat = float(beat_data.downbeats[0]) |
| measure_duration = beats_per_measure * 60.0 / bpm |
|
|
| n = 1 |
| while n * measure_duration < min_lead_in: |
| n += 1 |
|
|
| silence = n * measure_duration - first_downbeat |
|
|
| while silence < 0: |
| n += 1 |
| silence = n * measure_duration - first_downbeat |
|
|
| return silence |
|
|