1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
# SPDX-FileCopyrightText: 2017 Ole Martin Bjorndalen <ombdalen@gmail.com>
#
# SPDX-License-Identifier: MIT
def tick2second(tick, ticks_per_beat, tempo):
"""Convert absolute time in ticks to seconds.
Returns absolute time in seconds for a chosen MIDI file time resolution
(ticks/pulses per quarter note, also called PPQN) and tempo (microseconds
per quarter note).
"""
scale = tempo * 1e-6 / ticks_per_beat
return tick * scale
def second2tick(second, ticks_per_beat, tempo):
"""Convert absolute time in seconds to ticks.
Returns absolute time in ticks for a chosen MIDI file time resolution
(ticks/pulses per quarter note, also called PPQN) and tempo (microseconds
per quarter note). Normal rounding applies.
"""
scale = tempo * 1e-6 / ticks_per_beat
return int(round(second / scale))
def bpm2tempo(bpm, time_signature=(4, 4)):
"""Convert BPM (beats per minute) to MIDI file tempo (microseconds per
quarter note).
Depending on the chosen time signature a bar contains a different number of
beats. These beats are multiples/fractions of a quarter note, thus the
returned BPM depend on the time signature. Normal rounding applies.
"""
return int(round(60 * 1e6 / bpm * time_signature[1] / 4.))
def tempo2bpm(tempo, time_signature=(4, 4)):
"""Convert MIDI file tempo (microseconds per quarter note) to BPM (beats
per minute).
Depending on the chosen time signature a bar contains a different number of
beats. The beats are multiples/fractions of a quarter note, thus the
returned tempo depends on the time signature denominator.
"""
return 60 * 1e6 / tempo * time_signature[1] / 4.
|