Files
product-vamp/docs/composer/baseline_0e68f53.md
T
khodowany ef62af892b Cleanup
2026-10-04 22:29:06 -05:00

10 KiB
Raw Blame History

Complete-phrase solo rewrite

Starting revision: 68df7292ee85918a0cdbd0965139ccb2ceecb130. This revision replaces the active solo constructor. Source import, harmony, exact timing, typed expression validation, independent roles, guitar placement, notation, playback and atomic asset publication remain in use.

The selected direction is a new melody over the source changes, with optional head references. The source head no longer supplies a compulsory rhythmic prefix or protected initial hold. The four supplied solos remain outside production and unchanged; exact reproduction or listener preference is not claimed.

Construction and simplification

The normal path is production.generate_role → composer.compose → construction.Builder → rhythm.Rhythms/routes.Routes → scoring.evaluate → placement → validation → notation/export.

Each proposal chooses a phrase purpose, rhythm groups, direction, harmonic destination, arrival timing, sounding duration and optional treatment together. Complete pitch paths realize those choices. Open continuations need no chord-tone stop; settling, completion and handoff have actual destination contracts. Anticipations, approaches, enclosures, connections, colors, blues treatments and prepared suspensions enter before route selection and must validate as complete relationships.

An introduced realized phrase supplies the home idea. Development, answer, deliberate return and optional head reference are distinct reachable actions. A return protects a short heard rhythm and directional signature with harmonic adaptation; ordinary phrases have no compulsory three-note prefix. This signature is not a perceptual guarantee of recognition.

One versioned evaluator reports purpose, incoming continuity, contextual repetition and broad register costs. Physical travel selects fingering, not the winning tune. One-phrase lookahead averages normalized completed-phrase scores across variable durations; it remains a bounded heuristic, not a whole-chorus optimum. Route construction has its own explicitly separate heuristic.

The solo package decreases from 6,232 to 1,729 Python lines, and from 30 to 19 modules. Thirteen obsolete constructors/helpers were removed and two focused modules added. Old plan/draft/paraphrase API tests were retired; retained musical and representation contracts were migrated. Removed tests are not counted as passing tests. No legacy production fallback remains.

Inputs and data

The 21 scales, 2,954 sequence paths and 3,538 rhythm snippets remain intact. solo.json contains independently authored parameterized actions, nine atomic rhythm groups and migrated authored cells. grammar.json and melodic_vocabulary.json were retired after their consumers migrated. Accompaniment fields and resources were not changed.

References: build/all-of-me-solo-1.xml, all-of-me-solo-2.xml, autumn-leaves-solo-1.xml, autumn-leaves-solo-2.xml. Solo 1 maps to acoustic; Solo 2 to electric. The optional reader applies the confirmed guitar-written octave convention and preserves raw evidence. Autumn Leaves aligns at the first Gm7 in reference measure 2; its preceding measure remains in the comparison. Four Autumn electric reference events extend beyond the source-defined vocal allocation. Neither the target nor the vocal timing is changed to force equality.

All six strings remain available on frets 1–12 without open strings. Ties retain one sounding event and one position. No performance-expression changes were introduced. The existing independently generated accompaniment, electric melody and vocals are intentionally preserved by this solo rewrite.

Verification and review

The final Python command was the repository Python runner followed by -m unittest discover -s tests -p 'test_*.py': 435 tests passed in 218.783 seconds. During implementation, repeat-build tests caught profiling timings leaking into stable diagnostics. Timings now live only in the separate build profile; the final suite includes those repeat-build checks. Earlier interrupted/stale-import runs are not counted as passing verification.

The explicit dependency command passed all six roles on independently authored input: alone/cold, reverse/warm, parallel/cold, invalid optional targets present, targets removed, and after an electric-only setting change. Actual reads and canonical document hashes are retained. This synthetic test is not a whole-song quality assessment.

The optional transfer command passed all 18 role builds on evaluation-only four-bar excerpts from After You've Gone, Hindustan and Indiana. Their provenance remains under tests/evaluation_sources/. This demonstrates limited transfer; it does not establish arbitrary meter, form or chord support.

The comparison page includes full generated, previous and reference solo audio, common-backing mixes and opening excerpts. The same neutral renderer and constant comparison gains are used. Comparison reads happen only after generation. No ear-based audition or listener approval is claimed.

