Recipe catalog / next-duration
Pick the next rhythmic value
Which candidate rhythmic value best continues recentRhythm within meter, given any style supplied?
A generation loop has chosen the next pitch and must decide how long to hold it, application code has enumerated a few legal durations, and you want a musical judgment of which one continues the rhythmic feel.
Explore this recipe interactively ยท Source and implementation guide
Use next-duration in TypeScript
Install with npm install jev-recipes. Requires Node.js 22.9 or newer and ES modules. Set TYPESAFE_API_KEY in your server environment for live calls, which send input to TypeSafe and use API quota. See the installation guide.
import { nextDuration } from 'jev-recipes/next-duration';
const result = await nextDuration({
"meter": "3/4",
"recentRhythm": "quarter quarter quarter | quarter quarter",
"style": "steady waltz accompaniment",
"candidates": [
{
"id": "quarter",
"text": "quarter note (keeps the one-two-three)"
},
{
"id": "half",
"text": "half note (held across the bar line)"
}
],
"minConfidence": 0.8
});
console.log(result);
Input contract
| Field | Type | Needed |
|---|---|---|
| meter | string | Required |
| recentRhythm | string | Required |
| candidates | array | Required |
| style | string | Optional |
| minConfidence | number | Optional |
Full input and result schemas
{
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"meter": {
"type": "string"
},
"recentRhythm": {
"type": "string"
},
"candidates": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"id",
"text"
]
}
},
"style": {
"type": "string"
},
"minConfidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"meter",
"recentRhythm",
"candidates"
]
},
"result": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"model": {
"type": "string"
},
"usage": {
"type": "object",
"properties": {
"input_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"output_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"input_tokens",
"output_tokens"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"review"
]
},
"verdict": {
"type": "string",
"enum": [
"matched",
"none",
"ambiguous"
]
},
"selection": {
"type": [
"string",
"null"
]
},
"suggestedSelection": {
"type": [
"string",
"null"
]
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"probabilities": {
"type": "object",
"properties": {
"candidates": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"none": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"ambiguous": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"candidates",
"none",
"ambiguous"
],
"additionalProperties": false
}
},
"required": [
"model",
"usage",
"status",
"verdict",
"selection",
"suggestedSelection",
"confidence",
"probabilities"
],
"additionalProperties": false
}
}Saved example result
This hand-authored response demonstrates the contract. It is not a model accuracy measurement. Run it without an API key: npx jev-recipes demo next-duration.
{
"model": "demo-fixture",
"usage": {
"input_tokens": 0,
"output_tokens": 0
},
"status": "ready",
"verdict": "matched",
"selection": "quarter",
"suggestedSelection": "quarter",
"confidence": 0.9,
"probabilities": {
"candidates": {
"quarter": 0.9,
"half": 0.05
},
"none": 0.03,
"ambiguous": 0.02
}
}
Evaluation evidence
No verified live accuracy measurement is available. Evaluate representative cases before using this decision in your workflow.
Use the evaluation guide to measure this decision on your own labeled cases.
Limitations
- Judges rhythmic feel from written durations and a meter. It does not add up beats or verify that a candidate fits in the remaining bar; do that arithmetic in application code before supplying candidates.
- Groove is style-dependent, so the same pattern can want a long note in a ballad and a short one in a dance; supply style when it matters.
- A pick names a duration, not a pitch, articulation, or dynamic.
Related recipes
- game-action: Use game-action when the choice is among generic JSON game actions rather than durations judged for rhythmic sense.
- take-turn: Use take-turn to decide whether a player may act at all under game rules, rather than how long the next musical event should last.