1
Fork 0
AddMarkersFromJSON/MMaker_RPPJSON.py

48 lines
1.8 KiB
Python
Raw Permalink Normal View History

2021-04-13 22:21:09 -04:00
import json, sys, rpp
2021-09-19 01:25:58 -04:00
def getSecondsFromPPQ(tempo, ppq, offset):
microseconds_per_tick = (60000 / tempo * 1000) / ppq
seconds_per_tick = microseconds_per_tick / 1000000
seconds = offset * seconds_per_tick
return seconds
2021-04-13 22:21:09 -04:00
try:
with open(sys.argv[1], "rb") as f:
data = f.read().decode("utf-8")
r = rpp.loads(data)
2021-09-19 01:25:58 -04:00
tempo = float(next(r.iterfind(".//TEMPO"))[1])
2021-04-13 22:21:09 -04:00
trackList = {}
for item in r.iterfind(".//TRACK"):
trackName = item.find(".//NAME")[1]
if (trackName.startswith("!")):
if not trackName in trackList:
trackList[trackName] = []
for pos in item.iterfind(".//POSITION"):
itemType = item.find(".//SOURCE").attrib
itemPos = float(pos[1])
2021-09-19 01:25:58 -04:00
if (itemType[0] == "MIDI"):
ppq = 960
tick_offset = 0
for midiData in item.find(".//SOURCE").children:
if midiData[0] == 'HASDATA':
ppq = int(midiData[2])
if midiData[0] in ['e', 'E']:
if midiData[2].startswith('9') and midiData[4] != '00':
trackList[trackName].append(getSecondsFromPPQ(tempo, ppq, int(midiData[1]) + tick_offset) + itemPos)
tick_offset += int(midiData[1])
else:
2021-04-13 22:21:09 -04:00
trackList[trackName].append(itemPos)
if (len(sys.argv) > 2):
with open(sys.argv[2], "w") as out:
json.dump(trackList, out)
print("File saved to " + sys.argv[2])
else:
print(json.dumps(trackList))
except Exception as e:
print(e)