Cantus Firmus

Releases

What changed in each build, and why. Three kinds of change get their own heading, because they answer different questions: what is new, whether the thing you reported is fixed, and what the app now says differently about the music without anything in the app having changed.

Build 4

9 September 2026 TestFlight

One feature, and it belongs to somebody else. Michiel Nieuwenhuizen, who writes whichbachcantata.be, has kindly given permission for his writing to travel with the app — so three cantatas in five now carry a paragraph about the work, credited and linked back to the essay it came from.

159cantatas with commentary
184paragraphs placed
105with none, by design
2–3sentences each
New
  • Commentary on a cantata, by whichbachcantata.be

    It sits above your own notes: two or three sentences on the work, with the essay it was taken from named underneath and a link through to read the rest on his site. Editing it keeps your version and the original underneath, the same way a catalogue correction does — the credit changes tense rather than disappearing.

    105 cantatas have none, and that is the rule working rather than a gap to fill. The site's essays are written per cantata day, not per cantata, so a paragraph is attributed to a work only when it names exactly one of that day's own cantatas. The rest compare two works or discuss the feast and name none. Splitting a comparison in half would file text about one cantata under another's name — the same judgement the streaming-link matcher makes about a plausible wrong answer.

  • About names the source too

    Each paragraph already said where it came from. The About screen now says the app carries someone else's writing at all, with a link to the site — which a reader would otherwise have to infer from whichever cantata they happened to open.

The permission is the whole licence, so the app is built to honour it exactly: no paragraph can appear without its source and link — the build fails if one does — and removing the text again is a single flag, --no-commentary, one rebuild and one release. The check that used to keep this text out of a shipping build has reversed rather than been deleted: it now fails when the commentary is missing, because the source files are read from a working copy the app's repository does not contain, and a build made without them would look perfectly healthy while the section silently vanished from 159 works.

Build 3

7 September 2026 TestFlight

The Christmas Oratorio finally has movements, which turns eleven of Bach's own borrowings from something the app knew about into something it can show you. Every movement list now says how long the work runs, and there is a way to write to me from inside the app.

64BWV 248 movements
11borrowings, named
228works with a running time
339new Apple Music links
160placeholder titles filled
New
  • The Christmas Oratorio, all 64 movements

    BWV 248 appears in none of the sources this catalogue is built from, so until now it had no movements at all — and every reference to one was quietly discarded at build time. Twenty-four of them: 13 chorale settings and 11 movements Bach reworked from earlier music. The whole oratorio hung off a single work-level link, and its place in the network was invisible.

    The movements are transcribed by hand from the per-part tables of the Wikipedia article. 23 of those 24 references now land on a real movement — the odd one out, movement 53, sets a melody nothing else in the catalogue sets, so it is referenced and still connects to nothing, which is the true answer rather than a tidy one.

  • A borrowing is not a shared melody, and now says so

    "Bereite dich, Zion" is note for note an aria in which Hercules refuses Pleasure, written a year earlier for a secular birthday cantata. Calling that "a shared melody" is true of the notes and silent about the only thing a listener would notice: the same music under a completely new text.

    Eleven of these are now carried as their own kind of connection, from three secular cantatas — six from BWV 213, four from BWV 214, one from BWV 215. They read Reworked into on the earlier work and Reworked from on the later one. Unlike a shared tune, which is one fact read from either end, a borrowing has an earlier work and a later one, and a single label would have BWV 248 claiming it came first.

  • How long a work runs, under its movements

    228 works now show a running time beneath their movement list, summed from the linked recordings. It is built into the catalogue rather than asked for at the time, so it needs no Apple Music subscription and no network — deciding whether there is time for a cantata before dinner should not require an account.

    It is labelled Approx duration, and where only some movements carry a link it says how many it covers. A cantata whose recitatives happen to be the unlinked ones would otherwise come out minutes short while looking complete. It is also that recording's length: a period-instrument reading of the same work can run a quarter shorter.

  • About, and a way to write to me

    The top-right corner now opens an About screen: what the app is, what a cantus firmus is for anyone meeting the term as an app name, where the data comes from, and a message to me — by email or as a GitHub issue, pre-filled with the build and the catalogue version so a reply does not have to start by asking. Your own notes and corrections live under there too.

    Corrections are the thing most worth sending. The catalogue has known gaps, and every one filled since build 1 was filled because somebody named it.

  • Play a list of related works

    That screen groups works by the tune they share, and the point it makes is that a connection between two cantatas is a specific chorale melody — so hearing the tune arrive in each of them is the claim itself. Until now there was no way to play it at all, only to tap into each work in turn and lose the comparison. One queue per melody, not per screen: a queue running across the sections would play two different tunes under a heading saying "the shared melody".

  • A melody screen marks where you came from

    Every row on a melody's screen sets the same tune, and most of them are titled with that tune's name, so after two taps the piece you were reading about is one of twelve near-identical rows. The setting you arrived from now wears a star. Arriving from a work without a movement — BWV 113 sets one melody at movements 1 and 8 — stars both, because that is genuinely all the previous screen knew.

  • Tap the heart to favourite a recording

    No app but Apple's can fill that heart: Favorite Songs is a smart playlist and MusicKit offers no way to write to one. So the heart is a hand-off — it opens the track in Music, and coming back re-reads your library straight away rather than waiting out the usual refresh interval, which would leave the heart empty right after you filled it and read as a tap that failed.