Evidence locations

build/solo_reference_comparison/ is the sole comparison location. previous/ retains the immediate pre-rewrite output and input hashes; generated/ contains the replacement. The complete operation/pruning trace and local/next-phrase evaluations are in the manifest. analysis/selected_phrases.md provides readable selected events, destinations, holds, expression evidence and alternative scores.

Remaining boundaries

The reference solos are outside-review examples, not a numerical loss. The replacement output remains new music, not those four scores. Counts and matching attacks do not establish greater musical quality.

The search retains a small frontier and limited lookahead. It can choose another complete phrase, but does not perform arbitrary two-sided revision of committed music. Some exact thematic returns may still sound too weak; the selected rhythm and contour contract is less strict than exact intervals. Acceptable candidates can share a zero musical penalty, leaving the stable role key to break ties.

Unsupported written harmony produces an explicit diagnostic. Optional expression rules do not repair ambiguous source chords or authorize arbitrary chromatic notes. Legal TAB and coarse tempo limits are not full biomechanical certification. The next useful listening check is the four complete comparisons: whether their openings establish memorable ideas and whether later returns remain recognizable through the freer continuations.

Published assets and measured cost

Full assets are published at build/build_x86_debug/generated_assets/; the four exported solos are in solo_xml/. All twelve musical role documents match between cold staged generation and cached publication. The eight non-solo documents are exactly equal to the preserved baseline. Every exported solo sounding event and TAB position matches the selected stream. All committed holds and typed harmonic contracts passed validation. All six source/reference file hashes are unchanged.

Solo New attacks Sounding MIDI range Occupancy
all_of_me/acoustic 117 47–67 0.781
all_of_me/electric 139 52–72 0.824
autumn_leaves/acoustic 153 47–67 0.859
autumn_leaves/electric 109 52–70 0.732

These descriptive measurements are not targets or proof of musical improvement. None of the four generated solos exactly matches its reference. All four normalized references have legal pitch/position paths within the existing guitar constraints; the Autumn electric vocal-allocation conflict remains explicit.

The native integration test ctest --test-dir build/build_x86_debug -R '^product_vamp$' --output-on-failure passed in 30.45 seconds, with required localhost access. The optional comparison adapter suite passed 8 tests in 0.018 seconds after the audio-directory update. All 36 comparison WAVs passed PCM clipping checks, and all 50 page links resolved. The signal review is not an ear-based audition.

The isolated final staged asset build took 107.15 seconds wall time, including 91.31 seconds in the performance-part stage. All twelve role caches missed. Two composition workers ran in separate processes; no tests or audition rendering overlapped. Engraving was warm and reused all six scores. The 27.57-second normal CMake publication reused all twelve role caches and six engraving results.

Cold solo role Role seconds Construction seconds Route seconds
all-of-me/electric_solo 40.82 26.27 21.47
all-of-me/acoustic_solo 44.38 29.96 24.90
autumn_leaves/electric_solo 35.56 33.09 28.31
autumn_leaves/acoustic_solo 44.04 41.71 35.80

Worker times overlap. Role time includes resource setup, notation and validation beyond construction. Route time is included in construction, not an additional cost. Hardware/process evidence: 12 logical CPUs, Linux x86-64, repository Python 3.13; build-profile.json contains actual reads, worker settings and stage times. The first worker use still spends time loading the full catalogs. Route search remains the dominant construction cost.

An isolated one-process All of Me acoustic build took 39.80 seconds without cProfile. The diagnostic run before the performance-only optimization took 163.09 seconds with cProfile enabled, so those times are not a valid speedup ratio. Profiling exposed repeated pitch hashing/stringification and harmony lookups. Memoization and hoisted identical calculations preserved the complete musical document hash 2b6b35011e353d166d287a8bfff6074723e62559b5e64ff978084623e1520e67, also matching final production. The rewrite changes music and search structure; its timing is not presented as a semantics-preserving speedup over the old composer.

Cleanup removed 151.2 MiB of superseded comparison audio, stages, probes and temporary rendering tones during this rewrite. The immediate baseline, four user references, build toolchains, caches, published assets and useful verification evidence remain. Current audio is consolidated under audio/ and linked from one index.html; cleanup.json records removed paths.