Updated readme
This commit is contained in:
parent
6be3351346
commit
809cd8a46d
@ -1,72 +0,0 @@
|
|||||||
import rtmidi
|
|
||||||
import time
|
|
||||||
|
|
||||||
|
|
||||||
class HostsSync:
|
|
||||||
def __init__(self):
|
|
||||||
self.host_id = None
|
|
||||||
self.available_ports = None
|
|
||||||
self.midi_out = rtmidi.MidiOut()
|
|
||||||
self.opened_ports = []
|
|
||||||
|
|
||||||
def midi_input_callback(self, event, data_pack):
|
|
||||||
message, deltatime = event
|
|
||||||
status = message[0]
|
|
||||||
host_id, midi_in = data_pack
|
|
||||||
|
|
||||||
# Check if the status byte is 0xFA (250 in decimal) or 0xFF (255 in decimal),
|
|
||||||
# which indicate MIDI Start and Stop messages respectively
|
|
||||||
if status in [250, 255]:
|
|
||||||
print(f"MIDI message received from device {host_id}: {message}")
|
|
||||||
self.host_id = host_id
|
|
||||||
self.midi_output_called(message)
|
|
||||||
|
|
||||||
def midi_output_called(self, message):
|
|
||||||
if self.host_id is None:
|
|
||||||
return
|
|
||||||
|
|
||||||
for i, port in enumerate(self.available_ports):
|
|
||||||
if i != self.host_id:
|
|
||||||
if i not in self.opened_ports:
|
|
||||||
self.midi_out.open_port(i)
|
|
||||||
self.opened_ports.append(i)
|
|
||||||
print(f"Opened MIDI output port: {self.available_ports[i]}")
|
|
||||||
|
|
||||||
self.midi_out.send_message(message)
|
|
||||||
|
|
||||||
def main(self):
|
|
||||||
midi_ins = []
|
|
||||||
self.available_ports = rtmidi.MidiIn().get_ports()
|
|
||||||
|
|
||||||
if not self.available_ports:
|
|
||||||
print("No MIDI input ports available.")
|
|
||||||
return
|
|
||||||
|
|
||||||
print("Available MIDI input ports:")
|
|
||||||
for i, port in enumerate(self.available_ports):
|
|
||||||
print(f"{i}: {port}")
|
|
||||||
|
|
||||||
try:
|
|
||||||
for i, port in enumerate(self.available_ports):
|
|
||||||
midi_in = rtmidi.MidiIn()
|
|
||||||
midi_in.open_port(i)
|
|
||||||
midi_in.set_callback(self.midi_input_callback, (i, midi_in))
|
|
||||||
midi_ins.append(midi_in)
|
|
||||||
print(f"Listening for MIDI messages on input port: {port}")
|
|
||||||
|
|
||||||
# Keep the script running to listen for MIDI messages
|
|
||||||
while True:
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print("\nExiting...")
|
|
||||||
|
|
||||||
finally:
|
|
||||||
for midi_in in midi_ins:
|
|
||||||
midi_in.close_port()
|
|
||||||
|
|
||||||
self.midi_out.close_port()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
HostsSync().main()
|
|
||||||
|
|
@ -1,13 +1,14 @@
|
|||||||
# AutoSyncHost
|
# AutoSyncHost
|
||||||
## Description
|
## Description
|
||||||
### An automatic midi host application that send midi sync commands to other MIDI devices connected via USB.
|
### An automatic midi host application that sends midi sync commands to other MIDI devices connected via USB.
|
||||||
|
|
||||||
This python scrtipt is intended to run headless on a raspbery pi but can run on any other python able device as well.
|
This python script is intended to run headless on a raspberry pi but can run on any other python able device as well.
|
||||||
|
|
||||||
The output is filtered so the host deosnt receive sync signals from the members and thus not causing midi loops.
|
The output is filtered so the host doesn´t receive sync signals from the members and thus not causing midi loops.
|
||||||
|
|
||||||
|
*Notes,CCs and other messages are not handled currently.*
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
- pull from repository with `git clone https://git.raise-uav.com/Hermes/AutoSyncHost.git`
|
- pull from repository with `git clone https://git.raise-uav.com/Hermes/AutoSyncHost.git`
|
||||||
- `pip install mido`
|
- `pip install mido`
|
||||||
- `pip install python-rtmidi`
|
- `pip install python-rtmidi`
|
||||||
|
Loading…
Reference in New Issue
Block a user