Fixed
  • A work that finishes now ends, instead of appearing to restart

    Playing a work through to its last track left every piece of state as it had been mid-cantata: the mini player sat over silence showing a pause button, and the progress line snapped back to the start and stayed there. Worse, reaching the end rewinds Apple Music's player to its first track, and that rewind arrived looking like an ordinary advance — so the "now playing" mark jumped back to movement 1 and a cantata that had just ended read as one starting over in silence.

    Reported from a phone — a simulator has no subscription and cannot run this path at all
  • A movement screen no longer goes stale while the phone is locked

    Reading about a movement while it plays is the ordinary use of that screen, and the queue runs on while the screen is off. Coming back left you reading the words, connections and corrections of music that had stopped ten minutes earlier — nothing looked broken, the screen simply described the wrong piece. It now closes itself and hands you back the movement list, where the playing row is marked.

    Three things stop it firing when it shouldn't: a screen opened to read about something you were not listening to was never following anything, a stopped player is not a queue that moved on, and it never closes over unsaved writing.

Catalogue corrections
  • 160 placeholder movement names filled in

    29 works reached the app as "Movement 1".."Movement N" and are now named from their own scraped texts, which also restores something less obvious: a placeholder costs those works their favourite hearts. The matcher refuses to use "Aria 3" as a needle — it would match half the catalogue — so only the work-level BWV number ever matched, and the heart landed on the cantata and none of its movements. That is exactly what was reported for BWV 70 and BWV 146.

    Reported by a TestFlight tester
  • 339 more Apple Music links, from single albums

    Works that the curated playlists left partial are now completed from a single album rather than left with holes. Deliberately a single one: a play-all queue spliced across two recordings would change orchestra between a chorus and the aria answering it. A work stays partial rather than take its remaining movements from a second performance.

  • 190 movements still carry a placeholder name

    Down from 350, across 21 works that are placeholders end to end. They render as Aria 3 in italics, which is honest but thin, and costs those works their movement-level favourites. 22 works still have no Apple Music recording at all — nothing is linked unless its own title carries the catalogue number, so an absence there is a decision rather than an oversight.

109 automated checks run against the catalogue before it ships. Three are new here: two guard the running times against a stale or impossible length, and one asserts every one of the Christmas Oratorio's 24 pre-existing references lands where it should — that movement 4 is "Bereite dich, Zion" and 36 the Part IV chorus BWV 213 opened with. A slipped number in 64 hand-typed rows would otherwise look entirely plausible.

Build 2

17 August 2026 TestFlight

The sung texts arrive — every cantata movement in German with the English beneath it, line for line — alongside the three things the first round of testers reported, and a handful of corrections to the catalogue itself.

