Previously, negative amplitudes were clamped to zero.
Now, they are allowed to range from -ALMOST_ONE to +ALMOST_ONE.
This is useful in certain circumstances, such as using synthio
to create CV-like outputs that can be positive or negative, by
using the amplitude property of the note.
In #8639 Dan noticed that weblate was still offering "%S" as a string
to translate. I don't understand why this occurs, because the string
is no longer in circuitpython.pot; so weblate should move it to the
"fuzzy" section of the .po files when it synchronizes them.
I also noticed that the "%02X" string should never be localized and
moved it to synthetic.pot.
After making that change, I ran "make translate" followed by
"make msgmerge"; normally we rely on weblate running this step, but for
whatever reason this is not the case this time.
This change looks bigger than it really is because msgmerge totally
re-ordered the "fuzzy messages" section of each po file.
After this, I will force reset weblate back to match our main branch again
and re-open translations on weblate.
When a frozen module was added or updated, a build error would occur
during CI: `KeyError: 'FROZEN_MPY_DIRS'`.
In e40abda1bc I decided that it should be an error if all the expected
keys were not defined in the board settings dict. I made this change
and all seemed to be well; however, my testing did not exercise the
case that a frozen module was changed.
It turns out that FROZEN_MPY_DIRS was not being set in the board settings
dict because the output of print-FROZEN_MPY_DIRS was "FROZEN_MPY_DIRS ="
(which does not match the regular expression) instead of
"FROZEN_MPY_DIRS = " (with a trailing space).
This change fixes the problem by ensuring that an undefined or empty
variable still prints with a space character after the equal character.
Tested by running locally:
```
python3 -c 'import shared_bindings_matrix; print(shared_bindings_matrix.get_settings_from_makefile("ports/atmel-samd", "trinket_m0")["FROZEN_MPY_DIRS"])'
```
(prints a blank line, expected)
as well as simulating a change to the asyncio frozen submodule:
```
python3 -c 'import shared_bindings_matrix; print(shared_bindings_matrix.get_settings_from_makefile("ports/atmel-samd", "trinket_m0")["FROZEN_MPY_DIRS"])'
```
(which will build the elecfreaks_picoed board)