# generic-step-sequencer

> A purpose-agnostic step sequencer implementation

Latest version **2.0.0** (published 2022-05-17) · MIT license · 0 weekly downloads

## Install

```sh
npm install generic-step-sequencer
pnpm add generic-step-sequencer
yarn add generic-step-sequencer
bun add generic-step-sequencer
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.0 |
| Published | 2022-05-17 |
| First published | 2021-12-12 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 20.4 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | youpy |

## Links

- npm: https://www.npmjs.com/package/generic-step-sequencer
- npm.io page: https://npm.io/package/generic-step-sequencer

## Recent versions

- 2.0.0 (latest) — 2022-05-17
- 1.0.1 — 2021-12-17
- 1.0.0 — 2021-12-12
- 0.1.1 — 2021-12-12
- 0.1.0 — 2021-12-12

## README

# generic-step-sequencer

A purpose-agnostic step sequencer implementation

## Installation

```
$ yarn add generic-step-sequencer
```

## Usage

see https://github.com/youpy/generic-step-sequencer/blob/main/examples/basic/index.ts

implement a step executor

```typescript
import {
  StepExecutor,
  Sequencer,
  State,
  PeriodicTicker,
  backward,
} from "generic-step-sequencer";

interface MyParameter {
  foo: string;
}

class MyStepExecutor implements StepExecutor<MyParameter> {
  execute(track: Track<MyParameter>): void {
    console.log(
      `executing step ${track.currentStep} on ${track.parameters.foo}`
    );
  }
}
```

create and start a sequencer

```typescript
const sequencer = new Sequencer<MyParameter, MyStepExecutor>(
  new MyStepExecutor()
);
const ticker = new PeriodicTicker(sequencer);

sequencer.addTrack({ foo: "track1" }, 8, [0, 2, 4, 6]);
sequencer.addTrack({ foo: "track2" }, 8, [1, 3, 5, 7]);
ticker.setBpm(250);
ticker.start();
```

set step direction

```typescript
// backward
sequencer.setNextStepStrategy(backward);

// random
const random = <T>(track: Track<T>): number => {
  return Math.floor(Math.random() * track.numberOfSteps);
};
sequencer.setNextStepStrategy(random);
```

### Use with React

- https://github.com/youpy/generic-step-sequencer/tree/main/examples/midi-sequencer
- https://twitter.com/youpy/status/1469315687999217664

```typescript
type Props = {
  seq: Sequencer<MyParameter, MyStepExecutor>;
  ticker: PeriodicTicker;
};

funcion App(props: Props) {
  const { seq, ticker } = props
  const [seqState, setSeqState] = useState<State<MyParameter>>({
    tracks: [],
  });

  useEffect(() => {
    seq.onStateChange(setSeqState);
    ticker.start()
  });

  // construct view from seqState
  return ...
}
```

### Use custom timer

You can replace the [default timer](https://github.com/youpy/generic-step-sequencer/blob/4674d3a4ab55dc93f21b85e22172b0c11bdb667e/src/sequencer.ts#L25-L33) with a custom timer implementation that implements the [`Timer`](https://github.com/youpy/generic-step-sequencer/blob/2c1ab3d703ac062224d786ca54a0a033adea3ef8/src/sequencer.ts#L20-L23) interface

```typescript
const ticker = new PeriodicTicker(sequencer, new MyTimer());
```

---
_Source: https://npm.io/package/generic-step-sequencer · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
