Releases: GMBermeo/ponticello
Release list
1.7.0: Chords for your cello, chord charts that scroll, and a lighter, brighter look
Ponticello has been about reading a melody. This release adds the other half of playing: chords. There is now an atlas of chord shapes worked out for the cello's own tuning, chord charts that roll along under you while you play, a builder for your own progressions, and a refreshed look with a light and two dark themes.
Highlights
- Chord atlas. A new Chords screen lists chords for a chosen tonic and scale (major, natural, harmonic and melodic minor, dorian, mixolydian, lydian, or all twelve roots), filtered to triads, sevenths or extensions. Tap a chord to see its shapes and inversions drawn on the cello's fingerboard, or as an arpeggio when there is no comfortable grip. The shapes come from a generated catalogue of 106 chord types and 1,272 voicings for the cello's C–G–D–A tuning.
- Tape colours on chord shapes. Chord fingerings can be drawn in the colours of your own tapes, so a shape reads the same way your fingerboard does. It can be switched off.
- Chord charts that scroll. Songs can now come as a chord chart: lyrics with the chords above them, shown either as chord names or as cello shapes. The chart scrolls with the song, showing the current and the next chord and previewing the fingering of what is coming, with an adjustable auto-roll speed and a link out to the song on Spotify.
- Your own progressions. Create chord progression, on the library screen, starts from a preset (such as the pop axis, I – V – vi – IV) or from nothing. Choose a key and a scale, arrange chords in labelled phrases, drag them between rows, set the tempo and beats per chord, save the result, and share it. The working draft saves itself.
- A new home screen. The library screen is rebuilt, with a Chords category alongside All, Studies, Songs and Imported, and Practice, Tuner, Chords and Import together at the top.
- Light and dark themes. The app is no longer paper-only. Choose light, the deep-navy Quiet theme, or the darker Neon theme from the library screen; the status bar follows. The whole palette moves to a brighter blue, and the seven note colours are retuned to match, in light and dark versions of the same hues.
- Roomier on the web. In a desktop browser the app now runs full screen and reflows to fit. A floating button (or the
fkey) switches to the Fold 5 preview frame to see the layout as it lands on the device.
Under the hood
- New pure-TypeScript chord layer:
celloChords,chordScales,chordSheet(timeline, scroll position and line layout),chordProparsing andcustomProgression. Nothing in it touches React Native. - New tooling:
npm run build:chordsregenerates the shape catalogue,npm run import:chordsimports chord charts from a personal_CHORDS/folder, andnpm run study:chordsopens a browser page for comparing shapes. - Chord charts follow the library edition.
build:librarywriteschordSheets.generated.jsonfrom the bundled base charts (1) in the free edition, and adds any charts from_CHORDS/(463) in the full edition._CHORDS/is git-ignored. parseScaleKeyturns key names such asDm,F#mandEb minorinto a tonic, mode and scale.- The arranger's Ollama host and model are now configurable (
OLLAMA_HOST,OLLAMA_MODEL) rather than hard-coded. - Version 1.7.0, build 10. Tests: 1,533 passing on the full edition, 1,030 on the free edition (which skips the library-size checks).
Full Changelog: 1.6.0...1.7.0
1.6.0: Fingerings that make sense, a colour for every note, and a practice record
The app used to decide where your hand goes one note at a time. It now reads the whole passage before choosing, which is the difference between a fingering you can play and one that asks you to jump between half and first position between two quavers. Every note also has a colour now, the accompaniment sounds like it was played rather than generated, and the app keeps a record of how much you practise.
Highlights
- Fingerings are chosen for the phrase, not the note. Where your hand goes is now decided by reading the whole line at once. The old mapping answered every semitone above the nut with half position regardless of context, so a passage sitting comfortably in third position was written as a scramble in and out of half position. Across the full library the hand now moves 0.9 times per hundred notes instead of 11.5, and Clair de Lune went from 240 hand movements to 4.
- The neck is used, not just first position. Second, third and fourth position now carry 12.5 % of the library between them (6.3 / 5.2 / 1.0), and half position has all but vanished (0.2 %). Nothing leaves the neck. An open string is still always taken as an open string — it is the one note a player with tapes can be certain of.
- A colour for every note. One constant, seven colours: C green, D blue, E orange, F cyan, G red, A yellow, B purple. Sharps and flats take both neighbours as a split disc. The four open strings keep their colour everywhere — string rails, noteheads and the new chart all read from the same place.
- Cello Fingerboard Chart. Every note from the open string to the octave, on all four strings, drawn to scale over your own tapes, with the colour key, the open strings, first position string by string, and the seven scales in colour.
- The same note, shown wherever else it lives. When a note is played, the other places in the neck it could have been taken are ringed on the fingerboard — in the tape's colour where there is a tape, otherwise in the note's own colour. The fingering is chosen for you; this shows you what it chose between.
- The accompaniment sounds played. Voices now open up as a note is played harder rather than just getting louder, bowed and blown parts have vibrato that waits before it starts, strings and piano have a detuned second copy, there is bow noise under the attack, and no two notes come out identical.
- Your practice, kept on the phone. A new Practice screen: total time, this week, the last thirty days, current and longest streak, and a contribution-style grid of the last six months. Counted only while the music is actually running. It goes nowhere.
Fixes
- The string letters under the fingerboard panel line up with the strings again — they were a gutter's width to the left.
- On the Score view the tuner sits along the bottom instead of covering the clef, the key signature and the first bar.
- The first press of play says Loading… and refuses a second press while the accompaniment is being prepared, instead of appearing to do nothing.
- The fingerboard panel fills the height it has, so a first-position piece shows the whole tape ladder rather than four tapes stretched over the screen.
- A new preference hides the view and sound switchers while the music runs, and brings them back when you pause.
Under the hood
- New
seatLine— one sequence-aware seating used by every path that turns notes into a cello line: the bundled library, imported MIDI, the arranged levels, the part picker and both build tools. The arranger's own difficulty gate now measures the fingering it actually ships. - The play screen's transport object no longer changes identity when you press play, so the fingerboard, all three visions and the top bar stop re-rendering at the moment the frame budget matters most. The fingerboard's still layers are memoised apart from the two markers that move per note, and the bar lookup is a binary search instead of a scan.
- Expression lives in
voices.tsand is shared by the native renderer and the web scheduler, so both platforms sound the same. Vibrato is applied as a phase offset so a note split across a render slice rejoins exactly. - Tapes: nine of them, from the whole step above the nut down to the neck heel, with no half position and no separate thumb set. Stored tapes from the old layout are replaced rather than half-merged.
- Version 1.6.0, build 9. 1,456 tests passing.
1.5.0: Audio-locked playback, tuner-only microphone, blue theme
Notes now stay on the beat for the whole song, dense MIDI arrangements play without stutter, the part picker works, and the microphone is a tuner again. This release also comes in two editions.
Highlights
- Playback stays in sync. The note clock is now computed from elapsed time instead of by adding up frames, and it re-locks to the audio's real position four times a second. On 120 Hz screens a late or skipped frame no longer shifts the notes, and the slow note-by-note desync is gone. In testing, the picture stayed within about 10 ms of the audio.
- No stutter on dense tracks. Pieces like Les Misérables (15 instrument parts) now play at most 32 voices at once, keeping the loudest. The play screen no longer redraws itself on every note, and new notes are laid out twice a second instead of each time one appears.
- Tuner, not live intonation. The microphone is off while music plays. When you pause, a horizontal tuner appears across the top of the play area. The "Listen to me while playing" setting has been removed.
- New blue look. The accent colours are now a minimal blue family (#165788, #274490, #1D2D5C, #1E3765), with a navy Quiet theme for practice.
Fixes
- Opening a practice session no longer crashes with "Maximum update depth exceeded".
- Choosing a song part ("Play as your cello line") now applies, and the octave control appears so you can move the part up or down.
- The bundled library is back: 297 pieces in the full edition, with the library list generated together with the songs.
Under the hood
- New
transportClockmodule with drift-correction tests (10 minutes of jittery 120 Hz frames, 20 minutes of clock drift plus loop gaps). - Voice stealing in the backing program, with tests on a 15-part texture.
npm run release:fullandnpm run release:freebuild each edition's APK with an explicit file name.- Version 1.5.0, build 7. 1,285 tests passing.
Version 1.4.1
This release introduces key-aware fingerboard overlays for visual improvisation and song preparation, alongside a major overhaul of the MIDI arrangement pipeline and audio synthesis engine across all 258 catalogue pieces.
What's New
1. Key-Aware Fingerboard Overlays & Improvisation Mode
- Live Key Detection: Pure Krumhansl–Schmuckler tonal key analysis automatically identifies the song's musical key from its written notes.
- Faint Fingerboard Note Guides: The fingerboard now highlights stopping positions across all four strings with subtle, non-intrusive markers and distinct tonic rings.
- Top-Bar
[KEY | SONG]Switcher:KEY(default): Displays all diatonic scale degrees of the piece’s key across the cello—ideal for improvising, exploring positions, and internalizing the key shape.SONG: Reveals every pitch class actually used in that specific piece, letting you map out hand shifts before the bow moves.
- Available on both wide landscape layouts and compact/portrait views.
2. Overhauled MIDI & Arrangement Architecture
- Salience-Based Multi-Level Arranging: Central riff- and theme-first arranger shared by user imports, converter scripts, and the bundled library.
- 4 Playable Arrangement Levels: All 258 MIDI catalogue pieces derive consistent arrangements on the fly:
- Beginner (Easy): First-position compass, ~2.5 notes/sec.
- Intermediate (Practice): Moderate register up to A4, ~4 notes/sec.
- Advanced (Adv): Upper positions up to E5, ~6 notes/sec.
- Expert (Full): Complete authored solo line up to A5.
- Sound Matches the Screen: Cello audio synthesis is now derived directly from the displayed adapted score at the selected difficulty level.
3. Audio Engine & Transport Polish
- Click-Free ADSR Envelopes: Shared unit-agnostic envelopes eliminate boundary clicks during voice transitions and loops.
- True Gapless Looping: Native 22.05 kHz slice rendering and Web Audio lookahead scheduling ensure playback and loop points stay locked to the visual playhead without drift.
- Transport Latency Compensation: Transport start/restart waits for native audio seeks and Web Audio scheduling before advancing the score playhead.
- Intelligent Backing Fallbacks: Fixed accompaniments take precedence and hide redundant controls, while unsupported MIDI high notes are shifted by full octaves to preserve melodic contours.
Version 1.3.0
chore: add icons and fix mid playback
Version 1.2.0
Added
- Central
firstPositionFingeringmapping insrc/domain/fingering.tswith 100% playable note coverage. - Domain modules and test suites for score engraving (
engrave.ts), melody analysis (melody.ts), and practice loops (loop.ts). tsconfig.strict.jsonwith strict indexed access checks for domain logic.- EAS build profiles and scripts for iOS (
npm run ipa,npm run ipa:simulator). - Automated octave-shift heuristics and note folding report in
tools/build-library.ts.
Changed
- Refactored
useBackingPlayer.native.tswith generation counters to prevent overlapping audio loops. - Chained backing playback start onto
seekTo(offset)to ensure zero loop drift. - Enabled TypeScript strict flags project-wide (
noUnusedLocals,noImplicitOverride,noFallthroughCasesInSwitch). - Made MIDI parser
u8()total to avoidNaNpropagation on truncated input. - Bounced Android release version to
1.2.0(versionCode3).
Fixed
- Fixed bug where rapidly changing accompaniment settings caused layered audio playback on native.
- Removed dead imports and redundant fingering template code across library generators.
- Resolved potential
undefinedarray access issues across all domain calculations.
Version 1.1.0
- Offline Songs Adapted to Cello 1st Position:
- Every song from _MIDIS adapted strictly to the Cello First Position range (
$C_2$ to$E\flat_4$ ) across strings C, G, D, and A. - Rich multi-track backing accompaniments (bass, percussion/rhythm, keys, guitar, strings) bundled for offline playback.
- Training Exercise Accompaniments:
- Dedicated rhythm, chord, and bass backing tracks for all 5 core training studies in
src/scores/studies.ts.
- Library Search & Navigation Tabs:
- Interactive search bar with instant filtering by title, artist, key, and origin.
- ALL tab showing all pieces without difficulty segregation, alongside STUDIES, SONGS, and IMPORTED tabs.
- Digital Tuner Engine Smoothing:
- 1-second rolling window median filter with harmonic octave jump rejection, 450ms bow-stroke hold time, and needle damping.