I tried to write it in Python, but it didn't turn out too good. The actual BPM output was 1 BPM lower than what was input, and the pulses was very unstable. Here is the code for reference:
Code: Select all
#!/bin/python3
from threading import Timer
import mido
# set backend
mido.set_backend('mido.backends.rtmidi/UNIX_JACK')
# define message
msgClock = mido.Message('clock')
#msgStart = mido.Message('start')
#msgStop = mido.Message('stop')
# define port
outport = mido.open_output('output', client_name='Simple Midi Clock')
# define BPM
BPMVALUE = 133.0
def setMidiPulseRate(BPMVALUE):
MIDIPULSERATE = (60000000 / (24 * BPMVALUE)) / 1000000
return MIDIPULSERATE
def sendMidiMessage(midiMsg):
outport.send(midiMsg)
class MyInfiniteTimer():
"""
This thread sends MIDI pulses indefinately
"""
def __init__(self, rate, hfunction, message):
self.rate = rate
self.hfunction = hfunction
self.thread = Timer(self.rate, self.handle_function)
def handle_function(self):
self.hfunction(message)
self.thread = Timer(self.rate, self.handle_function)
self.thread.start()
def start(self, rate):
self.rate = rate
self.thread = Timer(self.rate, self.handle_function)
self.thread.start()
def cancel(self):
self.thread.cancel()
# run
midiPulseRate = setMidiPulseRate(BPMVALUE)
t = MyInfiniteTimer(midiPulseRate, sendMidiMessage, msgClock)
t.start(midiPulseRate)