def _to_logical_measure_number( self, component, logical_measure_number_start_offsets, ): from abjad.tools import mathtools from abjad.tools import sequencetools from abjad.tools.topleveltools import inspect_ inspector = inspect_(component) component_start_offset = inspector.get_timespan().start_offset logical_measure_number_start_offsets = \ logical_measure_number_start_offsets[:] logical_measure_number_start_offsets.append(mathtools.Infinity()) pairs = sequencetools.iterate_sequence_nwise( logical_measure_number_start_offsets, n=2, ) for logical_measure_index, pair in enumerate(pairs): if pair[0] <= component_start_offset < pair[-1]: logical_measure_number = logical_measure_index + 1 return logical_measure_number message = 'can not find logical measure number: {!r}, {!r}.' message = message.format( component, logical_measure_number_start_offsets, ) raise ValueError(message)
def __init__( self, operator_string='<', duration=mathtools.Infinity(), ): Inequality.__init__( self, operator_string=operator_string, ) infinities = ( mathtools.Infinity(), mathtools.NegativeInfinity(), ) if duration not in infinities: duration = durationtools.Duration(duration) assert 0 <= duration self._duration = duration
def __init__( self, operator_string='<', length=mathtools.Infinity(), ): Inequality.__init__( self, operator_string=operator_string, ) assert 0 <= length infinities = ( mathtools.Infinity(), mathtools.NegativeInfinity(), ) if length not in infinities: length = int(length) self._length = length
def __init__( self, cyclic=True, counts=None, secondary_division_maker=None, ): from experimental import makertools assert isinstance(cyclic, bool), repr(cyclic) self._cyclic = cyclic counts = counts or () if (counts == mathtools.Infinity or counts == mathtools.Infinity()): self._counts = counts else: assert mathtools.all_are_positive_integers(counts) self._counts = counts if secondary_division_maker is not None: prototype = (makertools.SplitByDurationsDivisionCallback, ) assert isinstance(secondary_division_maker, prototype) self._secondary_division_maker = secondary_division_maker
from abjad.tools import systemtools from abjad.tools import datastructuretools #from abjad.tools import mathtools # load constants into __builtins__ namespace if six.PY3: import builtins else: import __builtin__ as builtins builtins.Less = datastructuretools.OrdinalConstant('value', -1, 'Less') builtins.More = datastructuretools.OrdinalConstant('value', 1, 'More') builtins.Exact = datastructuretools.OrdinalConstant('value', 0, 'Exact') builtins.Left = datastructuretools.OrdinalConstant('x', -1, 'Left') builtins.Right = datastructuretools.OrdinalConstant('x', 1, 'Right') builtins.Center = datastructuretools.OrdinalConstant('y', 0, 'Center') builtins.Up = datastructuretools.OrdinalConstant('y', 1, 'Up') builtins.Down = datastructuretools.OrdinalConstant('y', -1, 'Down') from abjad.tools import mathtools builtins.Infinity = mathtools.Infinity() builtins.NegativeInfinity = mathtools.NegativeInfinity() del (builtins) del (six) systemtools.ImportManager.import_structured_package( __path__[0], globals(), delete_systemtools=False, ignored_names=['abjadbooktools'], )
def __call__(self, divisions=None): r'''Calls fuse-by-counts division callback. .. container:: example **Example 1.** Returns divisions unfused: :: >>> division_maker = makertools.DivisionMaker() >>> division_maker = division_maker.fuse_by_counts() :: >>> input_divisions = [(2, 8), (2, 8), (4, 8), (4, 8), (2, 4)] >>> divisions = division_maker(input_divisions) >>> divisions [Division(2, 8), Division(2, 8), Division(4, 8), Division(4, 8), Division(2, 4)] :: >>> rhythm_maker = rhythmmakertools.NoteRhythmMaker() >>> music = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... time_signatures=input_divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 2/8 c'4 } { c'4 } { \time 4/8 c'2 } { c'2 } { \time 2/4 c'2 } } .. container:: example **Example 2.** Fuses divisions two at a time: :: >>> division_maker = makertools.DivisionMaker() >>> division_maker = division_maker.fuse_by_counts( ... counts=[2], ... ) :: >>> input_divisions = [(2, 8), (2, 8), (4, 8), (4, 8), (2, 4)] >>> divisions = division_maker(input_divisions) >>> divisions [Division(4, 8), Division(8, 8), Division(2, 4)] :: >>> rhythm_maker = rhythmmakertools.NoteRhythmMaker() >>> music = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... time_signatures=input_divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { c'2 c'1 c'2 } .. container:: example **Example 3a.** Fuses divisions two at a time. Then splits fused divisions by ``3/16`` durations. Remainders to the right: :: >>> division_maker = makertools.DivisionMaker() >>> division_maker = division_maker.fuse_by_counts( ... counts=[2], ... ) >>> division_maker = division_maker.split_by_durations( ... durations=[Duration(3, 16)], ... remainder=Right, ... ) :: >>> input_divisions = [(2, 8), (2, 8), (4, 8), (4, 8), (2, 4)] >>> division_lists = division_maker(input_divisions) >>> for division_list in division_lists: ... division_list [Division(3, 16), Division(3, 16), Division(1, 8)] [Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(1, 16)] [Division(3, 16), Division(3, 16), Division(1, 8)] :: >>> rhythm_maker = rhythmmakertools.NoteRhythmMaker() >>> divisions = sequencetools.flatten_sequence(division_lists) >>> music = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... time_signatures=input_divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { c'8. c'8. c'8 c'8. c'8. c'8. c'8. c'8. c'16 c'8. c'8. c'8 } **Example 3b.** Remainders to the left: :: >>> division_maker = makertools.DivisionMaker() >>> division_maker = division_maker.fuse_by_counts( ... counts=[2], ... ) >>> division_maker = division_maker.split_by_durations( ... durations=[Duration(3, 16)], ... remainder=Left, ... ) :: >>> input_divisions = [(2, 8), (2, 8), (4, 8), (4, 8), (2, 4)] >>> division_lists = division_maker(input_divisions) >>> for division_list in division_lists: ... division_list [Division(1, 8), Division(3, 16), Division(3, 16)] [Division(1, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16)] [Division(1, 8), Division(3, 16), Division(3, 16)] :: >>> rhythm_maker = rhythmmakertools.NoteRhythmMaker() >>> divisions = sequencetools.flatten_sequence(division_lists) >>> music = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... time_signatures=input_divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { c'8 c'8. c'8. c'16 c'8. c'8. c'8. c'8. c'8. c'8 c'8. c'8. } .. container:: example **Example 4.** Fuses all divisions: :: >>> division_maker = makertools.DivisionMaker() >>> division_maker = division_maker.fuse_by_counts( ... counts=mathtools.Infinity, ... ) :: >>> input_divisions = [(2, 8), (2, 8), (4, 8), (4, 8), (2, 4)] >>> divisions = division_maker(input_divisions) >>> divisions [Division(16, 8)] :: >>> rhythm_maker = rhythmmakertools.NoteRhythmMaker() >>> music = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... time_signatures=input_divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { c'\breve } .. container:: example **Example 5a.** Fuses all divisions. Then splits fused divisions by ``3/8`` durations: Remainder at right: :: >>> division_maker = makertools.DivisionMaker() >>> division_maker = division_maker.fuse_by_counts( ... counts=mathtools.Infinity, ... ) >>> division_maker = division_maker.split_by_durations( ... durations=[Duration(3, 16)], ... remainder=Right, ... ) :: >>> input_divisions = [(2, 8), (2, 8), (4, 8), (4, 8), (2, 4)] >>> division_lists = division_maker(input_divisions) >>> for division_list in division_lists: ... division_list [Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(1, 8)] :: >>> rhythm_maker = rhythmmakertools.NoteRhythmMaker() >>> divisions = sequencetools.flatten_sequence(division_lists) >>> music = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... time_signatures=input_divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { c'8. c'8. c'8. c'8. c'8. c'8. c'8. c'8. c'8. c'8. c'8 } **Example 5b.** Remainder at left: :: >>> division_maker = makertools.DivisionMaker() >>> division_maker = division_maker.fuse_by_counts( ... counts=mathtools.Infinity, ... ) >>> division_maker = division_maker.split_by_durations( ... durations=[Duration(3, 16)], ... remainder=Left, ... ) :: >>> input_divisions = [(2, 8), (2, 8), (4, 8), (4, 8), (2, 4)] >>> division_lists = division_maker(input_divisions) >>> for division_list in division_lists: ... division_list [Division(1, 8), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16), Division(3, 16)] :: >>> rhythm_maker = rhythmmakertools.NoteRhythmMaker() >>> divisions = sequencetools.flatten_sequence(division_lists) >>> music = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... time_signatures=input_divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { c'8 c'8. c'8. c'8. c'8. c'8. c'8. c'8. c'8. c'8. c'8. } .. container:: example **Example 6.** Empty input: :: >>> input_divisions = [] >>> division_lists = division_maker(input_divisions) >>> for division_list in division_lists: ... division_list Returns list of division lists. ''' divisions = divisions or () divisions = self._coerce_divisions(divisions) if not divisions: pass elif (self.counts == mathtools.Infinity or self.counts == mathtools.Infinity()): divisions = [sum(divisions)] elif self.counts: parts = sequencetools.partition_sequence_by_counts( divisions, self.counts, cyclic=self.cyclic, overhang=True, ) divisions = [sum(_) for _ in parts] divisions = [durationtools.Division(_) for _ in divisions] if self.secondary_division_maker is None: return divisions division_lists = [] for division in divisions: if self.secondary_division_maker is not None: division_list = self.secondary_division_maker([division])[0] else: division_list = [division] division_list = [durationtools.Division(_) for _ in division_list] division_lists.append(division_list) return division_lists
# -*- encoding: utf-8 -*- from abjad.tools import systemtools from abjad.tools import datastructuretools from abjad.tools import mathtools # load constants into __builtins__ namespace __builtins__['Less'] = datastructuretools.OrdinalConstant('value', -1, 'Less') __builtins__['More'] = datastructuretools.OrdinalConstant('value', 1, 'More') __builtins__['Exact'] = datastructuretools.OrdinalConstant( 'value', 0, 'Exact') __builtins__['Left'] = datastructuretools.OrdinalConstant('x', -1, 'Left') __builtins__['Right'] = datastructuretools.OrdinalConstant('x', 1, 'Right') __builtins__['Center'] = datastructuretools.OrdinalConstant('y', 0, 'Center') __builtins__['Up'] = datastructuretools.OrdinalConstant('y', 1, 'Up') __builtins__['Down'] = datastructuretools.OrdinalConstant('y', -1, 'Down') __builtins__['Infinity'] = mathtools.Infinity() __builtins__['NegativeInfinity'] = mathtools.NegativeInfinity() systemtools.ImportManager.import_structured_package( __path__[0], globals(), delete_systemtools=False, )
from abjad.tools import mathtools Identity = OrdinalConstant('identity', 0, 'Identity') Less = OrdinalConstant('value', -1, 'Less') More = OrdinalConstant('value', 1, 'More') Exact = OrdinalConstant('value', 0, 'Exact') Left = OrdinalConstant('x', -1, 'Left') Right = OrdinalConstant('x', 1, 'Right') Both = OrdinalConstant('x', 0, 'Both') Center = OrdinalConstant('y', 0, 'Center') Up = OrdinalConstant('y', 1, 'Up') Down = OrdinalConstant('y', -1, 'Down') Top = OrdinalConstant('y', 1, 'Top') Bottom = OrdinalConstant('y', -1, 'Bottom') Infinity = mathtools.Infinity() NegativeInfinity = mathtools.NegativeInfinity() del mathtools from .CyclicTuple import CyclicTuple from .Duration import Duration from .Inequality import Inequality from .DurationInequality import DurationInequality from .Enumeration import Enumeration from .Expression import Expression from .LengthInequality import LengthInequality from .Multiplier import Multiplier from .Offset import Offset from .Pattern import Pattern from .TypedCollection import TypedCollection