Files
-
blinds / hardware_design / pcb / blinds_v60.brd
-
blinds / hardware_design / pcb / blinds_v60.sch
-
braids / hardware_design / pcb / braids_v50.brd
-
braids / hardware_design / pcb / braids_v50.sch
-
branches / hardware_design / pcb / branches_v40.brd
-
branches / hardware_design / pcb / branches_v40.sch
-
clouds / hardware_design / pcb / clouds_v30.brd
-
clouds / hardware_design / pcb / clouds_v30.sch
-
ears / hardware_design / panel / ears_panel_v30.brd
-
ears / hardware_design / panel / ears_panel_v30.sch
-
ears / hardware_design / pcb / ears_v40.brd
-
ears / hardware_design / pcb / ears_v40.sch
-
edges / hardware_design / pcb / edges_expander_v01.brd
-
edges / hardware_design / pcb / edges_expander_v01.sch
-
edges / hardware_design / pcb / edges_v20.brd
-
edges / hardware_design / pcb / edges_v20.sch
-
elements / hardware_design / pcb / elements_v02.brd
-
elements / hardware_design / pcb / elements_v02.sch
-
frames / hardware_design / pcb / frames_v03.brd
-
frames / hardware_design / pcb / frames_v03.sch
-
grids / hardware_design / pcb / grids_v02.brd
-
grids / hardware_design / pcb / grids_v02.sch
-
kinks / hardware_design / pcb / kinks_v41.brd
-
kinks / hardware_design / pcb / kinks_v41.sch
-
links / hardware_design / pcb / links_v40.brd
-
links / hardware_design / pcb / links_v40.sch
-
marbles / hardware_design / pcb / marbles_v70.brd
-
marbles / hardware_design / pcb / marbles_v70.sch
-
peaks / hardware_design / pcb / peaks_v30.brd
-
peaks / hardware_design / pcb / peaks_v30.sch
-
plaits / hardware_design / pcb / plaits_v50.brd
-
plaits / hardware_design / pcb / plaits_v50.sch
-
rings / hardware_design / pcb / rings_v30.brd
-
rings / hardware_design / pcb / rings_v30.sch
-
ripples / hardware_design / pcb / ripples_v40.brd
-
ripples / hardware_design / pcb / ripples_v40.sch
-
shades / hardware_design / pcb / shades_v30.brd
-
shades / hardware_design / pcb / shades_v30.sch
-
shelves / hardware_design / pcb / shelves_expander_v10.brd
-
shelves / hardware_design / pcb / shelves_expander_v10.sch
-
shelves / hardware_design / pcb / shelves_v05.brd
-
shelves / hardware_design / pcb / shelves_v05.sch
-
stages / hardware_design / pcb / stages_v70.brd
-
stages / hardware_design / pcb / stages_v70.sch
-
streams / hardware_design / pcb / streams_v02_bargraph.brd
-
streams / hardware_design / pcb / streams_v02_bargraph.sch
-
streams / hardware_design / pcb / streams_v05.brd
-
streams / hardware_design / pcb / streams_v05.sch
-
tides / hardware_design / pcb / tides_v40.brd
-
tides / hardware_design / pcb / tides_v40.sch
-
veils / hardware_design / pcb / veils_v40.brd
-
veils / hardware_design / pcb / veils_v40.sch
-
volts / hardware_design / pcb / volts_v01.brd
-
volts / hardware_design / pcb / volts_v01.sch
-
warps / hardware_design / pcb / warps_v30.brd
-
warps / hardware_design / pcb / warps_v30.sch
-
yarns / hardware_design / pcb / yarns_v03.brd
-
yarns / hardware_design / pcb / yarns_v03.sch
Last update 6 years 2 months
by
Olivier Gillet
Filesyarnsscale_editormusicscala | |
---|---|
.. | |
__init__.py | |
scala.py |
scala.py#!/usr/bin/python2.5 # # Copyright 2009 Olivier Gillet. # # Author: Olivier Gillet (ol.gillet@gmail.com) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # ----------------------------------------------------------------------------- # # Scala reader. """Scala reader.""" import math import re class ParseError(Exception): def __init__(self, message): self.message = message def __str__(self): return self.message def _parse_note(x): x = re.split('[ !]+', x.strip())[0] x = x.replace(',', '') # Some files use , as a decimal separator in fractions if '.' in x: return float(x) elif '/' in x: tokens = x.split('/') return 1200.0 * math.log(float(tokens[0]) / float(tokens[1])) / math.log(2) else: return 1200.0 * math.log(float(x)) / math.log(2) def parse(lines): lines = lines.split('\n') lines = [line.strip('\r ') for line in lines] lines = [line for line in lines if not line.startswith('!') and line] if not lines: raise ParseError('Empty file') comment = lines[0] lines = lines[1:] if not lines: raise ParseError('Invalid number of notes') try: num_notes = int(lines[0]) except Exception as e: raise ParseError('Incorrect number of notes: %s' % lines[0]) lines = lines[1:] if len(lines) != num_notes: raise ParseError('Declared number of notes (%d) does not match number of lines (%d)' % (num_notes, len(lines))) items = [] for line in lines: try: items.append(_parse_note(line)) except Exception as e: raise ParseError('Cannot parse: %s' % line) return items def assign_to_octave(notes): adjustments = [0.0] * 12 allocated = [False] * 12 for n in [0.0] + notes: index = int(round(n / 100.0)) shift = None for candidate_shift in [0, -1, 1, -2, 2, -3, 3, -4, 4]: position = index + candidate_shift adjustment = n - position * 100.0 if all([ position >= 0, position < 12, adjustment <= 16383/16384.0 * 100.0, adjustment >= -100.0, not allocated[position % 12]]): shift = candidate_shift break if shift != None: position = index + shift adjustments[position] = n - position * 100.0 allocated[position] = True return adjustments if __name__ == '__main__': pass