Skip to content

Commit 19ee1dc

Browse files
author
Vance Palacio
committed
Factor out operator handling functions
A lot of this is just shuffling stuff around but it does make the code a bit more self-documenting. handleAssign could probably be factored further but we don't want this to get too out of hand..
1 parent fa52e5b commit 19ee1dc

File tree

1 file changed

+160
-135
lines changed

1 file changed

+160
-135
lines changed

textbeat/player.py

Lines changed: 160 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,6 +1788,9 @@ async def mk_prompt(self, prompt_session:PromptSession):
17881788
def handle_set_variable_commands(self):
17891789
"""Function used to parse/handle variable setting commands. E.g: Set tempo, grid"""
17901790

1791+
#--------------------------#
1792+
# Sub-function definitions #
1793+
#--------------------------#
17911794
# We define sub-functions since we don't want the entire module scope to have access to
17921795
# these. If it turns out that these are useful in a broader context, we can just rip em out
17931796
# at that point
@@ -1808,6 +1811,156 @@ def read_operands(cmd) -> tuple[str,str]:
18081811
op='='
18091812
return (val,op)
18101813

1814+
def handleDivision(var, val):
1815+
"""Use /= to modify a global variable"""
1816+
if var in 'GX': self.grid/=float(val)
1817+
elif var=='N': self.grid/=float(val) #!
1818+
elif var=='T': self.tempo/=float(val)
1819+
else: assert False
1820+
1821+
def handleMultiply(var, val):
1822+
"""Use *= to modify a global variable"""
1823+
if var in 'GX': self.grid*=float(val)
1824+
elif var=='N': self.grid*=float(val) #!
1825+
elif var=='T': self.tempo*=float(val)
1826+
else: assert False
1827+
1828+
def handleAdd(var, val):
1829+
"""Use += to modify a global variable"""
1830+
if var=='K': self.transpose += note_offset('#1' if val=='+' else val)
1831+
# elif var=='O': self.octave += int(1 if val=='+' else val)
1832+
elif var=='T': self.tempo += max(0,float(val))
1833+
elif var in 'GX': self.grid += max(0,float(val))
1834+
else: assert False
1835+
# if var=='K':
1836+
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1837+
# self.transpose = self.transpose%12
1838+
1839+
def handleSub(var, val):
1840+
"""Use -= to modify a global variable"""
1841+
if var=='K':
1842+
self.transpose -= note_offset(val)
1843+
out(note_offset(val))
1844+
# elif var=='O': self.octave -= int(1 if val=='-' else val)
1845+
elif var=='T': self.tempo -= max(0,float(val))
1846+
elif var in 'GX': self.grid -= max(0,float(val))
1847+
else: assert False
1848+
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1849+
# if var=='K':
1850+
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1851+
# self.transpose = self.transpose%12
1852+
1853+
def handleAssign(var, val):
1854+
"""Use = to modify a global variable"""
1855+
if var in 'GX': self.grid=float(val)
1856+
elif var=='R':
1857+
if not 'auto' in self.devices:
1858+
self.devices = ['auto'] + self.devices
1859+
self.set_plugins(val.split(','))
1860+
elif var=='V': self.version = val
1861+
elif var=='D':
1862+
self.devices = val.split(',')
1863+
self.refresh_devices()
1864+
# elif var=='O': self.octave = int(val)
1865+
elif var=='N': self.grid=float(val)/4.0 #!
1866+
elif var=='T':
1867+
vals = val.split('x')
1868+
self.tempo=float(vals[0])
1869+
try:
1870+
self.grid = float(vals[1])
1871+
except:
1872+
pass
1873+
elif var=='C':
1874+
vals = val.split(',')
1875+
self.columns = int(vals[0])
1876+
try:
1877+
self.column_shift = int(vals[1])
1878+
except:
1879+
pass
1880+
elif var=='P':
1881+
vals = val.split(',')
1882+
for i in range(len(vals)):
1883+
p = vals[i]
1884+
if p.strip().isdigit():
1885+
self.tracks[i].patch(int(p))
1886+
else:
1887+
self.tracks[i].patch(p)
1888+
elif var=='F': # flags
1889+
self.add_flags(val.split(','))
1890+
# for i in range(len(vals)): # TODO: ?
1891+
# self.tracks[i].add_flags(val.split(','))
1892+
# elif var=='O':
1893+
# self.octave = int(val)
1894+
elif var=='K':
1895+
self.transpose = note_offset(val)
1896+
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1897+
# self.transpose = self.transpose%12
1898+
elif var=='S':
1899+
# var R=relative usage deprecated
1900+
try:
1901+
if val:
1902+
val = val.lower()
1903+
# ambigous alts
1904+
1905+
if val.isdigit():
1906+
modescale = (self.scale.name,int(val))
1907+
else:
1908+
alts = {'major':'ionian','minor':'aeolian'}
1909+
# try:
1910+
# modescale = (alts[val[0],val[1])
1911+
# except KeyError:
1912+
# pass
1913+
val = val.lower().replace(' ','')
1914+
1915+
try:
1916+
modescale = MODES[val]
1917+
except KeyError:
1918+
raise NoSuchScale()
1919+
1920+
try:
1921+
self.scale = SCALES[modescale[0]]
1922+
self.mode = modescale[1]
1923+
inter = self.scale.intervals
1924+
self.transpose = 0
1925+
# log(self.mode-1)
1926+
1927+
if var=='R':
1928+
for i in range(self.mode-1):
1929+
inc = 0
1930+
try:
1931+
inc = int(inter[i])
1932+
except ValueError:
1933+
pass
1934+
self.transpose += inc
1935+
elif var=='S':
1936+
pass
1937+
except ValueError:
1938+
raise NoSuchScale()
1939+
# else:
1940+
# self.transpose = 0
1941+
1942+
except NoSuchScale:
1943+
out(FG.RED + 'No such scale.')
1944+
pass
1945+
else: assert False # no such var
1946+
1947+
def adjustOperands(val: str, op:str) -> tuple[str,str]:
1948+
val = op + val # append
1949+
# TODO: add numbers after dots like other ops
1950+
if val[0]=='.':
1951+
note_value(val)
1952+
ct = count_seq(val)
1953+
val = pow(0.5,count)
1954+
op = '/'
1955+
num,ct = peel_uint(val[:ct])
1956+
elif val[0]=='*':
1957+
op = '*'
1958+
val = pow(2.0,count_seq(val))
1959+
return (val,op)
1960+
1961+
#------------------------#
1962+
# Function's Entry Point #
1963+
#------------------------#
18111964
self.line = self.line[1:].strip() # remove % and spaces
18121965
for tok in self.line.split(' '):
18131966
if not tok:
@@ -1818,141 +1971,13 @@ def read_operands(cmd) -> tuple[str,str]:
18181971
if var in 'TGXNPSRCKFDR': # global vars %
18191972
cmd = tok.split(' ')[0]
18201973
(val,op) = read_operands(cmd)
1821-
if not val or op=='.':
1822-
val = op + val # append
1823-
# TODO: add numbers after dots like other ops
1824-
if val[0]=='.':
1825-
note_value(val)
1826-
ct = count_seq(val)
1827-
val = pow(0.5,count)
1828-
op = '/'
1829-
num,ct = peel_uint(val[:ct])
1830-
elif val[0]=='*':
1831-
op = '*'
1832-
val = pow(2.0,count_seq(val))
1833-
if op=='/':
1834-
if var in 'GX': self.grid/=float(val)
1835-
elif var=='N': self.grid/=float(val) #!
1836-
elif var=='T': self.tempo/=float(val)
1837-
else: assert False
1838-
elif op=='*':
1839-
if var in 'GX': self.grid*=float(val)
1840-
elif var=='N': self.grid*=float(val) #!
1841-
elif var=='T': self.tempo*=float(val)
1842-
else: assert False
1843-
elif op=='+':
1844-
if var=='K': self.transpose += note_offset('#1' if val=='+' else val)
1845-
# elif var=='O': self.octave += int(1 if val=='+' else val)
1846-
elif var=='T': self.tempo += max(0,float(val))
1847-
elif var in 'GX': self.grid += max(0,float(val))
1848-
else: assert False
1849-
# if var=='K':
1850-
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1851-
# self.transpose = self.transpose%12
1852-
elif op=='-':
1853-
if var=='K':
1854-
self.transpose -= note_offset(val)
1855-
out(note_offset(val))
1856-
# elif var=='O': self.octave -= int(1 if val=='-' else val)
1857-
elif var=='T': self.tempo -= max(0,float(val))
1858-
elif var in 'GX': self.grid -= max(0,float(val))
1859-
else: assert False
1860-
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1861-
# if var=='K':
1862-
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1863-
# self.transpose = self.transpose%12
1864-
elif op=='=':
1865-
if var in 'GX': self.grid=float(val)
1866-
elif var=='R':
1867-
if not 'auto' in self.devices:
1868-
self.devices = ['auto'] + self.devices
1869-
self.set_plugins(val.split(','))
1870-
elif var=='V': self.version = val
1871-
elif var=='D':
1872-
self.devices = val.split(',')
1873-
self.refresh_devices()
1874-
# elif var=='O': self.octave = int(val)
1875-
elif var=='N': self.grid=float(val)/4.0 #!
1876-
elif var=='T':
1877-
vals = val.split('x')
1878-
self.tempo=float(vals[0])
1879-
try:
1880-
self.grid = float(vals[1])
1881-
except:
1882-
pass
1883-
elif var=='C':
1884-
vals = val.split(',')
1885-
self.columns = int(vals[0])
1886-
try:
1887-
self.column_shift = int(vals[1])
1888-
except:
1889-
pass
1890-
elif var=='P':
1891-
vals = val.split(',')
1892-
for i in range(len(vals)):
1893-
p = vals[i]
1894-
if p.strip().isdigit():
1895-
self.tracks[i].patch(int(p))
1896-
else:
1897-
self.tracks[i].patch(p)
1898-
elif var=='F': # flags
1899-
self.add_flags(val.split(','))
1900-
# for i in range(len(vals)): # TODO: ?
1901-
# self.tracks[i].add_flags(val.split(','))
1902-
# elif var=='O':
1903-
# self.octave = int(val)
1904-
elif var=='K':
1905-
self.transpose = note_offset(val)
1906-
# self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1907-
# self.transpose = self.transpose%12
1908-
elif var=='S':
1909-
# var R=relative usage deprecated
1910-
try:
1911-
if val:
1912-
val = val.lower()
1913-
# ambigous alts
1914-
1915-
if val.isdigit():
1916-
modescale = (self.scale.name,int(val))
1917-
else:
1918-
alts = {'major':'ionian','minor':'aeolian'}
1919-
# try:
1920-
# modescale = (alts[val[0],val[1])
1921-
# except KeyError:
1922-
# pass
1923-
val = val.lower().replace(' ','')
1924-
1925-
try:
1926-
modescale = MODES[val]
1927-
except KeyError:
1928-
raise NoSuchScale()
1929-
1930-
try:
1931-
self.scale = SCALES[modescale[0]]
1932-
self.mode = modescale[1]
1933-
inter = self.scale.intervals
1934-
self.transpose = 0
1935-
# log(self.mode-1)
1936-
1937-
if var=='R':
1938-
for i in range(self.mode-1):
1939-
inc = 0
1940-
try:
1941-
inc = int(inter[i])
1942-
except ValueError:
1943-
pass
1944-
self.transpose += inc
1945-
elif var=='S':
1946-
pass
1947-
except ValueError:
1948-
raise NoSuchScale()
1949-
# else:
1950-
# self.transpose = 0
1951-
1952-
except NoSuchScale:
1953-
out(FG.RED + 'No such scale.')
1954-
pass
1955-
else: assert False # no such var
1974+
if not val or op=='.': (val,op) = adjustOperands(val,op)
1975+
1976+
if op=='/': handleDivision(var,val)
1977+
elif op=='*': handleMultiply(var,val)
1978+
elif op=='+': handleAdd(var,val)
1979+
elif op=='-': handleSub(var,val)
1980+
elif op=='=': handleAssign(var,val)
19561981
else: assert False # no such op
19571982

19581983
if var=='T':

0 commit comments

Comments
 (0)