def sustain_every(indices, period): r'''Makes sustain mask with `indices` set equal (at `period`) to sustain. .. container:: example **Example 1.** Sustains every second division: :: >>> mask = rhythmmakertools.sustain_every(indices=[1], period=2) :: >>> print(format(mask)) rhythmmakertools.SustainMask( indices=(1,), period=2, ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... output_masks=[mask], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 c'4. } { \time 7/16 c'4.. } { \time 3/8 c'4. } } .. container:: example **Example 2.** Sustains every second and third division: :: >>> mask = rhythmmakertools.sustain_every(indices=[1, 2], period=3) :: >>> print(format(mask)) rhythmmakertools.SustainMask( indices=(1, 2), period=3, ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... output_masks=[mask], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 c'4. } { \time 7/16 c'4.. } { \time 3/8 c'4. } } Returns sustain mask. ''' from abjad.tools import rhythmmakertools indices = list(indices) assert isinstance(period, int) assert 0 < period return rhythmmakertools.SustainMask( indices=indices, period=period, )
def sustain_every(indices, period, inverted=None): r'''Makes sustain mask that matches `indices` at `period`. .. container:: example **Example 1.** Sustains every second division: :: >>> mask = rhythmmakertools.sustain_every(indices=[1], period=2) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(1,), period=2, ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[mask], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 c'4. } { \time 7/16 c'4.. } { \time 3/8 c'4. } } .. container:: example **Example 2.** Sustains every second and third division: :: >>> mask = rhythmmakertools.sustain_every(indices=[1, 2], period=3) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(1, 2), period=3, ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[mask], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 c'4. } { \time 7/16 c'4.. } { \time 3/8 c'4. } } Returns sustain mask. ''' from abjad.tools import rhythmmakertools indices = list(indices) pattern = patterntools.Pattern( indices=indices, inverted=inverted, period=period, ) mask = rhythmmakertools.SustainMask(pattern=pattern) return mask
base_pitch='G3', phrase_inflections=consort.RegisterInflection.zigzag(6) .reverse().align(), segment_inflections=consort.RegisterInflection.descending( width=12).align() ), register_spread=6, ), rhythm_maker=rhythmmakertools.TaleaRhythmMaker( burnish_specifier=rhythmmakertools.BurnishSpecifier( left_classes=[scoretools.Rest], left_counts=[1, 1, 0], right_classes=[scoretools.Rest], right_counts=[1], ), extra_counts_per_division=[0, 0, 1], division_masks=[ rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=[0], period=3, ), ), ], talea=rhythmmakertools.Talea( counts=[1, 1, 1, 1, 2], denominator=16, ), ), )
def sustain(indices=None, inverted=None): r'''Makes sustain mask that matches `indices`. .. container:: example **Example 1.** Sustains divisions 1 and 2: :: >>> mask = rhythmmakertools.sustain([1, 2]) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(1, 2), ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[ ... rhythmmakertools.silence_all(), ... mask, ... ], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 r4.. } { \time 3/8 c'4. } { \time 7/16 c'4.. } { \time 3/8 r4. } } .. container:: example **Example 2.** Sustains divisions -1 and -2: :: >>> mask = rhythmmakertools.sustain([-1, -2]) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(-1, -2), ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[ ... rhythmmakertools.silence_all(), ... mask, ... ], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 r4.. } { \time 3/8 r4. } { \time 7/16 c'4.. } { \time 3/8 c'4. } } .. container:: example **Example 3.** Works with pattern input: :: >>> pattern_1 = patterntools.select_all() >>> pattern_2 = patterntools.select_first() >>> pattern_3 = patterntools.select_last() >>> pattern = pattern_1 ^ pattern_2 ^ pattern_3 >>> mask = rhythmmakertools.sustain(pattern) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.CompoundPattern( ( patterntools.Pattern( indices=(0,), period=1, ), patterntools.Pattern( indices=(0,), ), patterntools.Pattern( indices=(-1,), ), ), operator='xor', ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[ ... rhythmmakertools.silence_all(), ... mask, ... ], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 r4.. } { \time 3/8 c'4. } { \time 7/16 c'4.. } { \time 3/8 r4. } } .. container:: example **Example 4.** Works with pattern input and inverted flag: :: >>> pattern_1 = patterntools.select_all() >>> pattern_2 = patterntools.select_first() >>> pattern_3 = patterntools.select_last() >>> pattern = pattern_1 ^ pattern_2 ^ pattern_3 >>> mask = rhythmmakertools.sustain(pattern, inverted=True) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.CompoundPattern( ( patterntools.Pattern( indices=(0,), period=1, ), patterntools.Pattern( indices=(0,), ), patterntools.Pattern( indices=(-1,), ), ), inverted=True, operator='xor', ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[ ... rhythmmakertools.silence_all(), ... mask, ... ], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> print(format(staff)) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 r4. } { \time 7/16 r4.. } { \time 3/8 c'4. } } Returns sustain mask. ''' from abjad.tools import rhythmmakertools indices = indices or [] prototype = (patterntools.Pattern, patterntools.CompoundPattern) if isinstance(indices, prototype): pattern = indices else: pattern = patterntools.Pattern( indices=indices, inverted=inverted, ) pattern = new(pattern, inverted=inverted) return rhythmmakertools.SustainMask(pattern=pattern)
def sustain_last(n=1, inverted=None): r'''Makes sustain mask that matches the last `n` indices. .. container:: example **Example 1.** Sustains last division: :: >>> mask = rhythmmakertools.sustain_last() :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(-1,), ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[ ... rhythmmakertools.silence_all(), ... mask, ... ], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 7/16 r4.. } { \time 3/8 r4. } { \time 7/16 r4.. } { \time 3/8 c'4. } } .. container:: example **Example 2.** Sustains last two divisions: :: >>> mask = rhythmmakertools.sustain_last(n=2) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(-2, -1), ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[ ... rhythmmakertools.silence_all(), ... mask ... ], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 7/16 r4.. } { \time 3/8 r4. } { \time 7/16 c'4.. } { \time 3/8 c'4. } } .. container:: example **Example 3.** Sustains no last divisions: :: >>> mask = rhythmmakertools.sustain_last(n=0) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(), ), ) :: >>> maker = rhythmmakertools.NoteRhythmMaker( ... division_masks=[ ... rhythmmakertools.silence_all(), ... mask, ... ], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 7/16 r4.. } { \time 3/8 r4. } { \time 7/16 r4.. } { \time 3/8 r4. } } Returns sustain mask. ''' from abjad.tools import rhythmmakertools indices = list(reversed(range(-1, -n - 1, -1))) pattern = patterntools.Pattern( indices=indices, inverted=inverted, ) mask = rhythmmakertools.SustainMask(pattern=pattern) return mask
def sustain_first(n=1, inverted=None): r'''Makes sustain mask that matches the first `n` indices. .. container:: example **Example 1.** Sustains first division: :: >>> mask = rhythmmakertools.sustain_first() :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(0,), ), ) :: >>> rhythm_maker = rhythmmakertools.EvenDivisionRhythmMaker( ... denominators=[16], ... division_masks=[mask], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> selections = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... selections, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 { c'16 [ c'16 c'16 c'16 c'16 c'16 ] } } { \time 7/16 { c'16 [ c'16 c'16 c'16 c'16 c'16 c'16 ] } } { \time 3/8 { c'16 [ c'16 c'16 c'16 c'16 c'16 ] } } } .. container:: example **Example 2.** Sustains first two divisions: :: >>> mask = rhythmmakertools.sustain_first(n=2) :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(0, 1), ), ) :: >>> rhythm_maker = rhythmmakertools.EvenDivisionRhythmMaker( ... denominators=[16], ... division_masks=[mask], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] >>> selections = rhythm_maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... selections, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = rhythm_maker._get_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 c'4. } { \time 7/16 { c'16 [ c'16 c'16 c'16 c'16 c'16 c'16 ] } } { \time 3/8 { c'16 [ c'16 c'16 c'16 c'16 c'16 ] } } } Returns sustain mask. ''' from abjad.tools import rhythmmakertools indices = list(range(n)) pattern = patterntools.Pattern( indices=indices, inverted=inverted, ) mask = rhythmmakertools.SustainMask(pattern=pattern) return mask
def sustain_all(inverted=None): r'''Makes sustain mask that matches all indices. .. container:: example **Example 1.** Without mask: >>> maker = rhythmmakertools.TupletRhythmMaker( ... tuplet_ratios=[(3, 1)], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] :: >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 7/16 \tweak #'text #tuplet-number::calc-fraction-text \times 7/8 { c'4. c'8 } } { \time 3/8 \tweak #'text #tuplet-number::calc-fraction-text \times 3/4 { c'4. c'8 } } { \time 7/16 \tweak #'text #tuplet-number::calc-fraction-text \times 7/8 { c'4. c'8 } } { \time 3/8 \tweak #'text #tuplet-number::calc-fraction-text \times 3/4 { c'4. c'8 } } } .. container:: example **Example 2.** With mask: :: >>> mask = rhythmmakertools.sustain_all() :: >>> print(format(mask)) rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=(0,), period=1, ), ) :: >>> maker = rhythmmakertools.TupletRhythmMaker( ... division_masks=[mask], ... tuplet_ratios=[(3, 1)], ... ) >>> divisions = [(7, 16), (3, 8), (7, 16), (3, 8)] :: >>> music = maker(divisions) >>> lilypond_file = rhythmmakertools.make_lilypond_file( ... music, ... divisions, ... ) >>> show(lilypond_file) # doctest: +SKIP .. doctest:: >>> staff = maker._get_rhythmic_staff(lilypond_file) >>> f(staff) \new RhythmicStaff { { \time 7/16 c'4.. } { \time 3/8 c'4. } { \time 7/16 c'4.. } { \time 3/8 c'4. } } Returns sustain mask. ''' from abjad.tools import rhythmmakertools pattern = patterntools.Pattern( indices=[0], inverted=inverted, period=1, ) mask = rhythmmakertools.SustainMask(pattern=pattern) return mask
viola=ersilia.string_legato_music_specifier .transpose('C3'), cello=ersilia.string_legato_music_specifier .transpose('C2'), bass=ersilia.string_legato_music_specifier .transpose('E1'), ) ### AUXILIARY ### music_specifier = new( ersilia.pitch_pipe_music_specifier, rhythm_maker__division_masks=[ rhythmmakertools.SustainMask( pattern=patterntools.Pattern( indices=[0, -1], ), ), ], attachment_handler__dynamic_expressions=consort.DynamicExpression( start_dynamic_tokens='fp', stop_dynamic_tokens='niente', ), ) segment_maker.add_setting( timespan_identifier=timespantools.Timespan(0, (3, 2)), timespan_maker=new( ersilia.tutti_timespan_maker, fuse_groups=True, timespan_specifier=consort.TimespanSpecifier( minimum_duration=0,