The Lick Library
Mankunku ships with a library of about 250 jazz phrases, organized into nine harmonic categories, plus an algorithmic generator that can make new phrases on demand. This page covers what's in the library, where each piece comes from, what the categories mean musically, and how the library handles transposition so a lick stays on your horn no matter what key the day is in.
What's in the library
There are three sources of musical content in the library:
- Hand-written licks (163 of them). Curated phrases, written for the app, organized by category. These are the bulk of what you encounter on Side A.
- Combinatorial licks (~86). Generated by pairing a small set of scale patterns (pitch sequences like "ascending pentatonic 5-note") with a small set of rhythm templates (durations like "syncopated eighth-note run"). The combiner only produces musically valid pairings, so you don't end up with sixteenth-note triplets squashed into a 5-note pentatonic stretched across one bar.
- Algorithmic generation. A 5-stage pipeline that produces fresh phrases on demand, fitting any specified difficulty, key, category, and bar count. This is the source you choose when you want infinite variety.
- Your own licks. Anything you step-enter (
/entry) or record (/record) joins the library tagged as user content. They behave the same as curated licks — searchable, tag-able for Side B, transposable to any key.
You can mix sources in Side A's settings: Curated only, Generated only, or Mixed (both).
The nine categories
Each lick belongs to one harmonic category. Categories tell the app what context the lick expects — what chord or progression it's designed to fit over. They also tell you, the player, what kind of vocabulary you're drilling.
| Category | What it is | Approximate count |
|---|---|---|
| Beginner Cells | Two- and three-note minimal cells designed for difficulty levels 1–5. Pentatonic intervals, blues fragments, neighbor-tone patterns. The on-ramp into the library. | 50 |
| ii-V-I Major | The signature jazz cadence (Dm7 → G7 → Cmaj7 in C). Different rhythmic shapes, different melodic strategies — chord-tone arpeggios, scale runs, enclosures. | 24 |
| Blues | 12-bar blues vocabulary. Major-blues and minor-blues licks, blue notes (the b5), call-and-response shapes. | 20 |
| Bebop Lines | Long lines in the bebop vocabulary. Bebop scale runs, chromatic approaches, characteristic shapes from Bird, Dizzy, Bud Powell. | 20 |
| ii-V-I Minor | The minor counterpart (Dm7b5 → G7alt → Cm7 in C). Altered-dominant lines, melodic-minor color. | 15 |
| Pentatonic | Pentatonic-based vocabulary that works over multiple harmonic contexts. | 10 |
| Modal | Sustained-mode vocabulary (Dorian, Mixolydian, Lydian) for static-harmony tunes — So What, Impressions, Maiden Voyage territory. | 10 |
| Rhythm Changes | The Gershwin "I Got Rhythm" cycle — I-vi-ii-V repeating. The bebop test for technical command at speed. | 7 |
| Ballad | Slower, more lyrical phrases with sustained notes and space. | 7 |
Plus the combinatorial licks (~86) which span multiple categories depending on the scale × rhythm pairing, and user content (yours).
The category label drives two things: which Side B progression types the lick can run over (a ii-V-I-major lick fits ii-V-I major progressions naturally), and which Side A filter the lick shows up under.
How the library knows everything is in C
This is a quiet but important design decision: every curated lick in the library is stored in concert C. The Cmaj7 lick is written with the root on a literal C; the Dorian lick is written starting on a literal D over a Dm7 context that's actually D Dorian (the second mode of C major). When you practice in F or Eb or B, the app transposes the lick at runtime to your active key.
Storing in C makes a few things much easier:
- There's only one version of each lick. Adding a new lick means writing it once in C, not twelve times.
- Transposition is a single operation. Shift every note's MIDI number by the interval from C to your target key, shift the chord roots by the same interval, and the lick is in your target key.
- Octave centering can keep the result on your horn (more on this below).
The "stored in C" rule also applies to the algorithmic generator and the combinatorial engine. They work in C and the same transposition pipeline carries the result to your active key.
Octave centering — keeping licks on the horn
Naive transposition has a problem: a C lick that sits comfortably between G4 and G5 will, when transposed to B, sit between F#5 and F#6 — too high for many tenors. Transposed to F# instead it sits between C#4 and C#5, near the bottom of the range.
The library handles this with octave centering. After transposing to the target key, the app evaluates octave shifts (-3 to +3) and picks the one that:
- Maximizes notes inside the comfortable range (MIDI 60–75, roughly C4 to Eb5 — the heart of tenor sax range).
- Tiebreaker: keeps the average pitch closest to the middle of that range.
The result: a lick transposed to B doesn't end up in stratospheric tenor territory. It's pulled down an octave automatically. The same logic on the other end keeps a lick from dropping into the basement when transposed to F#.
You can override the comfortable range in Settings ("Highest note") so the app respects your actual range — useful if you're playing alto or trumpet, both of which sit higher than tenor.
Tonality-aware transposition
For practice sessions, the transposition logic gets one more layer of nuance. Different scale types have different parent-key relationships:
- Major modes with multi-chord progressions (ii-V-I, turnarounds, rhythm changes) transpose to the parent major key. So an A Dorian ii-V-I doesn't transpose so the lick literally starts on A — it transposes to G major, the parent of A Dorian, so the chord progression Am7 → D7 → Gmaj7 still works as a real ii-V-I.
- Major modes with single-chord licks transpose directly to the modal root. A Dorian lick over Dm7 transposes so it starts on D.
- Non-major scales (blues, pentatonic, melodic minor, harmonic minor) transpose to the key, then snap any out-of-scale notes to the nearest scale tone, preferring flats when equidistant. This handles the case where a chromatic passing tone in the original would land on a sharp seventh in the new key — the snap nudges it to the actual scale member.
You don't have to think about any of this while you play. It happens automatically when the daily key changes or when you switch scale types in settings.
The algorithmic generator
When you set Side A's source to "Generated" or "Mixed," the algorithmic generator can produce new phrases on demand. The pipeline:
- Pick target notes for the strong beats. Every two beats, the generator chooses a chord tone to land on — picking by voice leading from the previous target so the line moves smoothly across chord changes.
- Connect the targets with approach patterns. Three strategies the generator picks between: a diatonic scale run, a chromatic approach (one or two half-step approaches into the target), or an arpeggio fill (chord tones between the two targets). The mix of strategies depends on the difficulty level.
- Assign rhythms to the resulting note sequence, using rhythm types allowed by the current difficulty tier (quarters at level 1; eighths at level 3; triplets at level 5; sixteenths at level 7).
- Add articulation at higher levels — accents on target notes, ghost notes on weak-beat passing tones, legato on stepwise motion.
- Validate the result against contour rules (no excessive leaps without recovery, no wandering off the instrument's range, enough stepwise motion). If validation fails, retry up to five times. If all five fail, fall back to a simple scale fragment so you always get a phrase.
The generator is the source of variety. It will never repeat itself exactly — every new phrase is genuinely new — and at higher difficulty levels it produces lines that hold up against the curated library.
The mutator
There's also a mutator that can take an existing lick and produce variations:
- Rhythmic displacement — shift all note onsets by an eighth note, creating syncopation.
- Octave displacement — bump 25% of notes up or down an octave (skipping the first and last so the phrase still starts and ends recognizably).
- Truncation — keep the first 60% of the lick for a shorter practice fragment.
- Retrograde — reverse the pitch sequence while keeping the rhythm.
The mutator runs occasionally in mixed mode to refresh familiar licks. Each mutation is validated; if the result violates contour rules it gets thrown away.
Adding your own licks
Two ways to add to the library yourself:
Step entry at /entry. Pick a duration (whole, half, quarter, eighth, sixteenth, with triplet toggle), pick a pitch (with sharp/flat/natural), and the cursor advances. Add rests, set the bar count (1–4 bars), pick a name and a category. Notes are entered in your written pitch — what you'd see on your chart — and the app converts to concert pitch internally on save.
Record at /record. Play a phrase on your horn, the app captures the audio, runs the pitch detector and onset detector across it, and produces a transcription. Useful for capturing something you just figured out by ear.
Either way, your lick:
- Joins the library with a
usersource. - Can be tagged for Side B's 12-key drill.
- Can be transposed to any key like any curated lick.
- Counts toward your progress when you practice it.
- Stays on your local device (in
localStorage), and syncs to the cloud if you're signed in.
How licks are written under the hood (a peek)
If you're curious: each lick is a structured object with the following pieces:
- Notes — a sequence of pitches and rhythms. Pitches are MIDI numbers; rhythms are fractions like
[1, 8](eighth note) or[1, 12](triplet eighth). Using fractions instead of decimals avoids the floating-point errors that show up when you try to express a triplet as0.0833.... - Harmony — a sequence of chord segments, each with a chord (root + quality like
min7,7,maj7) and a scale (likemajor.dorian). - Difficulty — a level number, plus separate pitch-complexity and rhythm-complexity ratings.
- Category, tags, name, key — the metadata that helps the library organize and surface the lick.
You don't need to know any of this to use the app. It only matters if you're contributing licks at the source-code level (which is a developer task, not a user task).