Skip to content

Commit 0627f10

Browse files
author
Vance Palacio
committed
Pull variable set handler into its own function
1 parent c07a6a7 commit 0627f10

File tree

1 file changed

+174
-169
lines changed

1 file changed

+174
-169
lines changed

textbeat/player.py

Lines changed: 174 additions & 169 deletions
Original file line numberDiff line numberDiff line change
@@ -344,175 +344,10 @@ async def run(self):
344344

345345
# TODO: global 'silent' commands (doesn't consume time)
346346
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+
516351
# set marker here
517352
if (self.line[0]=='|' or self.line.startswith(':|')) and self.line[-1]==':':
518353
# allow override of markers in case of reuse
@@ -1949,3 +1784,173 @@ async def mk_prompt(self, prompt_session:PromptSession):
19491784
bufline = list(map(lambda b: b.replace(';',' '), bufline))
19501785

19511786
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

Comments
 (0)