1,547movement texts
240works with a text
161hymn texts
33movements newly named
313works newly on Apple Music
New
  • A new palette: gold and purple, and a new icon with it

    The app's accent moves from bordeaux to the gold of the network map, and chorale melodies keep the map's purple. The two colours carry meaning and only that meaning: gold is the catalogue — works, movements, and the links between them — and purple is a melody, the thing with a Zahn number. The app, the map and this site are now one palette.

    The app icon follows, since the red it wore was the old accent and nothing else used it any more. The drawing is unchanged — three voices crossing a held line, which is what a cantus firmus is — but it now sits on gold, and the dark variant on a deeper gold with cream strokes.

  • The words, in German and English

    Every movement's text now sits on its own screen: the German line, the English directly beneath it, and a blank line before the next — so you can follow either language and always know which line is being translated. A melody's screen carries the whole hymn, every verse, not only the ones Bach set. Translations by Francis Browne and others, from bach-cantatas.com, credited under each text.

    Where a translation is not line-for-line the app says so and shows the two as blocks instead. Roughly a fifth of them are like that, and pretending otherwise would put confident, fluent, wrong English under every line after the drift.

  • Play every setting of a melody, one after another

    A melody screen now has a play-all over its settings, in catalogue order — the movement where the setting is a movement, the whole piece where the work is the setting. Hearing one tune arrive as a chorus, then an aria, then a four-part harmonisation is the clearest demonstration the app can give of what a cantus firmus is.

  • Apple Music reaches the rest of the catalogue

    Recordings used to stop at the cantatas, because the curated playlists they were matched from cover nothing else — every organ chorale, every four-part chorale and most of the concertos had nothing to play. 313 works gained a recording: organ chorales go from none to all 77, four-part chorales from none to 193 of 195, the keyboard concertos from three to all thirteen, and the motets, the oratorio and both passions are now covered.

    Where a performance was there to be had, the well-known one was taken — Walcha at the organ, Gardiner and Suzuki for the choral music, Gould and Pinnock at the keyboard. Nothing was accepted on a search engine's word: a recording only counts when its own title carries the catalogue number, which is why 29 works still have nothing rather than something plausible and wrong.

  • Play a whole work through Apple Music

    The movement list's play-all now queues real recordings for a listener who has the work: their own favourites when their library holds two or more of the movements, otherwise the catalogue's links. The header line always names which is about to play, and the two are never spliced — alternating them down a cantata would change orchestra between a chorus and the aria that answers it.

  • A text size of the app's own

    Under Discover → Display. It defaults to following the system, so nothing changes unless you ask; picking a size overrides iPadOS for this app only. iPad keeps a text size separate from your iPhone's, and an iPhone app on an iPad is magnified on top of that — between them, a setting that reads well in Mail turns a German incipit into three wrapped lines here.

  • Search the web from any title

    Long-press a work or a movement and there is a Google search beside the copy actions, prefixed with the catalogue number. A bare German incipit is a hymn line two centuries older than Bach and mostly returns hymnals; Bach BWV 105/3 finds the movement.

  • The real performance on a quiz reveal

    A listening question is still the synthesised clip — the app controls what that is called, and a real recording would put the answer on the lock screen. The reveal now offers the performance instead, where a title naming the work is the point rather than a leak.

