Dragging no longer selects text. The line box resizes, rests and spaces can be added, and Save PNG writes the row. Each chart keeps the foot at the top, and the treble staff shows the pitch with a notehead, stem, flags, and dots. Version 0.2.1.
Co-authored-by: catpersonisme <catpersonisme@gmail.com>
Drag Baroque charts onto a line, reorder them, set a duration, or remove a note. The AppImage no longer packages oemer, ONNX, or the models. Version 0.2.0.
Co-authored-by: catpersonisme <catpersonisme@gmail.com>
The foot and the double holes sit at the top of each narrow chart, and the mouthpiece sits at the bottom, matching hand-drawn tabs. Which holes are open or closed is unchanged. A repeat mark is shown only when the score repeats. Version 0.1.2.
Co-authored-by: catpersonisme <catpersonisme@gmail.com>
ONNX Runtime 1.30+ rejects pads [0, 0, -1, -1] on the unet checkpoint. The build now rewrites those nodes to pads [0, 0, 0, 0] and output_padding [1, 1], which keeps the same output size. Version 0.1.1.
The job builds with scripts/build-appimage.sh on an existing v* tag and uploads the AppImage as a release asset.
Co-authored-by: catpersonisme <catpersonisme@gmail.com>
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
## What it does
Recorder Tab Converter turns a lead melody into soprano recorder fingering tabs. The instrument is a soprano in C at concert pitch. Baroque (English) fingering is the default. A German toggle changes only F, F♯, and B♭.
Timing stays on the page: time signature, bar lines, rests, and each note’s duration. Every note shows a fingering diagram (thumb and holes), the note name, and the duration. A compact text tab is the secondary view. The note list is editable, so a bad read can be corrected and the tabs update.
Two public-domain samples render immediately: the first verse of Twinkle, Twinkle, Little Star, and the Ode to Joy theme in C major.
## How to run
The usual way to run it is one Linux AppImage. From a checkout:
```bash
./scripts/build-appimage.sh
chmod +x dist/Recorder-Tab-Converter-0.1.0.AppImage
./dist/Recorder-Tab-Converter-0.1.0.AppImage
```
If FUSE is missing:
```bash
APPIMAGE_EXTRACT_AND_RUN=1 ./dist/Recorder-Tab-Converter-0.1.0.AppImage
```
The build writes `dist/Recorder-Tab-Converter-0.1.0.AppImage`. On the machine that produced this branch, that file is `/workspace/dist/Recorder-Tab-Converter-0.1.0.AppImage` (467,138,256 bytes, about 446 MiB). The cap is 600MB. The binary is not committed.
That AppImage was started here. The window opened, the local page loaded, and the bundled reader reported oemer 0.1.8.
For browser development:
```bash
npm install
npm test
npm run dev
```
The dev server is http://127.0.0.1:3847. Photo reading uses `build/python` from the AppImage build via `OEMER_PYTHON`.
## Fingering source
Baroque fingerings are the first-choice rows on the [Dolmetsch Online chart for recorders in C](https://dolmetsch.com/textfingeringchart.htm) (Brian Blood). Low C is concert C5. The chart runs through D7 and includes forked F, half-holes, and the second-octave thumb pinch. Alternate fingerings on that page are omitted. Notes outside C5–D7 are flagged instead of guessed.
German mode changes three notes:
- F is Dolmetsch’s German fingering: thumb plus holes 1–4 (`0 123 4`).
- F♯ and B♭ follow the school German shapes in Zach VanderGraaff’s [Baroque vs German recorder](https://dynamicmusicroom.com/baroque-vs-german-recorder/) article.
- The octave above keeps those front holes and uses the Dolmetsch second-octave thumb. Every other note stays Baroque.
## Recognition limits
Reading is local oemer 0.1.8 on CPU ONNX Runtime. It is not the GPU package. It keeps one lead line: the first part, the top staff, and the highest note of a chord. It misses notes, especially on phone photos, dense piano scores, and handwriting. A failed read leaves the editor usable and does not invent a melody.
A real sheet-music photo was not transcribed while checking this build. Empty files, non-images, and a too-small PNG were rejected, and no notes were filled in.
<!-- CURSOR_AGENT_PR_BODY_END -->
<div><a href="https://cursor.com/agents/bc-6602f7d5-f1c1-53a9-8a48-a6b5bca61adc?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-6602f7d5-f1c1-53a9-8a48-a6b5bca61adc&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div>
The app turns a lead line into Baroque fingering tabs with rhythm kept, ships Twinkle and Ode to Joy, and reads photos locally with oemer when the bundled Python is present.
Co-authored-by: catpersonisme <catpersonisme@gmail.com>