Guida Armonica Interactive

An interactive interface to Francesco Geminiani's A Sure Guide to Harmony and Modulation (1756). The corpus is encoded as 2,236 short harmonic fragments linked by nodes (common chords that begin and end fragments). You can build passages, search by bass pitch sequence, and explore the fragments and nodes.

Features at a glance

  • Compose — build a passage from the fragments with live score engraving.
  • Search — find paths that match a pitch sequence, then inspect or send matches to Compose.
  • Fragments — filter and sort the full fragment library; open any fragment for detail.
  • Nodes — pick a chord node and examine the fragments that connect to it (forward and reverse).
  • Chords — browse every chord in the Guida, inspect 3-grams around a focal chord, and attach schemata that matching fragments can inherit.
  • Schemata — browse and define harmonic schemata, then annotate them on fragment scores. Requires login.

Compose

Usage

  • Choose a starting chord, then add fragments to continue the passage or work backward from a cadence using the two columns of fragments below the score.
  • Use Sort/Filter and shuffle on each column to narrow choices; click a card to add a fragment to the passage.
  • When the two directions of the passage can be connected, use Connect in the toolbar above the score to join them. When the forward tip can cadence and there is no reverse chain yet, use End Passage instead of picking an End stub from the fragment list. Use Insert to fill from Start to End (or between your open tips): Shortest path picks one uniformly at random among the shortest connections that include a real interior fragment; Random path walks a random connecting route. Clear All restarts the passage. Click a fragment label on the score to edit from that place, the space between two fragments to reopen a join, or the open gap between chains. Insert always inserts at least one fragment; when the tips already match, that path is a return to the same node. Use Connect to join matching tips without extra fragments. The toolbar also downloads (PDF, SVG, KRN, MEI) and can send the bass line to Search. While signed in, Save stores the passage as a document (see My passages) so islands and multi-section drafts are not stuffed into the URL. Copy link still emits a shareable /compose?f=&r= snapshot when the draft is two chains or fewer.
  • Open Display on the score toolbar to collapse equivalent chord nodes or restyle barlines from corpus statistics.
  • On the start screen, Demo: Geminiani's Rule of the Octave launches a guided tour.

URL parameters

  • f — Forward fragment chain: guidaOrder values separated by . (e.g. f=3.1385.1051). Indices 1–5 are opening chords; higher indices are corpus fragments.
  • r — Reverse fragment chain, same format as f.
  • harmony — 1 enables: Treat node chords with the same pitch, octave, and harmony as one node, ignoring metrical distinction.
  • barlines — 1 enables: Restyle existing barlines: solid when the corpus usually places a barline between the chords (above cutoff), dashed when less common. Also draw dashed barlines at node chords that imply a barline.
  • barlineCutoff — When barlines=1, solid vs dashed barlines use this corpus confidence threshold (0–1, default 0.95).
  • tour — Guided tour; use octave for the Rule of the Octave walkthrough.

Search

