@@ -344,175 +344,10 @@ async def run(self):
344
344
345
345
# TODO: global 'silent' commands (doesn't consume time)
346
346
if self .line .startswith ('%' ):
347
- self .line = self .line [1 :].strip () # remove % and spaces
348
- for tok in self .line .split (' ' ):
349
- if not tok :
350
- break
351
- if tok [0 ]== ' ' :
352
- tok = tok [1 :]
353
- var = tok [0 ].upper ()
354
- if var in 'TGXNPSRCKFDR' : # global vars %
355
- cmd = tok .split (' ' )[0 ]
356
- op = cmd [1 ]
357
- try :
358
- val = cmd [2 :]
359
- except :
360
- val = ''
361
- # log("op val %s %s" % (op,val))
362
- if op == ':' : op = '='
363
- if not op in '*/=-+' :
364
- # implicit =
365
- val = str (op ) + str (val )
366
- op = '='
367
- if not val or op == '.' :
368
- val = op + val # append
369
- # TODO: add numbers after dots like other ops
370
- if val [0 ]== '.' :
371
- note_value (val )
372
- ct = count_seq (val )
373
- val = pow (0.5 ,count )
374
- op = '/'
375
- num ,ct = peel_uint (val [:ct ])
376
- elif val [0 ]== '*' :
377
- op = '*'
378
- val = pow (2.0 ,count_seq (val ))
379
- if op == '/' :
380
- if var in 'GX' : self .grid /= float (val )
381
- elif var == 'N' : self .grid /= float (val ) #!
382
- elif var == 'T' : self .tempo /= float (val )
383
- else : assert False
384
- elif op == '*' :
385
- if var in 'GX' : self .grid *= float (val )
386
- elif var == 'N' : self .grid *= float (val ) #!
387
- elif var == 'T' : self .tempo *= float (val )
388
- else : assert False
389
- elif op == '+' :
390
- if var == 'K' : self .transpose += note_offset ('#1' if val == '+' else val )
391
- # elif var=='O': self.octave += int(1 if val=='+' else val)
392
- elif var == 'T' : self .tempo += max (0 ,float (val ))
393
- elif var in 'GX' : self .grid += max (0 ,float (val ))
394
- else : assert False
395
- # if var=='K':
396
- # self.octave += -1*sgn(self.transpose)*(self.transpose//12)
397
- # self.transpose = self.transpose%12
398
- elif op == '-' :
399
- if var == 'K' :
400
- self .transpose -= note_offset (val )
401
- out (note_offset (val ))
402
- # elif var=='O': self.octave -= int(1 if val=='-' else val)
403
- elif var == 'T' : self .tempo -= max (0 ,float (val ))
404
- elif var in 'GX' : self .grid -= max (0 ,float (val ))
405
- else : assert False
406
- # self.octave += -1*sgn(self.transpose)*(self.transpose//12)
407
- # if var=='K':
408
- # self.octave += -1*sgn(self.transpose)*(self.transpose//12)
409
- # self.transpose = self.transpose%12
410
- elif op == '=' :
411
- if var in 'GX' : self .grid = float (val )
412
- elif var == 'R' :
413
- if not 'auto' in self .devices :
414
- self .devices = ['auto' ] + self .devices
415
- self .set_plugins (val .split (',' ))
416
- elif var == 'V' : self .version = val
417
- elif var == 'D' :
418
- self .devices = val .split (',' )
419
- self .refresh_devices ()
420
- # elif var=='O': self.octave = int(val)
421
- elif var == 'N' : self .grid = float (val )/ 4.0 #!
422
- elif var == 'T' :
423
- vals = val .split ('x' )
424
- self .tempo = float (vals [0 ])
425
- try :
426
- self .grid = float (vals [1 ])
427
- except :
428
- pass
429
- elif var == 'C' :
430
- vals = val .split (',' )
431
- self .columns = int (vals [0 ])
432
- try :
433
- self .column_shift = int (vals [1 ])
434
- except :
435
- pass
436
- elif var == 'P' :
437
- vals = val .split (',' )
438
- for i in range (len (vals )):
439
- p = vals [i ]
440
- if p .strip ().isdigit ():
441
- self .tracks [i ].patch (int (p ))
442
- else :
443
- self .tracks [i ].patch (p )
444
- elif var == 'F' : # flags
445
- self .add_flags (val .split (',' ))
446
- # for i in range(len(vals)): # TODO: ?
447
- # self.tracks[i].add_flags(val.split(','))
448
- # elif var=='O':
449
- # self.octave = int(val)
450
- elif var == 'K' :
451
- self .transpose = note_offset (val )
452
- # self.octave += -1*sgn(self.transpose)*(self.transpose//12)
453
- # self.transpose = self.transpose%12
454
- elif var == 'S' :
455
- # var R=relative usage deprecated
456
- try :
457
- if val :
458
- val = val .lower ()
459
- # ambigous alts
460
-
461
- if val .isdigit ():
462
- modescale = (self .scale .name ,int (val ))
463
- else :
464
- alts = {'major' :'ionian' ,'minor' :'aeolian' }
465
- # try:
466
- # modescale = (alts[val[0],val[1])
467
- # except KeyError:
468
- # pass
469
- val = val .lower ().replace (' ' ,'' )
470
-
471
- try :
472
- modescale = MODES [val ]
473
- except KeyError :
474
- raise NoSuchScale ()
475
-
476
- try :
477
- self .scale = SCALES [modescale [0 ]]
478
- self .mode = modescale [1 ]
479
- inter = self .scale .intervals
480
- self .transpose = 0
481
- # log(self.mode-1)
482
-
483
- if var == 'R' :
484
- for i in range (self .mode - 1 ):
485
- inc = 0
486
- try :
487
- inc = int (inter [i ])
488
- except ValueError :
489
- pass
490
- self .transpose += inc
491
- elif var == 'S' :
492
- pass
493
- except ValueError :
494
- raise NoSuchScale ()
495
- # else:
496
- # self.transpose = 0
497
-
498
- except NoSuchScale :
499
- out (FG .RED + 'No such scale.' )
500
- pass
501
- else : assert False # no such var
502
- else : assert False # no such op
503
-
504
- if var == 'T' :
505
- if self .midifile :
506
- if not self .midifile .tracks :
507
- self .midifile .tracks .append (mido .MidiTrack ())
508
- self .midifile .tracks [0 ].append (mido .MetaMessage (
509
- 'set_tempo' , tempo = mido .bpm2tempo (int (
510
- val .split ('x' )[0 ]
511
- ))
512
- ))
513
- self .row += 1
514
- continue
515
-
347
+ loop_result = self .handle_set_variable_commands ()
348
+ if loop_result == LoopResult .CONTINUE : continue
349
+ elif loop_result == LoopResult .BREAK : break
350
+
516
351
# set marker here
517
352
if (self .line [0 ]== '|' or self .line .startswith (':|' )) and self .line [- 1 ]== ':' :
518
353
# allow override of markers in case of reuse
@@ -1949,3 +1784,173 @@ async def mk_prompt(self, prompt_session:PromptSession):
1949
1784
bufline = list (map (lambda b : b .replace (';' ,' ' ), bufline ))
1950
1785
1951
1786
return bufline
1787
+
1788
+ def handle_set_variable_commands (self ):
1789
+ self .line = self .line [1 :].strip () # remove % and spaces
1790
+ for tok in self .line .split (' ' ):
1791
+ if not tok :
1792
+ return LoopResult .BREAK
1793
+ if tok [0 ]== ' ' :
1794
+ tok = tok [1 :]
1795
+ var = tok [0 ].upper ()
1796
+ if var in 'TGXNPSRCKFDR' : # global vars %
1797
+ cmd = tok .split (' ' )[0 ]
1798
+ op = cmd [1 ]
1799
+ try :
1800
+ val = cmd [2 :]
1801
+ except :
1802
+ val = ''
1803
+ # log("op val %s %s" % (op,val))
1804
+ if op == ':' : op = '='
1805
+ if not op in '*/=-+' :
1806
+ # implicit =
1807
+ val = str (op ) + str (val )
1808
+ op = '='
1809
+ if not val or op == '.' :
1810
+ val = op + val # append
1811
+ # TODO: add numbers after dots like other ops
1812
+ if val [0 ]== '.' :
1813
+ note_value (val )
1814
+ ct = count_seq (val )
1815
+ val = pow (0.5 ,count )
1816
+ op = '/'
1817
+ num ,ct = peel_uint (val [:ct ])
1818
+ elif val [0 ]== '*' :
1819
+ op = '*'
1820
+ val = pow (2.0 ,count_seq (val ))
1821
+ if op == '/' :
1822
+ if var in 'GX' : self .grid /= float (val )
1823
+ elif var == 'N' : self .grid /= float (val ) #!
1824
+ elif var == 'T' : self .tempo /= float (val )
1825
+ else : assert False
1826
+ elif op == '*' :
1827
+ if var in 'GX' : self .grid *= float (val )
1828
+ elif var == 'N' : self .grid *= float (val ) #!
1829
+ elif var == 'T' : self .tempo *= float (val )
1830
+ else : assert False
1831
+ elif op == '+' :
1832
+ if var == 'K' : self .transpose += note_offset ('#1' if val == '+' else val )
1833
+ # elif var=='O': self.octave += int(1 if val=='+' else val)
1834
+ elif var == 'T' : self .tempo += max (0 ,float (val ))
1835
+ elif var in 'GX' : self .grid += max (0 ,float (val ))
1836
+ else : assert False
1837
+ # if var=='K':
1838
+ # self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1839
+ # self.transpose = self.transpose%12
1840
+ elif op == '-' :
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
+ elif op == '=' :
1853
+ if var in 'GX' : self .grid = float (val )
1854
+ elif var == 'R' :
1855
+ if not 'auto' in self .devices :
1856
+ self .devices = ['auto' ] + self .devices
1857
+ self .set_plugins (val .split (',' ))
1858
+ elif var == 'V' : self .version = val
1859
+ elif var == 'D' :
1860
+ self .devices = val .split (',' )
1861
+ self .refresh_devices ()
1862
+ # elif var=='O': self.octave = int(val)
1863
+ elif var == 'N' : self .grid = float (val )/ 4.0 #!
1864
+ elif var == 'T' :
1865
+ vals = val .split ('x' )
1866
+ self .tempo = float (vals [0 ])
1867
+ try :
1868
+ self .grid = float (vals [1 ])
1869
+ except :
1870
+ pass
1871
+ elif var == 'C' :
1872
+ vals = val .split (',' )
1873
+ self .columns = int (vals [0 ])
1874
+ try :
1875
+ self .column_shift = int (vals [1 ])
1876
+ except :
1877
+ pass
1878
+ elif var == 'P' :
1879
+ vals = val .split (',' )
1880
+ for i in range (len (vals )):
1881
+ p = vals [i ]
1882
+ if p .strip ().isdigit ():
1883
+ self .tracks [i ].patch (int (p ))
1884
+ else :
1885
+ self .tracks [i ].patch (p )
1886
+ elif var == 'F' : # flags
1887
+ self .add_flags (val .split (',' ))
1888
+ # for i in range(len(vals)): # TODO: ?
1889
+ # self.tracks[i].add_flags(val.split(','))
1890
+ # elif var=='O':
1891
+ # self.octave = int(val)
1892
+ elif var == 'K' :
1893
+ self .transpose = note_offset (val )
1894
+ # self.octave += -1*sgn(self.transpose)*(self.transpose//12)
1895
+ # self.transpose = self.transpose%12
1896
+ elif var == 'S' :
1897
+ # var R=relative usage deprecated
1898
+ try :
1899
+ if val :
1900
+ val = val .lower ()
1901
+ # ambigous alts
1902
+
1903
+ if val .isdigit ():
1904
+ modescale = (self .scale .name ,int (val ))
1905
+ else :
1906
+ alts = {'major' :'ionian' ,'minor' :'aeolian' }
1907
+ # try:
1908
+ # modescale = (alts[val[0],val[1])
1909
+ # except KeyError:
1910
+ # pass
1911
+ val = val .lower ().replace (' ' ,'' )
1912
+
1913
+ try :
1914
+ modescale = MODES [val ]
1915
+ except KeyError :
1916
+ raise NoSuchScale ()
1917
+
1918
+ try :
1919
+ self .scale = SCALES [modescale [0 ]]
1920
+ self .mode = modescale [1 ]
1921
+ inter = self .scale .intervals
1922
+ self .transpose = 0
1923
+ # log(self.mode-1)
1924
+
1925
+ if var == 'R' :
1926
+ for i in range (self .mode - 1 ):
1927
+ inc = 0
1928
+ try :
1929
+ inc = int (inter [i ])
1930
+ except ValueError :
1931
+ pass
1932
+ self .transpose += inc
1933
+ elif var == 'S' :
1934
+ pass
1935
+ except ValueError :
1936
+ raise NoSuchScale ()
1937
+ # else:
1938
+ # self.transpose = 0
1939
+
1940
+ except NoSuchScale :
1941
+ out (FG .RED + 'No such scale.' )
1942
+ pass
1943
+ else : assert False # no such var
1944
+ else : assert False # no such op
1945
+
1946
+ if var == 'T' :
1947
+ if self .midifile :
1948
+ if not self .midifile .tracks :
1949
+ self .midifile .tracks .append (mido .MidiTrack ())
1950
+ self .midifile .tracks [0 ].append (mido .MetaMessage (
1951
+ 'set_tempo' , tempo = mido .bpm2tempo (int (
1952
+ val .split ('x' )[0 ]
1953
+ ))
1954
+ ))
1955
+ self .row += 1
1956
+ return LoopResult .CONTINUE
0 commit comments