Fixed
  • The mini player no longer covers the tab bar

    Starting anything playing put the player on top of the tab bar and made every tab unreachable. The inset now sits inside each tab rather than around the whole tab view.

    Reported by a TestFlight tester
  • Searching a number finds the works around it

    Typing 17 found BWV 17 and nothing else, while text search had always matched partially. Exact hits are pinned at the top and everything starting with those digits follows underneath.

    Reported by a TestFlight tester
  • BWV 172 is Erschallet, ihr Lieder again

    The catalogue was naming a handful of works after a melody they merely quote — the quiz called BWV 172 "Wie schön leuchtet der Morgenstern", which is the chorale of its closing movement, not the cantata. A cantata that sets one melody quotes it; a four-part chorale is it. That rule now applies only where it is true, and the eight works it used to reach are named by hand.

    Reported by a TestFlight tester
  • BWV 113 no longer appears twice under one melody

    It sets the tune at movements 1 and 8, and the two rows collapsed into one identity — so the list drew the first movement's number on both.

  • Favourites now show on movements, not just the work

    For a cantata with no movement names, only the work-level catalogue number ever matched, so the heart landed on the cantata and on nothing inside it. Naming the movements was the fix — see below.

    Reported by a TestFlight tester, for BWV 70 and 146
  • You can see which movement is sounding

    A nine-movement cantata playing straight through never said where it had got to. The playing row now replaces its number with a speaker and tints the title, and it follows both players — the synthesised queue and Apple Music.

  • A melody's settings say what they have, and which is playing

    Playing every setting of one tune worked, but the list it ran through showed nothing at all: no mark for which settings had a recording, and no sign of where the queue had got to — so a running queue looked exactly like a list with nothing to play. Each row now carries the same two markers the movement list uses, and the sounding row is marked the same way.

  • A melody's screen is purple throughout

    On a melody's screen every row is a setting of that melody, so the rows now take the melody colour rather than plain grey. It says "you are inside a melody" — which is why a work's own title stays as it is, and why the same row elsewhere in the app does not change.

  • The mini player's title scrolls

    These are German incipits in a narrow strip, and a released track title is longer still, so truncation was the normal case. It scrolls once and fades back; a line that fits never moves.

  • A movement row says what exists; the movement screen chooses

    Rows carried a play button for the synthesised rendering alone, which made a movement with a real recording behind it look identical to one without — and offered no way to reach the recording. Rows now carry only the two markers, and the movement's own screen puts both controls side by side, each labelled with what it plays.

  • Tapping a setting opens that movement

    From a melody's list of settings, a row naming movement 7 opened the whole work and handed you eleven movements with nothing marking which.

  • One recording, one row

    When a favourite is the track the catalogue link points at, the link row wears the heart and the duplicate below it is dropped.

  • Today follows the nearer occasion

    The screen stayed on the last Sunday to have begun, which spent the back half of every week showing music for a service already sung. It now shows whichever occasion is nearest, past or future.

  • Long-press to copy on a movement screen

    The incipit, a citation, the work title, the details — and now the text in either language, or both interleaved.

Catalogue corrections
  • BWV 70, 146, 179 and 142 have their movement names

    All four reached the app as "Movement 1".."Movement N" with no type and no voice. Thirty-three movements are now transcribed by hand, with the source recorded on every row, which reaches the website, the Alfred workflow and the app in one run. BWV 142's titles had been scraped as whole paragraphs — incipit, English gloss and the prose describing the movement, 245 characters at movement 4.

  • Concerto movements say which cantata movement they became

    Bach reused individual concerto movements as cantata sinfonias and arias, and a work-level link hid which went where.

  • 350 movements still carry a placeholder name

    Down from 369, across 50 works that are placeholders end to end. They render as Aria 3 in italics, which is honest but thin — and, as above, it also costs those works their favourite badges. The remaining ones are the same job repeated.

The bundled catalogue roughly doubles, from 1.5 MB to 3.1 MB, almost all of it text. Recordings are still streamed rather than bundled. 91 automated checks run against the database before it ships, twelve of them new for the texts — one of which caught 286 texts claiming a line-by-line pairing they did not have.

Build 1

5 August 2026 First TestFlight

The first build put in anyone else's hands: browsing, the connections, and listening.

What it already did
  • Browse, search and follow the threads

    Today's anniversaries and church-year occasions, search by title or catalogue number, work to movement, and a chain-link icon on anything that shares a melody with something else. A melody's own screen lists every work that sets it.

  • Listening

    Around 1,500 synthesised renderings streamed with a queue and lock-screen controls, Apple Music links for 1,216 movements, and your own Apple Music favourites matched by catalogue number and playable in place.

  • Notes, corrections and the quiz

    Your own writing kept separately from the catalogue, so an app update never clears it; corrections applied as an overlay rather than an edit; and a quiz over the whole catalogue, including listening questions.