예제 #1
0
 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)
예제 #2
0
 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
예제 #3
0
 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
예제 #4
0
 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
예제 #5
0
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'],
)
예제 #6
0
    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
예제 #7
0
# -*- 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,
    )
예제 #8
0
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