xi2

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

commit
7ff3ea8c0f2c3046dde2d0fc35c101f2af5bcebf
parent
4960e95bb293eacd6aceec37e4812500d45d2cb5
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-09-19 08:43
rename parser to renderer

Diffstat

R iparser.py -> renderer.py 26 +++++++++++++-------------
M xi2.py 4 ++--

2 files changed, 15 insertions, 15 deletions


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

@@ -4,7 +4,7 @@ import midi
    4     4 # and noteOff events
    5     5 
    6     6 
    7    -1 class IParser:
   -1     7 class Renderer:
    8     8     """Convert intermediate code to MIDI bytecode."""
    9     9 
   10    10     def __init__(self, midi, seq, ch=0, offset=60):
@@ -14,7 +14,7 @@ class IParser:
   14    14         self.dt = 0
   15    15         self.dt_stack = []
   16    16         self.stack = []
   17    -1         self.parse_seq(seq)
   -1    17         self.render_seq(seq)
   18    18 
   19    19     def dt_step(self):
   20    20         a = 1.0
@@ -22,11 +22,11 @@ class IParser:
   22    22             a /= i
   23    23         return a
   24    24 
   25    -1     def parse_el(self, e):
   -1    25     def render_element(self, e):
   26    26         if e.isdigit():  # note
   27    27             self.midi.note_on(self.dt, self.ch, self.offset + int(e), 1)
   28    28             self.dt = self.dt_step()
   29    -1         elif e == '-':  # continue
   -1    29         elif e == '-':  # hold
   30    30             self.dt += self.dt_step()
   31    31         elif e == '':  # break
   32    32             self.dt += self.dt_step()
@@ -34,33 +34,33 @@ class IParser:
   34    34             self.midi.lyrics(self.dt, e.replace('_', ' '))
   35    35             self.dt = self.dt_step()
   36    36 
   37    -1     def parse_seq(self, seq):
   -1    37     def render_seq(self, seq):
   38    38         self.dt_stack.append(len(seq))
   39    39         for e in seq:
   40    40             if isinstance(e, str):
   41    41                 if e != '-':
   42    42                     self.stop()
   43    43                 self.stack.append(e)
   44    -1                 self.parse_el(e)
   -1    44                 self.render_element(e)
   45    45             elif isinstance(e, set):
   46    46                 if '-' not in e:
   47    47                     self.stop()
   48    48                 self.stack.append(e)
   49    -1                 self.parse_set(e)
   -1    49                 self.render_chord(e)
   50    50             elif isinstance(e, list):
   51    -1                 self.parse_seq(e)
   -1    51                 self.render_seq(e)
   52    52             else:
   53    53                 raise ValueError("unknown element: " + e)
   54    54         self.dt_stack.pop()
   55    55 
   56    -1     def parse_set(self, s):
   -1    56     def render_chord(self, s):
   57    57         for e in s:
   58    -1             if type(e) != type(''):
   59    -1                 raise ValueError("only elements are allowed inside sets: " + e)
   -1    58             if not isinstance(e, str):
   -1    59                 raise ValueError("only elements are allowed inside chords: " + e)
   60    60             elif e == '':
   61    61                 raise ValueError("Breaks are not allowed inside sets!")
   62    62             else:
   63    -1                 self.parse_el(e)
   -1    63                 self.render_element(e)
   64    64             self.dt = 0
   65    65         self.dt = self.dt_step()
   66    66 
@@ -94,7 +94,7 @@ class IParser:
   94    94 if __name__ == '__main__':
   95    95     a = [[['0', '1'], '2'], '4', '5', '-', '', {'0', '4', '7'}, '', '', '0', {'3', '-'}]
   96    96     t = midi.Midi()
   97    -1     ip = IParser(t, a, 0, 60)
   -1    97     ip = Renderer(t, a, 0, 60)
   98    98 
   99    99     with open('test.mid', 'wb') as fh:
  100   100         midi.write_file(fh, [t])

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

@@ -4,7 +4,7 @@ import argparse
    4     4 import re
    5     5 
    6     6 import midi
    7    -1 from iparser import IParser
   -1     7 from renderer import Renderer
    8     8 
    9     9 
   10    10 def parse(t):
@@ -120,7 +120,7 @@ if __name__ == '__main__':
  120   120             prog = 0
  121   121         m.prog_ch(0, ch, prog)
  122   122         # write data
  123    -1         IParser(m, track, ch=ch, offset=args.offset)
   -1   123         Renderer(m, track, ch=ch, offset=args.offset)
  124   124         # write
  125   125         midi_tracks.append(m)
  126   126         ch += 1