xi2

a plain text language that compiles to MIDI
git clone https://git.ce9e.org/xi2.git

commit
991f9630ede062011f26a36d5e0108ee30004a72
parent
9a3208982019ab92245d3287ba18fe3911dec265
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-09-18 15:35
style: one command per line

Diffstat

M iparser.py 9 ++++++---
M midi.py 3 ++-
M xi2.py 18 ++++++++++++------

3 files changed, 20 insertions, 10 deletions


diff --git a/iparser.py b/iparser.py

@@ -38,11 +38,13 @@ class IParser:
   38    38         self.dt_stack.append(len(seq))
   39    39         for e in seq:
   40    40             if type(e) == type(''):
   41    -1                 if e != '-': self.stop()
   -1    41                 if e != '-':
   -1    42                     self.stop()
   42    43                 self.stack.append(e)
   43    44                 self.parse_el(e)
   44    45             elif type(e) == type([]):
   45    -1                 if not '-' in e: self.stop()
   -1    46                 if '-' not in e:
   -1    47                     self.stop()
   46    48                 self.stack.append(e)
   47    49                 self.parse_set(e)
   48    50             elif type(e) == type(()):
@@ -63,7 +65,8 @@ class IParser:
   63    65         self.dt = self.dt_step()
   64    66 
   65    67     def stop(self):
   66    -1         if len(self.stack) == 0: return
   -1    68         if len(self.stack) == 0:
   -1    69             return
   67    70         e = self.stack.pop()
   68    71         if type(e) == type(''):
   69    72             if e == '-':

diff --git a/midi.py b/midi.py

@@ -32,7 +32,8 @@ class Midi:
   32    32 
   33    33     def write_variable(self, n, _rec=False):
   34    34         # b = bin(a)[2:]; eval('0b'+''.join([b[k*8:(k+1)*8][1:] for k in range(int(len(b)/8))]))
   35    -1         if n == 0 and _rec: return 0
   -1    35         if n == 0 and _rec:
   -1    36             return 0
   36    37         self.write_variable(n / 0x80, True)
   37    38         if _rec:
   38    39             self._buf += chr(n % 0x80 + 0x80)

diff --git a/xi2.py b/xi2.py

@@ -81,8 +81,10 @@ def parse(t):
   81    81 # join track parts from different sets
   82    82 tracks = dict()
   83    83 for s in ll.split('\n\n'):
   84    -1     if len(tracks) == 0: l = 0
   85    -1     else: l = max([len(t) for t in tracks])
   -1    84     if len(tracks) == 0:
   -1    85         l = 0
   -1    86     else:
   -1    87         l = max([len(t) for t in tracks])
   86    88     for track in s.split('\n'):
   87    89         try:
   88    90             (name, data) = track.split(':', 1)
@@ -93,8 +95,10 @@ for s in ll.split('\n\n'):
   93    95         if not tracks.has_key(name):
   94    96             tracks[name] = [''] * l
   95    97         tracks[name] += data
   96    -1     if len(tracks) == 0: l = 0
   97    -1     else: l = max([len(t) for t in tracks])
   -1    98     if len(tracks) == 0:
   -1    99         l = 0
   -1   100     else:
   -1   101         l = max([len(t) for t in tracks])
   98   102     for (name,data) in tracks.iteritems():
   99   103         data += [''] * (l - len(data))
  100   104 
@@ -111,8 +115,10 @@ for name, track in tracks.iteritems():
  111   115     m = Midi()
  112   116     # write meta info
  113   117     m.meta_event(0, 0x04, len(name), name)
  114    -1     try: prog = int(name)
  115    -1     except ValueError: prog = 0
   -1   118     try:
   -1   119         prog = int(name)
   -1   120     except ValueError:
   -1   121         prog = 0
  116   122     m.prog_ch(0, ch, prog)
  117   123     # write data
  118   124     ip = IParser(track, ch=ch, offset=args.offset)