Model:
models/lyria-realtime-exp
over the Live Music API (
api_version=“v1alpha”
) SDK:
google-genai
2.26.0, Python 3.12, macOS Date observed: 2026-10-01
Summary
In
LiveMusicGenerationConfig
, setting
scale=Scale.E_FLAT_MAJOR_C_MINOR
produces PCM output that is byte-for-byte identical to
scale=Scale.SCALE_UNSPECIFIED
, with the same prompt, seed and other settings. The other 11 scale values all change the output and pull its pitch content into their sets.
Steps to reproduce
Open two sessions with the same weighted prompt and the same config (
bpm=120
,
density=0.35
,
brightness=0.45
,
guidance=4.0
,
seed=7
). The only difference is
scale
:
E_FLAT_MAJOR_C_MINOR
in one,
SCALE_UNSPECIFIED
in the other.
play()
, collect 32 s of PCM from each, and compare SHA-256 hashes.
repro_lyria_eflat.py
does exactly this, and adds an
A_MAJOR_G_FLAT_MINOR
control that does change the output (in our run:
def7978f079db355
).
Expected
The
E_FLAT_MAJOR_C_MINOR
take differs from the unspecified take, and its pitch content stays within Eb F G Ab Bb C D.
Actual
The two takes are identical, in 5 of 5 same-prompt, same-seed pairs:
| Prompt | Seed | SHA-256 (first 16), | E_FLAT_MAJOR_C_MINOR | SHA-256 (first 16), | SCALE_UNSPECIFIED |
|---|---|---|---|---|---|
| dark, orchestral | 20261001 | 861fded2e524131d | 861fded2e524131d | ||
| dark, orchestral | 7 | da4347e4b65299ea | da4347e4b65299ea | ||
| dark, orchestral | 42 | 1e9cb76d67f52259 | 1e9cb76d67f52259 | ||
| bright, major-key | 20261001 | a00d5f2da2f543a0 | a00d5f2da2f543a0 | ||
| short string prompt ( | repro_lyria_eflat.py | ) | 7 | 53461a4a9cfc3eb2 | 53461a4a9cfc3eb2 |
In the bright-prompt pair, the unspecified take is closest to Bb major and contains A naturals, which an Eb major / C minor constraint would remove. So the value is not just coinciding with the model’s own pick.
The other values work
Bright prompt, seed 20261001, one 32 s take per value. The table gives the share of chroma energy inside each value’s own 7 notes, against the unspecified take’s share inside those same notes:
| Value | Changed output? | In own set | Unspecified, same set |
|---|---|---|---|
| C_MAJOR_A_MINOR | yes | 82.7% | 60.0% |
| D_FLAT_MAJOR_B_FLAT_MINOR | yes | 81.0% | 68.3% |
| D_MAJOR_B_MINOR | yes | 82.8% | 40.8% |
| E_FLAT_MAJOR_C_MINOR | no (identical) | 76.4% | 76.4% |
| E_MAJOR_D_FLAT_MINOR | yes | 79.2% | 32.5% |
| F_MAJOR_D_MINOR | yes | 80.2% | 76.2% |
| G_FLAT_MAJOR_E_FLAT_MINOR | yes | 82.6% | 51.8% |
| G_MAJOR_E_MINOR | yes | 82.0% | 56.7% |
| A_FLAT_MAJOR_F_MINOR | yes | 76.2% | 73.2% |
| A_MAJOR_G_FLAT_MINOR | yes | 80.8% | 36.1% |
| B_FLAT_MAJOR_G_MINOR | yes | 77.2% | 77.6% |
| B_MAJOR_A_FLAT_MINOR | yes | 81.1% | 50.4% |
The SDK serialises the value correctly. The config JSON contains
“scale”: “E_FLAT_MAJOR_C_MINOR”
.
Impact
Nothing can be pinned to the Eb major / C minor pitch set, which also covers F Dorian, G Phrygian, Ab Lydian, Bb Mixolydian and D Locrian. The only workaround is to transpose.