Skip to content

Sequencer Implementation #130

@jmidt

Description

@jmidt

Sequencer

The sequencer controls the 8 samplers. When editing the sequencer steps, the musical keyboard keys change to change sampler (black keys) and edit steps (white keys). Features are below, with those already implemented marked with a check mark.
GFI marks something suitable for a newcomer to get started on.

  • Tempo (controls global clock)
  • Start/stop (controls global clock)
  • Sequencer screen
    • Per-trigger settings
      • 3. conditional trigs
        • Chance / 2 in 4 etc
        • Draw 2 in 4 as ○ ● ○ ○
        • Single encoder, turn CW for X in Y, CCW for chance
      • 2. velocity
      • parameter locks?
    • Global
      • 1. Tempo / swing
      • 4. Sequence length
  • Elegant solution for substeps
    • Ratchets/Retriggers?
    • Finite list of selectable combinations
    • Full access to individual substeps with led "zoom"
  • Move file handling out to the Sequencer, from the individual Samplers.
  • Mutes
  • 5. Sends for samplers
    • Sampler objects own their own Sends
    • Sequencer::sends_screen() to get
  • 6. Variations
    • 1 base sequence, 4 variations, of which zero or one can be active at any time
    • variations are "diffs", i.e. only contain changes to the base sequence, not a copy of the base sequence
    • variations can be
      • queued for the next "round" (click)
      • switched on instantly and held with a momentary switch (shift + click)
      • queued and enabled for all future rounds
      • switched on instantly and kept on
    • step-toggles in variations have three states: on, off, "as in base"
  • Future extensions:
    • Longer sequences than 16 steps.
      • Pages? +/- could be reused to switch pages
    • GFI Long press (or press and encoder turn) does not toggle step
    • Choke groups
    • Mute groups
    • Parameter locks
      • Only sampler and sends props need to be lockable
    • Velocity view - view velocity on LEDs.

Global clock

  • Count microsteps (192?) with an unsigned int
  • clock range in ProcessData (last time, current time)
  • check if the desired step is in clock range
  • Sent from engine manager
  • Control through separate ClockManager
    • void start(), void stop(bool reset = true), void reset()
    • float bpm()
  • Future extensions
    • "Subscribe" to clock "events", i.e. handle every 16th etc.
      • Done by checking data.clock.contains_multiple, data.clock.count_multiple and data.clock.position_of_multiple
    • GFI swing

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions