@@ -1788,6 +1788,9 @@ async def mk_prompt(self, prompt_session:PromptSession):
1788
1788
def handle_set_variable_commands (self ):
1789
1789
"""Function used to parse/handle variable setting commands. E.g: Set tempo, grid"""
1790
1790
1791
+ #--------------------------#
1792
+ # Sub-function definitions #
1793
+ #--------------------------#
1791
1794
# We define sub-functions since we don't want the entire module scope to have access to
1792
1795
# these. If it turns out that these are useful in a broader context, we can just rip em out
1793
1796
# at that point
@@ -1808,6 +1811,156 @@ def read_operands(cmd) -> tuple[str,str]:
1808
1811
op = '='
1809
1812
return (val ,op )
1810
1813
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
+ #------------------------#
1811
1964
self .line = self .line [1 :].strip () # remove % and spaces
1812
1965
for tok in self .line .split (' ' ):
1813
1966
if not tok :
@@ -1818,141 +1971,13 @@ def read_operands(cmd) -> tuple[str,str]:
1818
1971
if var in 'TGXNPSRCKFDR' : # global vars %
1819
1972
cmd = tok .split (' ' )[0 ]
1820
1973
(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 )
1956
1981
else : assert False # no such op
1957
1982
1958
1983
if var == 'T' :
0 commit comments