# `TuningFork.Pattern.Voicing`
[🔗](https://github.com/jaman/tuning_fork/blob/v0.1.11/tuning_fork/lib/tuning_fork/pattern/voicing.ex#L1)

Chord symbols to voicings, as Strudel renders them.

    iex> TuningFork.Pattern.Voicing.render("Cm7")
    [58, 63, 67, 70, 72]

# `mode`

```elixir
@type mode() :: :below | :above | :root | :duck
```

# `dictionaries`

```elixir
@spec dictionaries() :: [atom()]
```

The dictionary names `render/2` takes.

# `known?`

```elixir
@spec known?(String.t(), atom()) :: boolean()
```

Whether `symbol` is a chord symbol `render/2` knows in `dictionary`.

# `render`

```elixir
@spec render(String.t(), keyword()) :: [integer()] | :error
```

The MIDI notes of `chord` voiced from a dictionary, or `:error` for a symbol it lacks.

## Options

  * `:dictionary` — one of `dictionaries/0`, default `:ireal`
  * `:anchor` — a note name or MIDI number the voicing is placed against; default the
    dictionary's, `c5` for `:ireal`
  * `:mode` — `:below` (top note at or under the anchor), `:above` (bottom note at or over
    it), `:root` (the root at or under it), or `:duck` (below, dropping a note that lands on
    the anchor); default the dictionary's
  * `:offset` — how many voicings along the dictionary's list to move, default 0
  * `:n` — one tone of the voicing instead of all of it, counting from 0 and wrapping into
    the octaves above and below
  * `:octaves` — how far `:n` moves per wrap, default 1

---

*Consult [api-reference.md](api-reference.md) for complete listing*
