stt/stt.py
2020-06-17 21:13:18 +02:00

164 lines
4.8 KiB
Python
Executable file

#!/usr/bin/env python3
# include standard modules
import argparse
import os
import sys
import re
import json
mydir = os.path.dirname(os.path.realpath(__file__))
def commandline():
# initiate the parser
parser = argparse.ArgumentParser(description="Awesome tool to...")
# option without argument via 'store_true'
parser.add_argument("-V", "--version", help="show program version", action="store_true")
# option with argument
parser.add_argument("--width", "-w", help="set output width")
parser.add_argument("--input", "-i", help="set input file")
# read arguments from the command line
args = parser.parse_args()
# handle arguments
# check for --version or -V
if args.version:
print("this is myprogram version 0.1")
# check for --width
if args.width:
print("set output width to %s" % args.width)
return args
def get_json(html):
result = re.search(r'<script id="state" type="application/json">(?P<json>.*?)</script', html, re.MULTILINE)
if result:
data = json.loads(result.group("json"))
else:
print("Can't find the magic")
return data
args = commandline()
with open(args.input, 'r') as content_file:
content = content_file.read()
jsondata = get_json(content)
print( "Artist: " + jsondata["meta"]["artist"] )
print( "Title: " + jsondata["meta"]["title"] )
print( "Instrument: " + jsondata["data"]["part"]["instrument"] )
print( "BPM: " + str( jsondata["data"]["part"]["measures"][0]["voices"][0]["beats"][0]["tempo"]["bpm"] ) )
# Index:
# CC1 Crash Cymbal 1 { "string": 0, "fret": 49 }
# CC2 Crash Cymbal 2 { "string": 0, "fret": 57 }
# RC Ride Cymbal { "string": 0, "fret": 51 }
# HMT Hi-Mid Tom { "string": 3, "fret": 48 }
# FT Floor Tom { "string": 3, "fret": 43 }
# LMT Low-Mid Tom { "string": 3, "fret": 47 }
# S Snare { "string": 4, "fret": 38 }
# BD Bass Drum { "string": 5, "fret": 35 }
# fH Foot Hi Hat { "string": 0, "fret": 44 }
### CC|-Crash cymbal----|
### HH|-Hi-hat----------|
### Rd|-Ride cymbal-----|
### SN|-Snare-drum------| Wikipedia notation
### T1|-High-tom--------|
### T2|-Low-tom---------|
### FT|-Floor-tom-------|
### BD |-Bass-drum------|
### Hf/FH|-Hi-hat-w/foot|
### Cr - Crash DrumBurp notation
### Hh - HiHat
### Ri - Ride
### HT - High Tom
### MT - Mid Tom
### Sn - Snare
### FT - Floor Tom
### Bd - Kick
### Hf - Foot pedal
###
###Cymbals
###
### |-x-| Strike cymbal or hi-hat
### |-X-| Strike loose hi-hat, or hit crash hard
### |-o-| Open hi-hat
### |-#-| Choke cymbal (grab cymbal with hand after striking it)
### |-s-| Splash cymbal
### |-c-| China cymbal
### |-b-| Bell of ride
### |-x-| Click hi-hat with foot
###
###Drums
###
### |-o-| Strike
### |-O-| Accent
### |-g-| Ghost note
### |-f-| Flam
### |-d-| Drag
### |-b-| Soft one-handed roll
### |-B-| Accented one-handed roll
### |-@-| Snare rim
def get_fill(tp, typelength):
if tp < typelength:
fill = "-" * int( ( typelength / tp ) - 1 )
else:
fill = ""
return fill
def get_typelength(jsondata):
typelength = 0
for i in range(len(jsondata["data"]["part"]["measures"])):
for j in range(len(jsondata["data"]["part"]["measures"][i]["voices"][0]["beats"])):
beat = jsondata["data"]["part"]["measures"][i]["voices"][0]["beats"][j]
if typelength < beat["type"]:
typelength = beat["type"]
return typelength
print("")
print( str( jsondata["data"]["part"]["measures"][5]["voices"][0]["beats"] ) )
print( "Type: " + str( jsondata["data"]["part"]["measures"][5]["voices"][0]["beats"][0]["type"] ) )
print("")
# get longest type in song
typelength = get_typelength(jsondata)
print("Typelength: " + str(typelength))
print("")
for i in range(len(jsondata["data"]["part"]["measures"][5]["voices"][0]["beats"])):
beat = jsondata["data"]["part"]["measures"][5]["voices"][0]["beats"][i]
#print( str(i+1) + " note " + str( jsondata["data"]["part"]["measures"][5]["voices"][0]["beats"][i]["notes"] ) )
#print("Beat: " + str(beat))
#print("Type: " + str(beat["type"]))
fill = get_fill(beat["type"], typelength)
#print("Notes: " + str(beat["notes"]))
for note in beat["notes"]:
if note == { "string": 0, "fret": 57 } or note == { "string": 0, "fret": 49 }:
print("Cr " + "x" + fill)
elif note == { "string": 0, "fret": 51 }:
print("Ri " + "o" + fill)
elif note == { "string": 4, "fret": 38 }:
print("Sn " + "o" + fill)
elif note == { "string": 5, "fret": 35 }:
print("Bd " + "o" + fill)
elif note == { "string": 0, "fret": 44 }:
print("fH " + "o" + fill)
elif note == {'rest': True}:
print("-" + fill)
else:
print(note)
# Sn ------------oooo
# Bd o-------o-------