Skip to content

The click plays every meter as if it were even, so odd and compound meters do not sound like themselves #595

Closed

Description

@thcp

The click marks exactly one beat per bar. Both implementations use the same rule -- (index - mark.beat) % per_bar == 0 in app/pipeline/click_render.py and the equivalent in static/js/metronome.js -- and there are only two click voices, an accent and a plain beat.

That is correct for 2/4, 3/4 and 4/4. It is wrong for every meter that carries internal stresses.

What it gets wrong

7/8 comes out as seven even clicks. In practice 7/8 is grouped, usually 3+2+2 or 2+2+3, and a player follows those group starts, not a bar of seven equal pulses. Without them the click gives no usable pulse to lock onto.

6/8 is already shipping wrong, and it is a preset. It renders as six straight eighths with a single accent. 6/8 is felt in two dotted-quarter groups, so it wants a stress on 1 and a lesser one on 4. The same applies to 9/8 and 12/8.

5/4 has the same problem, being 3+2 or 2+3 rather than five even beats.

Note this is not the same gap as #593. Adding more meters to the selector lets a user pick 7, but the click still plays those seven beats evenly, so an odd meter is selectable and still unusable.

What a fix needs

Grouping is the feature. A bar needs a subdivision -- 7 as 3+2+2, 6 as 3+3, 5 as 3+2 -- and an accent at each group start. A denominator on its own buys nothing: 7/8 and 7/4 are the same seven pulses grouped the same way, so adding "/8" to a label would not change a single click.

Two click voices are not enough. With only accent and plain, a 3+2+2 bar has three identical accents and the downbeat stops being findable. Grouping needs three levels: strong on beat 1, medium at each group start, weak elsewhere.

Constraints

  • The live click (static/js/metronome.js) and the rendered one (app/pipeline/click_render.py) must agree beat for beat. They are held to each other by tests/js/count-in.test.mjs and tests/test_click_render.py, and a player who monitors one and exports the other must not hear a difference.
  • The count-in runs through the same accent logic on both sides and has to group identically.
  • Changing 6/8 to its correct feel changes what existing users hear from a preset they already use. That is a deliberate behaviour change and should be called out, not slipped in.
  • Defaults for 2, 3 and 4 should stay exactly as they are. 4/4 has a real secondary stress on beat 3, but adding it by default would change the most common meter in the app for everyone.
  • Any grouping the user supplies has to sum to the bar length, and the export needs it too or a rendered file will not match playback.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions