from abjad import * %load_ext abjad.ext.ipython from abjad.demos import ferneyhough proportions = [(1, n) for n in range(1, 11 + 1)] proportions def make_nested_tuplet( tuplet_duration, outer_tuplet_proportions, inner_tuplet_subdivision_count, ): r'''Makes nested tuplet. ''' outer_tuplet = Tuplet.from_duration_and_ratio( tuplet_duration, outer_tuplet_proportions) inner_tuplet_proportions = inner_tuplet_subdivision_count * [1] last_leaf = outer_tuplet.select_leaves()[-1] right_logical_tie = inspect_(last_leaf).get_logical_tie() right_logical_tie.to_tuplet(inner_tuplet_proportions) return outer_tuplet tuplet = make_nested_tuplet(Duration(1, 4), (1, 1), 5) staff = scoretools.Staff([tuplet], context_name='RhythmicStaff') show(staff) tuplet = make_nested_tuplet(Duration(1, 4), (2, 1), 5) staff = scoretools.Staff([tuplet], context_name='RhythmicStaff') show(staff) tuplet = make_nested_tuplet(Duration(1, 4), (3, 1), 5) staff = scoretools.Staff([tuplet], context_name='RhythmicStaff') show(staff) normal_tuplet = Tuplet.from_duration_and_ratio(Duration(1, 4), (3, 5)) staff = scoretools.Staff([normal_tuplet], context_name='RhythmicStaff') show(staff) subdivided_tuplet = make_nested_tuplet(Duration(1, 4), (3, 5), 3) staff = scoretools.Staff([subdivided_tuplet], context_name='RhythmicStaff') show(staff) duration = Fraction(1, 4) def make_row_of_nested_tuplets( tuplet_duration, outer_tuplet_proportions, column_count, ): r'''Makes row of nested tuplets. ''' assert 0 < column_count row_of_nested_tuplets = [] for n in range(column_count): inner_tuplet_subdivision_count = n + 1 nested_tuplet = make_nested_tuplet( tuplet_duration, outer_tuplet_proportions, inner_tuplet_subdivision_count, ) row_of_nested_tuplets.append(nested_tuplet) return row_of_nested_tuplets tuplets = make_row_of_nested_tuplets(duration, (2, 1), 6) staff = scoretools.Staff(tuplets, context_name='RhythmicStaff') show(staff) def make_rows_of_nested_tuplets(tuplet_duration, row_count, column_count): r'''Makes rows of nested tuplets. ''' assert 0 < row_count rows_of_nested_tuplets = [] for n in range(row_count): outer_tuplet_proportions = (1, n + 1) row_of_nested_tuplets = make_row_of_nested_tuplets( tuplet_duration, outer_tuplet_proportions, column_count) rows_of_nested_tuplets.append(row_of_nested_tuplets) return rows_of_nested_tuplets score = Score() for tuplet_row in make_rows_of_nested_tuplets(duration, 4, 6): score.append(scoretools.Staff(tuplet_row, context_name='RhythmicStaff')) show(score) def make_score(tuplet_duration, row_count, column_count): r'''Makes score. ''' score = Score() rows_of_nested_tuplets = make_rows_of_nested_tuplets( tuplet_duration, row_count, column_count) for row_of_nested_tuplets in rows_of_nested_tuplets: staff = scoretools.Staff(row_of_nested_tuplets, context_name='RhythmicStaff') time_signature = indicatortools.TimeSignature((1, 4)) attach(time_signature, staff) score.append(staff) return score score = make_score(Duration(1, 4), 4, 6) show(score) def configure_score(score): r'''Configured score. ''' moment = schemetools.SchemeMoment(1, 56) set_(score).proportional_notation_duration = moment set_(score).tuplet_full_length = True override(score).bar_line.stencil = False override(score).bar_number.transparent = True override(score).spacing_spanner.uniform_stretching = True override(score).spacing_spanner.strict_note_spacing = True override(score).time_signature.stencil = False override(score).tuplet_bracket.padding = 2 override(score).tuplet_bracket.staff_padding = 4 scheme = schemetools.Scheme('tuplet-number::calc-fraction-text') override(score).tuplet_number.text = scheme configure_score(score) show(score) def make_lilypond_file(tuplet_duration, row_count, column_count): r'''Makes LilyPond file. ''' score = make_score(tuplet_duration, row_count, column_count) configure_score(score) lilypond_file = lilypondfiletools.make_basic_lilypond_file(score) configure_lilypond_file(lilypond_file) return lilypond_file def configure_lilypond_file(lilypond_file): r'''Configures LilyPond file. ''' lilypond_file.default_paper_size = '11x17', 'portrait' lilypond_file.global_staff_size = 12 lilypond_file.layout_block.indent = 0 lilypond_file.layout_block.ragged_right = True lilypond_file.paper_block.ragged_bottom = True spacing_vector = layouttools.make_spacing_vector(0, 0, 8, 0) lilypond_file.paper_block.system_system_spacing = spacing_vector lilypond_file = make_lilypond_file(Duration(1, 4), 11, 6) show(lilypond_file)