Usage

  • Enter a pitch sequence in the text area using space-separated LilyPond-style spellings (' and , for octave shifts; cs, bf, etc. for accidentals).
  • Matching paths appear in the chord network. Click nodes to select a path; toggle barline requirements on links where offered.
  • Selected paths are engraved below. Use the compose link on a result to open it in Compose with fragments prefilled.
  • Allow matches past ends includes paths where the search pattern aligns inside a longer passage, not only exact spans.

URL parameters

  • s — The pitch search string, space-separated (e.g. s=d+e+f+g+a+b+cs'+d', where + in the URL is a space). If omitted on first visit, a default pattern is applied.
  • o — 1 — allow matches past ends; 0 or absent — require matches that fit without overhang.

Fragments

Usage

  • Set filters in the left panel: location in the printed Guida (page, row, column), start/end nodes, rests, fermatas, barline and half-note counts, contained chords (with optional octave), and chord-to-chord transitions.
  • Results update as filters change. Sort with: Guida Default, Start and End Nodes, Pitch Descending - forward, Pitch Ascending - forward, Pitch Descending - reverse, Pitch Ascending - reverse, Random Shuffle.
  • Click a fragment card to open that fragment (an edge in the network) on its own page: interactive score, facsimile, neighboring chord statistics, and metadata. Step with previous/next, jump by guidaOrder or location ID, or pick a random fragment. Fragment annotation requires login. Search filters stay in the URL alongside frag, so Back to Results returns to the same query.

URL parameters

  • frag — Selected fragment: guidaOrder (e.g. frag=1155). A unique location ID such as 18.5.6 is also accepted. This is the only parameter that opens the detail page; search filters use their own keys and are preserved when you return to results.
  • start / end — Start and end nodes as nodes.json indexes, *-separated (e.g. start=1*4). A n prefix is also accepted.
  • page / row / col — Printed Guida location ranges (e.g. page=18, row=1-3).
  • rest / fermata — 1 = has, 0 = does not have.
  • bars / halves — Barline and half-note count ranges (e.g. bars=1-2).
  • chords / cmatch — Contained chords as chords.json rank, *-separated, optional _octave (e.g. chords=4_3). cmatch=all requires every chord.
  • pairs / pmatch — Chord transitions as rank pairs from.to, *-separated (e.g. pairs=4.12). pmatch=all requires every transition.
  • sort — Sort id when not the Guida default (e.g. sort=dict).

Nodes

Usage

  • The card in the upper right corner shows the current chord node; click it to pick a different node from the corpus.
  • Two columns list fragments that connect to this node (left = arrivals, right = departures). Use sort/filter controls as in Compose.
  • Click a fragment to jump to the node on the other end of the fragment.
  • Statistics on the right summarize barline and chord-adjacency frequencies for the current node.

URL parameters

  • n — Selected node: n + guidaOrder (e.g. n=n2). A raw node ID is also accepted.

Chords

Usage

  • The roster lists unique unified chords in columns by bass pitch, chromatic from d, to f'. Each column stacks the figures that exist for that bass, with no empty cells. A gold outline marks boundary (node) chords.
  • Open a chord to see 3-grams (previous, focal, next) as a layered network, like Search, plus a table of distinct triples. The detail view defaults to internal (within-fragment) 3-grams; use the filter to include node-spanning joins.
  • Internal 3-grams sit inside one fragment. Span 3-grams cross a node join: the penultimate chord of a fragment that ends at a node, that node, and the second chord of a fragment that begins at the same node (start and end labels must match; different versions of a unified node chord do not mix). Instances list the fragments that can take part on each side rather than every possible pairing.
  • Signed-in users open a 3-gram page to attach a schema with the same event-marker interface as fragment annotation. Matching fragments inherit that annotation; Apply copies the schema events onto the same notes in other instances, even when those notes sit at different positions in the fragment. Deleting the annotation on the 3-gram page removes it from those instances as well.

URL parameters

  • path — Chord pages use catalog ranks, not the raw chord string: /chords/4 for a chord and /chords/4/trigram/internal/12/8 for a 3-gram (focal / previous / next ranks). Omit the path to show the roster.

Schemata

Usage

  • Schemata requires login. Once signed in, browse published harmonic schemata, open My Schemata, or create your own (name, type, event count, and bass / figures / roman / meter values per event).
  • Fragment annotation also requires login. On a fragment detail page, select a schema and place events on the score to save an annotation. Existing annotations can be shown or hidden and deleted by their contributor.

Project background

Geminiani's Guida armonica presents a systematic table of harmonic motions realized as figured-bass patterns. This application digitizes that material so scholars and students can navigate attested moves, compare statistical tendencies (barlines, adjacency), and construct new passages consistent with the source vocabulary.

Fragment boundaries and node labels are derived from the encoded corpus (Humdrum/kern with figured bass). Scores are rendered with Verovio.

Credits & technology

  • Application design and development — Jonathan Goya (guida.jkg.app)
  • Source text — Francesco Geminiani, A Sure Guide to Harmony and Modulation (1756)
  • Score engraving — Verovio
  • Built with Next.js, React, TypeScript, Chakra UI, and React Router

Copyright © 2026 Jonathan Goya. Contact admin@jkg.app.


Copyright © 2026 Jonathan Goya