Names to voices: voice/2 turns a drum name, a note name, a MIDI number, hertz or a map of
controls into a TuningFork.Voice.
iex> %TuningFork.Voice{} = TuningFork.Kit.voice("bd", 0.25)
iex> TuningFork.Kit.voice("nothing here", 0.25)
nil
Summary
Functions
The drum names grouped by what they are, short name first.
A voice from a map of controls.
The MIDI note a value stands for, or nil when it is not a pitch.
Start fetching, in the background, every recording and soundfont the values would play.
Values are what voice/3 takes; anything else is skipped. Returns at once.
The voice for value, lasting seconds.
Functions
@spec banks() :: [String.t()]
The sound banks voice/2 knows, sorted.
iex> "RolandTR909" in TuningFork.Kit.banks()
trueA bank is not a set of recordings — nothing here is recorded — but a set of adjustments to
the drums this kit synthesises, so bank("RolandTR808") gives the long booming kick that
name is known for. A name it does not know changes nothing, so a pattern written for a bank
that is not here still plays.
@spec drums() :: [String.t()]
The drum names voice/2 knows, sorted.
The drum names grouped by what they are, short name first.
iex> TuningFork.Kit.families() |> Keyword.keys()
[:kick, :snare, :hat, :tom, :cymbal, :percussion]Names in the same group make the same sound; "bd" and "kick" are one entry.
@spec from_map(map(), number(), keyword()) :: TuningFork.Voice.t() | nil
A voice from a map of controls.
:sound or :note says what to play and is passed to voice/2; every other key changes the
voice that comes back. A map with neither is nil.
The MIDI note a value stands for, or nil when it is not a pitch.
iex> TuningFork.Kit.midi(%{degree: 4, scale: "g:minor"})
62
iex> TuningFork.Kit.midi(%{sound: "bd"})
nilA drum name has no pitch, so it is nil. :octave moves the root — 3 is where a scale sits
without one — and :transpose adds semitones after everything else.
@spec notes() :: [String.t()]
Every note name voice/2 takes, low to high.
A name is a letter, s for sharp or b for flat, and an octave: c3, fs4, eb2.
@spec prefetch([term()]) :: :ok
Start fetching, in the background, every recording and soundfont the values would play.
Values are what voice/3 takes; anything else is skipped. Returns at once.
@spec voice(term(), number(), keyword()) :: TuningFork.Voice.t() | nil
The voice for value, lasting seconds.
Returns nil for a value naming nothing, so a pattern carrying words this kit does not have
plays the ones it does rather than failing.
Options
:wait— whether to wait for a recording still being fetched from the web, defaulttrue; withfalsesuch a value isnilthis time and the fetch carries on behind