Beast version 0.15.0 is released.
Beast is a Free Software (LGPLv2+) music synthesizer and audio composer.
It provides a #MIDI #sequencer, unlimited undo, real-time #synthesis,
support for Linux #Audio Plugins (#LADSPA), Soundfont 2/3, WAV, AIFF,
Vorbis, Gus Patch, FLAC and MP3 files, 32bit audio rendering, full
duplex support, multi-core audio rendering and SIMD utilisation.
The source code is available via Git, the tarball and AppImage are here:
https://beast.testbit.org/#downloads
After downloading and making the Beast AppImage executable, it can
run on any Ubuntu-18.04 or Fedora-28 compatible Linux system.
The new experimental ebeast UI can be started with:
./beast-0.15.0.x64.AppImage --ebeast
The release NEWS and shortlog are appended.
----
## Beast 0.15.0: (2019-11-05)
#### System Requirements
* Linux - Ubuntu 18.04 or Fedora-28 are needed to run the Beast AppImage.
#### User Interface EBEAST
* Added Beast HTTP manual popup window.
* Added scrollable track view.
* Integrated material-icons and fork-awesome sprites.
* Added popup menus, modal dialog and preferences.
* Added proper command line argument handling to ebeast.
* Tracks now have a context menu with various editing functions.
* Support secondary UI via URL with auth-cookie.
* Support UI rendering in Firefox 68.
* Added song position pointer with realtime updates.
* Added bpm and song position counter display with realtime updates.
* Added focus handling for piano roll notes.
* Started file system selector for instrument assignments.
* Added user interface for manual PCM/MIDI driver selection.
#### Synthesis Changes
* Added support for separate fluidsynth instances per track. #102 [stw]
* Rewrote PCM driver integration and selection.
* Added optional PCM driver support for Jack. #128 [stw]
#### Jsonipc
* A dedicated Rapidjson based IPC layer was developed to move the synthesis
engine out of the UI process (Electron based). This solved several major
stability issues and also allowes use of Firefox for UI rendering.
* Added Json based IPC layer between Javascript and C++17.
* Moved Electron <-> Bse communication to Websocket-based IPC.
* Moved BSE sound engine functionality into a separate executable
BeastSoundEngine with async Javascript bindings.
* Added a Websocket binary message bridge for realtime monitoring of
shared memory region changes.
#### Upgrades
* Integrated Rapidjson 20190628 (> v1.1.0).
* Upgraded to Electron 6.0.11
* Upgraded babel to 7.6.2.
* Upgraded node-sass to 4.12.
* Managed to eliminate jQuery dependency.
* Depend on fluidsynth to 2.0.5. #108 [stw]
* The v8pp binding was superceeded by Jsonipc.
* Depend on pandoc >= 2.
* Depend on clang++-6 and g++-8.3.0 for full C++17 support.
* Updated CI builds to use Fedora-28.
#### Other Changes
* Modernized several property implementations. [stw] #109 #110 #112 #114 #115 #116 #117
#118
* Rewrote Vue data dependency integration for async Javascript calls.
* Several code areas got modernized, making use of C++ >= 11.
* Support proper versioning information even from Github ZIP files.
* Added PDF generation for the BSE API reference manual.
* Resampler cleanups. #121 [stw]
* Added new XML serialzation infrastructure (defaults to OFF, MVP roadmap goal).
* Added ZIP storage for BSE files (defaults to OFF, MVP roadmap goal).
* Added infrastructure for stereo device/effect chains (still disabled, MVP roadmap
goal).
Stefan Westerfeld (86):
BSE: Jack: some minor fixes as requested in review
BSE: Jack: add list with possible improvements from PR#31.
BSE: Driver: return read and write latency for a pcm driver separately
BSE: bsemain.cc: block SIGPIPE to avoid crashes when jackd dies
DOCS: add minimal jack howto
BSE: Jack: initial version of Jack driver using the new driver API
BUILD: require jack
BSE: Resampler2: fix compilation with clang
config-uname.mk: fix x86_64 specific build flags
BSE: Resampler2: mark impl classes as final
TESTS: testresampler: improve accuracy test coverage as slow test
TESTS: testresampler: make perf test more reliable for small block sizes
TESTS: testresampler: re-enable standalone tests via suite1
TESTS: testresampler: use AlignedArray instead of F4Vector for alignment
TESTS: adapt Resampler2 tests (namespace, enums)
BSE: Resampler2: namespace/enum cleanups
BSE: Resampler2: merge bseresamplerimpl.hh into bseresampler.cc
TESTS: testresampler: avoid including bse/bseresamplerimpl.hh
BSE: Resampler2: remove Resampler2::create
TESTS: get rid of Resampler2::create
BSE: Resampler2: improve C++ API to get rid of Resampler2::create
BSE: Resampler2: small performance optimization for downsampler
TOOLS: bsewavetool: remove unused resampler include
TESTS: testresampler: re-enable tests for both: SSE and FPU Resampler
TESTS: resamplehandle: test both: SSE/FPU version for delay compensation
TESTS: testresamplerq: re-enable SSE tests (and still do FPU tests)
BSE: Resampler2: properly support SSE again
TESTS: no longer rely on block utils to create Resampler2 implementation
BSE: no longer rely on block utils to create Resampler2 implementation
TESTS: resamplehandle: remove Resampler C API test
BSE: Resampler: remove C API
BSE: Part::n_channels: port property to C++
BEAST-GTK: use Part::last_tick C++ property
BSE: Part::last_tick: port property to C++
BSE: add Resampler2 function to reset state
BEAST-GTK: bstapp: use Server::wave_file C++ property
BSE: Server::wave_file: port property to C++
BEAST-GTK: bstusermessage: use Server::log_messages C++ property
BSE: Server::log_messages: port property to C++
BSE: Super: remove copyright property
BSE: Super: port author/license properties to C++
BSE: bseitem: allow APPLY_IDL_PROPERTY for Strings and other types
BEAST-GTK: bsttreestores: use seqid C++ property
BSE: Item::seqid: port property to C++
BEAST-GTK: use Project::dirty C++ property
BSE: Project::dirty: port property to C++
BEAST-GTK: bstcanvassource.cc: use Source pos_x/pos_y C++ property
BSE: Source::pos_x/pos_y: port properties to C++
BSE: MidiSynth: store volume_factor in impl class
BSE: MidiSynth::volume_perc: port property to C++
BSE: MidiSynth::volume_dB: port property to C++
BSE: MidiSynth::volume_f: port property to C++
BSE: MidiSynth::n_voices: port property to C++
BSE: MidiSynth::midi_channel: port property to C++
BSE: PcmOutput: properly update volume for engine module
BSE: Song: fix access to C++ Track::muted property
BEAST-GTK: bsttrackview: port track view notifications for C++ properties
BEAST-GTK: bsttrackview: use n_voices C++ property
BSE: Track::n_voices: port property to C++
BEAST-GTK: bsttrackview: use midi_channel C++ property
BSE: Track::midi_channel: port property to C++
BEAST-GTK: bsttrackview: use muted C++ property
BSE: Track::muted: port property to C++
BSE: SF2: use fluid_synth_process() instead of deprecated function
config-checks.mk: require the latest fluidsynth version, 2.0.5
BEAST-GTK: bstbuseditor: refactor aida property / pspec code
BSE: Song: port remaining Bus::master-output set calls
BSE: Bus::master_output: port property to C++
BEAST-GTK: bstbuseditor: use right_volume C++ property
BSE: Bus::right_volume: port property to C++
BEAST-GTK: bstbuseditor: use left_volume C++ property
BSE: Bus::left_volume: port property to C++
BSE: Bus::sync: port property to C++
BSE: Bus::solo: port property to C++
BEAST-GTK: bstbuseditor: support both, aida and old style properties
BSE: Bus::mute: port property to C++
BSE: SF2: avoid global using std::string
BSE: SF2: disable automated locks that protect all fluid synth API calls
BSE: SF2: cleanup sound sont repo code
BSE: SF2: don't reload the soundfont every time the user presses play
BSE: SF2: update documentation block.
BSE: SF2: cleanup: fix leak, remove debugging output
BSE: SF2: use module data free function
BSE: SF2: remove unused mutex
BSE: SF2: clean up old unused code
BSE: SF2: use one fluid_synth_t per track
Tim Janik (622):
NEWS.md: update NEWS for 0.15
PO: updates for 'make dist'
MISC: Makefile.mk: release-commits: check for master branch
BSE: bseproject.cc: require BSE_FEATURE=xml-project for ZIP bse files
BSE: bcore: add feature_check() for $BSE_FEATURE to toggle features
BSE: bseproject.cc: xml_serialize() child tracks
BSE: bsetrack: xml_serialize() child devices
BSE: device: xml_serialize() the device type and child modules
BSE: module: xml_serialize() the module type
EBEAST: provide 'EQ' shorthand to compare objects
EBEAST: b/deviceeditor.vue: show module id
EBEAST: b/devicepanel.vue: show device id
EBEAST: b/track-view.vue: update the current track on clicks
EBEAST: b/projectshell.vue: add todo about treechange changes
BSE: object.hh: whitespace fixups
BSE: bsesong.hh: add SongImplP
EBEAST: utilities.js: equals_recursively: compare OwnProperties and prototype
BSE: object, bseobject: move xml_serialize, xml_reflink to ObjectImpl
BSE: bseproject: add xml_serialize() and xml_reflink()
BSE: bseproject: store project.xml in bse files via SerializableInterface
BSE: bseobject: implement xml_serialize(), xml_reflink()
BSE: serializable.hh: add Bse::SerializableInterface, Bse::SerializationNode
BSE: bseproject: use zip_storage per-project and fix multi-imports
BSE: bseproject.cc: load SCM files from ZIP vis Bse::Storage
BSE: bseproject.cc: save .bse files as ZIP
BSE: beast-sound-engine.hh: remove special casing for non-ObjectIface roots
BSE: split BeastSoundEngine into 5 compilation units to speed up -j builds
config-uname.mk: allow *.o compilation from generated *.c or *.cc
AIDACC: JsonipcStub.py: allow -G nblocks=<int> to split output into sections
EBEAST: b/deviceeditor.vue: add component with module list
BSE: implement module listing and creation
EBEAST: b/devicepanel.vue: show a device panel for the current track
EBEAST: b/projectshell.vue: keep track of the `current_track`
BSE: implement device listing and creation
BSE: bseapi.idl: add Track API stubs for Device creation
BSE: bseapi.idl: add Device API stubs for Module creation
BSE: add interface Device stub
BSE: add interface Module stub
BSE: beast-sound-engine.cc: use FOREACH_IFACE_SEQ() to work around handle seq
AIDACC: CxxStub.py: generate a *_FOREACH_IFACE_SEQ() macro
BSE: bseapi.idl: derive interface DeviceCrawler from Object
BSE: move properties and event emission from LegacyObject to Object
BSE: introduce 'interface Object' as base for 'interface
LegacyObject'
BSE: introduce 'interface Object' as pure C++ base type
BSE: rename 'interface Object' to 'interface LegacyObject'
EBEAST: b/track-view.vue: implement 'delete-track'
EBEAST: b/track-view.vue: implement 'add-track'
BSE: bseapi.idl: implement Song.list_tracks()
BSE: bseapi.idl: default to 1 voice per track, limit to 64
BEAST-GTK: bstfiledialog.cc: pass project into store_bse()
BSE: bseapi.idl: derive ContextMerger from Container
EBEAST: b/projectshell.vue: use v-show for panel2 items
EBEAST: b/projectshell.vue: make room for an alternative panel on
'Backquote'
EBEAST: b/treeselector-item.vue: adjust arrow key matching
EBEAST: utilities.js: add remove_hotkey/add_hotkey
EBEAST: utilities.js: add keyboard_map_name()
EBEAST: use KeyboardEvent.code to match hotkeys outside of INPUT fields
MISC: Dockerfile-yum: provide unzip, required to unpack 3rd party libs
BSE: path.cc: purify code to avoid g++-8 warnings
MISC: Dockerfile-cibuild: provide unzip, required to unpack 3rd party libs
BSE: serializable.hh: fix macro guards
JSONIPC: jsonipc.hh: always use `static inline` except where ODR applies
JSONIPC: jsonipc.hh: avoid linker emission of static class variables
BSE: bseapi.idl: fix Const and comment placements
BSE: beast-sound-engine.cc: fix unintended fallthrough for json numbers in Any
BEAST-GTK: bstfiledialog.cc: fix NULL object reference
EBEAST: menus.js: fix error constant checks against promise
EBEAST: b/projectshell.vue: show error dialog if open fails
TOOLS: magictest.cc: remove test magic for .bse file types
TOOLS: bsetool.cc: support -h and --help
BSE: storage: add has_file() and move_to_temporary()
BSE: path: add Path::split_extension()
BSE: storage: use FileMagic to identify ZIP/SCM files
BSE: storage.cc: implemenmt import_from()
BSE: storage: add API to read files from container
BSE: storage.cc: implement export_as()
BSE: storage: add API to store files in container
BSE: bsestorage.cc: shorten temporary storage-blob filename
BSE: bsestorage: use beastbse_cachedir_current() for temporary files
EBEAST: app.html: after startup, purge_stale_cachedirs()
BEAST-GTK: bstmain.cc: at startup, purge_stale_cachedirs()
BSE: bseapi.idl: add Server.purge_stale_cachedirs()
BSE: bsestorage: add beastbse_cachedir_current()
BSE: bsemain.cc: limit after-quit event loop processing
BSE: beast-sound-engine.cc: correctly stop server and websocket connections
BSE: beast-sound-engine.cc: keep track of opened websocket connections
BSE: storage: add beastbse_cachedir_create() and beastbse_cachedir_cleanup()
BSE: sfistore: remove unused functions
BSE: minizip: integrate ZIP functionality from minizip-2.9.0
BSE: Makefile.mk: fetch ZIP sources from minizip-2.9.0
BSE: integrity.cc: sort integrity tests by function name
config-uname.mk: MODE=debug: add -gdwarf-4 for variable tracking
BSE: remove now unused serialize.cc, serialize.hh
TESTS: checkserialize.cc: move to testing Xms::SerializableInterface
BSE: bsemain.cc: parse and store bserc.xml via Xms::SerializableInterface
BSE: serializable: add Xms::SerializableInterface, Xms::SerializationNode
BSE: bseapi.idl: renumber Bse::Error
DOCS: Makefile.mk: build doc/bse-api.pdf with doxygen and latex
DOCS: refman.patch: fix font, sizing, vertical spacing, link colors, page numbering
DOCS: doxygen.cfg: customize for latex & PDF generation
DOCS: extrastyles.css: fix member list table formatting
BSE: cxxaux.hh: remove bogus docu group
AIDACC: CxxStub.py: add DOXYGEN infos about interface <- Iface <- Impl
BSE: magic: rename from gslmagic.*
BSE: port Magic matching to modern C++
TOOLS: magictest.cc: print Bse::FileMagic matches and find .bse files
BSE: bseloader.cc: register magic specs as Bse::FileMagic
BSE: gslmagic: add Bse::FileMagic implementation in C++
BSE: path: support maxlen for stringread() and memread()
EBEAST: app.html: provide console inside Vue component handlers
EBEAST: main.js: provide webContents with printout() and printerr()
EBEAST: app.html: allow UI script before loading command line files
EBEAST: b/fed-object.vue: allow CSS styling by field name
EBEAST: support --norc -p <driver> and -m <driver> command line args
Makefile.mk: help: mention config-defaults.mk for CXXFLAGS
EBEAST: package.json.in: upgrade electron to 6.0.11
EBEAST: package.json.in: upgrade babel to 7.6.2
EBEAST: remove jQuery (now unused)
EBEAST: package.json.in: upgrade node-sass to 4.12
EBEAST: window.html: remove unused file
EBEAST: b/preferencesdialog.vue: speed up feedback for invalid/locked settings
BSE: bsemain.cc: fix stale config values and refuse to change locked config
EBEAST: b/playcontrols.vue: use "Space" to toggle playback and 'S'
for stop
EBEAST: b/modaldialog.vue: use hflex for header and footer
EBEAST: b/contextmenu.vue: support tieclass, to a tie a class during popup
EBEAST: utilities.js: add clear_keyboard_click()
EBEAST: b/flex.vue: turn hflex and vflex into functional components
EBEAST: b/fed-picklist.vue: fix focus flicker for clicks on inactive elements
EBEAST: utilities.js: add is_nav_input() and refine arrow key focus
EBEAST: automatically support buttons clicks though a data-hotkey attribute
EBEAST: b/button.vue: turn b-button into a functional component
EBEAST: b/hotkeys.js: remove jQuery based hotkey handling
EBEAST: utilities.js: move navigation_keys to inner scope
EBEAST: utilities.js: fix focus handling at startup without last_focus set
EBEAST: utilities.js: add LINEFEED as KeyCode
EBEAST: utilities.js: add join_classes() helper
EBEAST: b/treeselector.vue: remove unused table styling
EBEAST: b/aboutdialog.vue: use grid for layout
EBEAST: b/piano-roll.vue: fix keydown handler on b-flex
EBEAST: variables.scss: reduce font size to align with other desktop apps
EBEAST: b/fed-object.vue: use b-grid for field layout
EBEAST: b/grid.vue: add functional component for `display: grid` elements
BEAST-GTK: bstmain.cc: document '-p' and '-m' only briefly
BSE: bsemain.cc: support '-p' and '-m' for default driver selection
EBEAST: b/preferencesdialog.vue: remove menu test code
EBEAST: utilities.js: prevent Up/Down focus changes from also scrolling
EBEAST: b/contextmenu.vue: fix menuitem checks within functional components
EBEAST: Util.ResizeObserver: simplify FallbackResizeObserver
EBEAST: b/contextmenu.vue: fix re-positioning loops
EBEAST: b/preferencesdialog.vue: rmeove unused mixin
EBEAST: b/aboutdialog.vue: show dialog via v-model
EBEAST: use secondary/warning/notice colors for picklist details
BSE: driver-alsa.cc: give a Note about PulseAudio, rather than a Warning
EBEAST: b/preferencesdialog.vue: provide notice / warning colorizations
EBEAST: b/fed-picklist.vue: support icon/label/line CSS classes
EBEAST: b/menuitem.vue: support iconclass property
EBEAST: b/icon.vue: support iconclass property
EBEAST: b/flex.vue: simplify classlist handling
BSE: driver.cc: PCM Null: warn about lack of playback timing
EBEAST: b/contextmenu.vue: avoid repeated resize_observer iterations
EBEAST: b/contextmenu.vue: use dom_update, dom_destroy
EBEAST: app.html: always add vue_mixins.dom_updates and vue_mixins.data_tmpl
EBEAST: b/mixins.scss: rename from styles.scss
EBEAST: cssaux.scss: move and turn into a helper for variables.scss
EBEAST: b/flex.vue: turn b-hflex, b-vflex into slim functional components
EBEAST: b/bundle.js: allow *.vue files without module.exports component
EBEAST: b/fed-picklist.vue: support menu popup via 'click' and
'mousedown'
EBEAST: b/contextmenu.vue: support drag-selection on 'mousedown' popups
EBEAST: b/fed-picklist.vue: remove <label/> and <input/> form elements
EBEAST: utilities.js: swallow_event: fix event type
EBEAST: b/projectshell.vue: use v-model to adjust show_preferences_dialog
EBEAST: b/preferencesdialog.vue: forward v-model and reload on popup
EBEAST: b/modaldialog.vue: fix modal shield, use v-model for popup flag
EBEAST: b/fed-picklist.vue: popup on mousedown and fix styles
EBEAST: b/contextmenu.vue: fix modal shield and positioning, add transitions
EBEAST: b/color-picker.vue: fix modal shield and positioning, add transitions
EBEAST: utilities.js: change modal_shield() to reparent and allow styling
EBEAST: b/fed-text.vue: use b-style-inset like number inputs
EBEAST: variables.scss: add b-style-modal-overlay for overlay backgrounds
EBEAST: b/color-picker.vue: use style/template/script order
EBEAST: utilities.js: fix focus stacking and display==none check
EBEAST: b/preferencesdialog.vue: create picklistitems from PCM/MIDI drivers
EBEAST: b/fed-object.vue: use b-picklist for fields with .picklistitems
EBEAST: b/fed-picklist.vue: add b-picklist component
EBEAST: b/fed-object.vue: add support for __fieldhooks__ metadata
EBEAST: b/fed-number.vue: utilize b-style-number-input and b-style-hrange-input
EBEAST: Makefile.mk: provide spinners.svg for b-style-number-input
EBEAST: variables.scss: add b-style-number-input
EBEAST: variables.scss: add b-style-light-foreground
EBEAST: variables.scss: add b-style-hrange-input mixin
EBEAST: variables.scss: add b-style-inset and b-style-outset mixins
EBEAST: variables.scss: provide b-style-focus-color and b-style-border-radius
EBEAST: variables.scss: slightly darken the main background
EBEAST: b/contextmenu.vue: rename .popup() and fix positioning
EBEAST: b/modaldialog.vue: avoid double destroy calls
BSE: driver-alsa.cc: scrap redundant device info
BSE: add pcm_driver and midi_driver to 'record Configuration'
EBEAST: utilities.js: vue_observable_from_getters: de-dup equal results
EBEAST: utilities.js: equals_recursively: require equal for..in order
EBEAST: utilities.js: guard ModalShield against double-destroy
BSE: driver-alsa.cc: fill audio buffer by writing exact period sizes
EBEAST: b/preferencesdialog.vue: add driver selection menu
EBEAST: b/menuitem.vue: forward the `ic` property to b-icon
EBEAST: b/icon.vue: support prefixed icons via the `ic` property
MISC: Dockerfile-cibuild: build CI and AppImage against libjack-dev 0.125
BSE: add major.minor.micro to BeastSoundEngine
BSE: Makefile.mk: conditionally compile libbse-jack-x.y.z.so
config-checks.mk: check if jack.pc >= 0.124.0 is present
BSE: driver.cc: be silent about libbse-jack loading errors
BSE: driver.cc: add libbse-jack-x.y.z.so loader code
BSE: bsemain: add register_driver_loader() and load-drivers option
BSE: driver-jack.cc: assign device_name, capabilities, device_info, notice
BSE: driver-alsa.cc: adjust capabilities listing
BSE: bseapi.idl: add to DriverEntry: device_name, capabilities, device_info, modem
BSE: driver-jack.cc: improve device description strings
BSE: driver: use DriverEntry and DriverEntrySeq
BSE: bseapi.idl: add list_pcm_drivers / list_midi_drivers
BSE: driver-jack.cc: remove duplicate debug prefix
BSE: driver-alsa.cc: fix buffer for pcm writes during retrigger, fixes #127
BSE: driver: add driver name to devid entries
BSE: bseserver.cc: fallback to "null" MIDI driver if no MIDI device is
present
BSE: strings: add kvpair_key() and kvpair_value()
TESTS: basics.cc: rename file (from aida-basics.cc)
TESTS: suite1-main.cc: NEVER inline prototypes, ALWAYS use a header file!
TESTS: use 'null' PCM driver without arguments
BSE: driver: add 'null' PCM and 'null' MIDI driver
BSE: bsedevice*: remove unused source files
BSE: support "auto" driver selection for PCM and MIDI
BSE: Makefile.mk: stop compiling old device code
BSE: bsemain.cc: stop listing old devices
BSE: remove unused MIDI device code
BSE: remove old OSS device code
DRIVERS: remove old MIDI device code
BSE: bseserver: use the new MIDI Driver
BSE: driver-alsa.cc: implement AlsaMidiDriver
BSE: bsemain.cc: print MIDI driver list
BSE: driver-alsa.cc: prefix all PCM related functions
BSE: driver-alsa.cc: use "alsa" as debug key
BSE: driver: add MidiDriver base type for MIDI drivers to derive from
BSE: introduce PcmDriver base type for PCM drivers to derive from
DRIVERS: remove old PCM device code
BSE: bseserver, bsepcmmodule: use the new PCM Driver
BSE: driver: fix open(), add pcm_frequency()
BSE: bseserver.hh: reformat bse_server_*() decls
BSE: driver: rename config.block_length
BSE: driver: add pcm_read and pcm_write
BSE: driver-alsa.cc: reduce init code
BSE: driver: add pcm_latency()
BSE: driver: add pcm_check_io()
BSE: driver: add pcm_retrigger()
BSE: driver-alsa.cc: implement open/close
BSE: driver: add DriverConfig, ctor, dtor
BSE: Makefile.mk: compile ALSA driver and link against -lasound
BSE: driver-alsa.cc: start ALSA driver, list available PCM drivers
BSE: bsemain.cc: print PCM driver list
BSE: driver: start new Bse::Driver infractructure
MISC: Dockerfile-yum: install missing `patch` utility
EBEAST: b/preferencesdialog.vue: move to await and observable_from_getters()
EBEAST: b/fed-object.vue: implement reactivity with observable_from_getters()
EBEAST: utilities.js: properly filter display:none elements in list_focusables
EBEAST: Makefile.mk: fix *.vue line numbers in vueify/lib/compiler.js
BSE: bseapi.idl: provide Object.find_typedata()
AIDACC: CxxStub.py: avoid useless __typedata__ vector copy
AIDACC: aida.cc: guard against missing auxentries
EBEAST: utilities.js: avoid UP/DOWN focus movement for stepUp/stepDown elements
JSONIPC: jsonipc.hh: add __typename__ to Serializable
.travis.yml: upgrade builds to Fedora-28, which has g++-8
MISC: Dockerfile-cibuild: install and switch to g++-8 before compiling
BSE: devicecrawler.cc: remove g++ 7.4.0 experimental/filesystem workaround
JSONIPC: jsonipc.hh: fix g++-8 missing-prototype warning by inlining
BSE: bsetype.hh: fix g++-8 parentheses warning
BSE: bseserver.cc: fix g++-8 signedness complaints
BEAST-GTK: gxk/gxkglobals.hh: ignore -Wparentheses in Gtk+ headers
AIDACC: CxxStub.py: remove __accept__() generation, use __visit__()
BSE: sfivisitors.hh: use __visit__() (not __accept__)
AIDACC: visitor.hh: use __visit__ instead of __accept__
AIDACC: replace Has__accept__<>() with Has___visit__<>()
AIDACC: aida.cc: silence g++-8 unused-variable warning
config-uname.mk: introduce a hard dependency on g++ >= 8.3.0
Makefile.mk: default to 'production' if MODE is unspecified
BUILD: rename optimized build mode, use: make default MODE=production
EBEAST: b/projectshell.vue: integrate positionview
EBEAST: add positionview to display time, signature, bars and beats
EBEAST: utilities.js: add strpad()
EBEAST: b/part-thumb.vue: add slight shading to distinguish parts
EBEAST: Makefile.mk: Upgrade font to Inter-3.10
EBEAST: b/treeselector-item.vue: add left/right focus movement
EBEAST: b/treeselector.vue: pick up device crawler data in create_data()
EBEAST: b/projectshell.vue: scroll sidebar
BSE: add devicecrawler.*, implenment interface DeviceCrawler
AIDACC: Parser.g: allow 'type' as field name
EBEAST: b/treeselector-item.vue: use smaller open/filled arrows for expand
EBEAST: b/treeselector.vue: keep focus handling inside container
EBEAST: b/projectshell.vue: add padding to sidebar
EBEAST: b/projectshell.vue: add handle to resize sidebar
EBEAST: variables.scss: add resize handle values
EBEAST: b/piano-roll.vue: use flex containers, optimize scrollarea
EBEAST: b/projectshell.vue: use flex containers
EBEAST: b/track-list.vue: use flex containers
EBEAST: b/flex.vue: use numeric grow<n> and shrink<n> properties
EBEAST: app.html: expand root element and constrain minimum size
EBEAST: app.scss: add .hflex .vflex .grow0 .grow* .shrink0 .shrink* classes
EBEAST: b/contextmenu.vue: cleanup resize_observer via destroy()
EBEAST: utilities.js: fix resize_observer() bookkeeping
EBEAST: use consistent license headings
EBEAST: b/projectshell.vue: add tree selector to right sidebar
EBEAST: b/treeselector.vue: add b-treeselector, use b-treeselector-item
EBEAST: b/treeselector-item.vue: add a b-treeselector-item
BSE: bseserver.cc: acocunt for *aligned* sizes in allocator assertion
BSE: bsetrack: emit "changed" on "notify:last_tick" of any
linked part
BSE: bseobject.cc: emit notify:icon on icon changes
BSE: bseapi-inserts.hh: on(): use ObjectImpl->__attach__() for connecting
BSE: bsedevice.cc: support BSE_DEBUG=snd to debug sound device opening
BSE: sfistore: fix seek error for files with binary appendix
EBEAST: b/piano-roll.vue:focus note on click and with arrow keys
EBEAST: b/piano-roll.vue: span 11 octaves, like other DAWs
EBEAST: b/piano-roll.vue: allow focus, draw focus note and freeze pnotes
EBEAST: b/projectshell.vue: add padding for focus-outline
EBEAST: b/styles.scss: add focus-outline-width and note-focus-color
EBEAST: utilities.js: add promise_state()
EBEAST: utilities.js: export in_array()
EBEAST: app.html: set `inheritAttrs: false` for all Vue components
JSONIPC: jsonipc.hh: freeze JS classes after initialization
EBEAST: jsbse.js: provide an empty Bse.server during async initialization
TESTS: audio/Makefile.mk: lower sum-diff-test threshold to avoid CI trip-ups
BSE: randomhash.hh: remove fnv1a_consthash64(std::string) variant
EBEAST: b/part-thumb.vue: freeze immutable allnotes, no need to observe
EBEAST: utilities.js: resize_canvas: return the devicepixelratio
EBEAST: b/piano-roll.vue: swap <style/> and <template/> sections
EBEAST: b/piano-roll.vue: move to await and observable_from_getters()
BSE: bsepart.cc: emit notify:last_tick, noteschanged, linkschanged events
EBEAST: b/part-thumb.vue: move to observable_from_getters()
EBEAST: vue_observable_from_getters(): gracefully handle missing getter
EBEAST: b/track-view.vue: use dom_animate_playback()
EBEAST: b/track-list.vue: use dom_animate_playback()
EBEAST: utilities.js: add dom_animate_playback() to vue_mixins.dom_updates
EBEAST: vue_observable_from_getters: only call getter if !!predicate
EBEAST: b/track-list.vue: use Vue.observable_from_getters() for Bse.Song
EBEAST: utilities.js: re-add async-warning for dom_update
EBEAST: b/track-list.vue: remove unused attr
EBEAST: b/track-view.vue: use Vue.observable_from_getters() for Bse.Track
EBEAST: provide Vue.observable_from_getters() for async getters with signals
EBEAST: return `disconnect()` function from Bse.ObjectIface.on()
EBEAST: b/track-view.vue: use explicit setup/cleanup code for async track API
EBEAST: b/track-list.vue: properly handle await queries and cleanups
EBEAST: utilities.js: add support for `priv_tmpl` to vue_mixins.data_tmpl
EBEAST: utilities.js: add copy_recursively() for Arrays and simple Objects
EBEAST: utilities.js: add equals_recursively()
EBEAST: utilities.js: add discard_remote() stub
EBEAST: utilities.js: track this.dom_update() calls reactively
EBEAST: utilities.js: work around Firefox lacking setImmediate()
EBEAST: utilities.js: batch shm_reschedule() requests during the same tick
EBEAST: utilities.js: cleanup ShmFragmentSeq for broadcast_shm_fragments()
EBEAST: utilities.js: fix missing initial call_frame_handlers()
EBEAST: b/part-thumb.vue: optimize redraws via batch-await before updating
EBEAST: b/part-thumb.vue: fix vertical note orientation
EBEAST: b/part-thumb.vue: properly scale font-size and note thickness
EBEAST: b/part-thumb.vue: adjust canvas size to match hardware pixels
EBEAST: b/part-thumb.vue: use await for part.get_last_tick()
EBEAST: adjust part thumbnail colors and style
EBEAST: b/track-list.vue: fix tick position subscription setup
EBEAST: b/track-list.vue: avoid tick pointer layout being cut-off
EBEAST: b/track-list.vue: add song position pointer, synced to Song
EBEAST: utilities.js: fix shm_unsubscribe()
EBEAST: utilities.js: remove old array_fields_* code
EBEAST: eliminate shm_id handling
BEAST-GTK: eliminate shm_id
BSE: eliminate shm_id, only one shared memory area is supported by Bse.server
EBEAST: b/track-view.vue: remove old Util.array_fields_* handling
BSE: add Song.get_shm_offset and SongTelemetry to monitor tick pointer
BSE: beast-sound-engine.cc: add debug code for extended binary watching
EBEAST: b/track-view.vue: use Bse.MonitorField enum values instead of constants
BEAST-GTK: fix Bse.SignalMonitor.get_shm_offset() calls
BSE: add probe field to Bse.SignalMonitor.get_shm_offset()
BSE: bseapi.idl: fix SignalMonitor documentation
EBEAST: b/track-view.vue: use dom_updates to manage frame_handler lifetime
EBEAST: use new vue_mixins.dom_updates with dom_create, dom_update, dom_destroy
EBEAST: jsbse.js: handle $jsonipc.onbinary via Util.shm_receive()
EBEAST: utilities.js: exports shm_{un}subscribe() and shm_array_<type>
EBEAST: b/track-view.vue: use Util.shm_subscribe() for dB-meter updates
JSONIPC: head.js: allow 'arraybuffer' message handling via onbinary
EBEAST: main.js: pass --binary along to BeastSoundEngine
BSE: beast-sound-engine.cc: implement Bse::IpcHandler for binary messages
BSE: beast-sound-engine.cc: print 404 errors unconditionally
BSE: add Server.broadcast_shm_fragments() to get binary shm updates
BSE: bseglobals: add exec_handler_clear() to remove timers
BSE: randomhash.hh: add fnv1a_consthash64() for std::string and arbitrary lengths
BSE: cxxaux.hh: add constexpr_equals()
EBEAST: utilities.js: use await in frame handler updates
EBEAST: b/projectshell.vue: auto-"load" the *last* project on startup
BSE: beast-sound-engine.cc: clean up event handlers on stale connections
BSE: bseapi.idl: add Bse.server.last_project()
EBEAST: menus.js: allow BrowserWindow local menus
EBEAST: menus.js: load beast-manual through http requests
EBEAST: Makefile.mk: include doc/ via app/doc/ symlink
BSE: beast-sound-engine.cc: permit http file requests for app/ and doc/
BSE: beast-sound-engine.cc: add image mime types
EBEAST: b/track-view.vue: fix text input positioning buglet in gecko
EBEAST: app.html: support [chrome] and [gecko] selectors for <html/>
EBEAST: b/contextmenu.vue: use Util.resize_observer()
EBEAST: use the same defaults for <html/> and BrowserWindowDefaults
EBEAST: authenticate subprotocol via URL query string
EBEAST: app.html: provide MAINCONFIG.args default
BSE: beast-sound-engine.cc: authenticate subprotocol via URL query string
EBEAST: b/track-view.vue: fix midi_channel assignemnt
JSONIPC: jsonipc.hh: use getter/setter method to avoid 'async get'
properties
EBEAST: main.js: add TODO about closing manual window
EBEAST: package.json.in: upgrade to latest Electron stable version, 6.0.1
EBEAST: package.json.in: update minimum vue, jquery and eslint versions
EBEAST: package.json.in: update babel/chrome target to 66
EBEAST: b/projectshell.vue: ensure a song has a connected Master track
EBEAST: b/track-view.vue: assign midi_channel via menu and disable items
EBEAST: b/contextmenu.vue: add 'check' callback to open() to disable items
EBEAST: b/menuitem.vue: allow menudata.checkedroles to override disabled
EBEAST: b/track-view.vue: add example menu for track editing
EBEAST: b/track-view.vue: use text input to edit track names
EBEAST: b/projectshell.vue: ensure projects have a song with master bus
BSE: bsestorage.cc: scanner_parse_paren_rest() can only read whole files
BSE: sfistore: allow only whole file reads via open() or input_text()
BEAST-GTK: use sfi_rstore_new_open() instead of file descriptor feeding
EXTERNAL: v8pp: remove (now unused) v8pp/ project
EBEAST: remove v8bse code and buildrules
BSE: bseitem.cc: remove unused bse_item_{get|set}_property_internal()
BSE: beast-sound-engine.cc: properly bind Aida::Event as AnyRec
BSE: beast-sound-engine.cc: convert between Any and C++ classes
AIDACC: JsonipcStub.py: register Aida::ImplicitBase as parent for base classes
BSE: beast-sound-engine.cc: implement Convert<Any> for most types
MISC: bintray.sh: add scriptname prefix
.travis.yml: do not provide .bintray_api_key for pull requests
MISC: Makefile.mk: require .bintray_api_key for uploads
MISC: bintray.sh: add --skip to exit gracefully if API key is missing
MISC: Dockerfile-yum: upgrade dependencies
MISC: Makefile.mk: build beast AppImage in out/
MISC: cibuild.sh: use timjanik/beast:cibase-190807-bionic as CI base image
MISC: Dockerfile-bionic: upgrade dependenccies and optimize image
EBEAST: app.html: load command line files
EBEAST: app.html: allow async menu initialisation
EBEAST: menus.js: handle async functions with await
BSE: beast-sound-engine.cc: randomize subprotocol for true authentication
EBEAST: jsbse.js: derive ws:// from current host + port
EBEAST: app.html: setup window.MAINCONFIG
EBEAST: main.js: force non-0 exit status for SIGINT, SIGHUP, SIGTERM
EBEAST: main.js: spawn BeastSoundEngine --embed and add clean shutdown
BSE: beast-sound-engine.cc: allow embedding via control pipe
EBEAST: menus.js: use Electron.app.exit() b/c Electron abuses quit() for signals
EBEAST: b/projectshell.vue: move b-aboutdialog and b-preferencesdialog here
EBEAST: menus.js: use 'export' statement for Browser modules
EBEAST: main.js: rename global CONFIG, load app.html
EBEAST: app.html: rename CONFIG, add DevTools key, load menus for Electron
EBEAST: Makefile.mk: circumvent eslint bug, rename global CONFIG
EBEAST: using CONFIG constants
EBEAST: b/aboutdialog.vue: use CONFIG and make nodejs info optional
EBEAST: b/icon.vue: fix vertical alignment
EBEAST: app.html: fix jQuery, install GLOBALCONFIG and show b-projectshell
BSE: beast-sound-engine: colorize error replies
EBEAST: provide fallback ResizeObserver, based on window.onresize
EBEAST: utilities.js: for now, provide shm dummy
EBEAST: jsbse.js: add await to (unused) test code
EBEAST: b/track-view.vue: handle async functions with await
EBEAST: b/part-thumb.vue: handle async functions with await
EBEAST: b/part-list.vue: handle async functions with await
BSE: beast-sound-engine: manually convert Aida::RemoteMember<Bse::PartHandle>
AIDACC: JsonipcStub.py: use Jsonipc::Serializable<>
BSE: beast-sound-engine: use Jsonipc::ClassPrinter::recording() for --js-bseapi
EBEAST: b/track-view.vue: use await fro track method calls
EBEAST: b/track-list.vue: use await when listing tracks
BSE: beast-sound-engine: fix CallbackInfo references
BSE: bseserver: print BSE:UserMessage to stderr for minimal handling
AIDACC: JsonipcStub.py: use .serializable() for records
EBEAST: b/projectshell.vue: fix missing title updates
EBEAST: jsbse.js: add on() and off() to Bse.ObjectIface
BSE: beast-sound-engine: handle Bse/EventHub/connect & disconnect
EBEAST: b/track-list.vue: use await to query track lists
EBEAST: b/projectshell.vue: use await for BSE methods
EBEAST: .eslintrc.js: fix missing $log symbol
BSE: beast-sound-engine: load BSE assets
BSE: beast-sound-engine: manually convert Handle sequence into shared_ptr vectors
EBEAST: app.html: re-activate b-projectshell
BSE: beast-sound-engine: use Jsonipc::ClassPrinter::to_string()
AIDACC: JsonipcStub.py: register enum values
AIDACC: JsonipcStub.py: generate binding calls for Jsonipc
BSE: beast-sound-engine: call Bse_jsonipc_stub() from bseapi_jsonipc.cc
BSE: Makefile.mk: generate bseapi_jsonipc.cc with JsonipcStub.py
EBEAST: generate bseapi_jsonipc.js, using jsonipc/head.js
EBEAST: jsbse.js: properly pass object ids
EBEAST: jsbse.js: re-define Bse.server.$id for initialization
EBEAST: b/bundle.js, jsbse.js: move and disable failing tests
EBEAST: jsbse.js: add JSON ipc marshalling code for BSE
EBEAST: Makefile.mk: generate js_bseapi.js with BeastSoundEngine
EBEAST: app.html: rewrite application startpoint
EBEAST: utilities.js: turn into a javascript module, using "export"
EBEAST: utilities.js: move utilities.js here
Makefile.mk: distversion: fix use before assignment
BSE: beast-sound-engine: send Bse.serevr on $jsonipc.initialize
BSE: beast-sound-engine: fix missing allocator in to_json()
BSE: beast-sound-engine: bind Bse::ServerIface, for which we have a wrapper
BSE: beast-sound-engine: add '--js-bseapi' to print out the BSE Javascript
glue
BSE: beast-sound-engine: redirect to app.html
BSE: beast-sound-engine: serve HTTP requests for ondisk files from app/
BSE: beast-sound-engine: handle HTTP requests on /
BSE: beast-sound-engine: support --verbose
BSE: beast-sound-engine: include jsonbindings.cc and hand out BseServer
BSE: beast-sound-engine: add JS example comment for echo tests
BSE: beast-sound-engine: require (example) auth string for connections
BSE: beast-sound-engine: print connection Id
BSE: beast-sound-engine: handle requests with Jsonipc::IpcDispatcher
BSE: regex: add Re::search()
BSE: beast-sound-engine: add tiny bit of color
BSE: beast-sound-engine: implement simple websocket echo server
BSE: beast-sound-engine: include non-tls websocketpp server
config-checks.mk: provide $BOOST_SYSTEM_LIBS for BeastSoundEngine
BSE: add beast-sound-engine.cc to build lib/BeastSoundEngine executable
JSONIPC: jsonipc.hh: add restrictions to IsWrappableClass<> to satisfy
g++-7.4
JSONIPC: head.js: add marshalling code for Javascript
TESTS: integrate jsonipc/testjsonipc.cc:test_jsonipc()
JSONIPC: Makefile: build testjsonipc
JSONIPC: testjsonipc: add simple jsonipc test program
JSONIPC: jsonipc.hh: add binding to use C++ struct APIs via JSON messages
WEBSOCKETPP: fix 'noexcept' specifier
Squashed 'external/websocketpp/' content from commit 13fec9f30
Squashed 'external/rapidjson/' changes from 08eb814e4..bd79eae15
Squashed 'external/rapidjson/' content from commit 08eb814e4
EBEAST: b/utilities.js: add 'Vue-v-inlineblur' directive
EBEAST: b/menuitem.vue: adjust layout inside menurow
EBEAST: b/menurow.vue: add component to pack Menuitems horizontally
EBEAST: b/contextmenu.vue: fix FocusGuard interfering with menuitem actions
EBEAST: b/contextmenu.vue: add box-shadow
EBEAST: b/menutitle.vue: add component for menu titles
EBEAST: b/menuseparator.vue: add separator for menus
EBEAST: b/menuitem.vue: adjust selector specificity and border
EBEAST: b/contextmenu.vue: adjust selector specificity and padding
EBEAST: variables.scss: provide more menu styles
EBEAST: b/track-view.vue: fix style/template/script order
EBEAST: b/contextmenu.vue: provide menudata and fix events on disabled items
EBEAST: b/menuitem.vue: add menuitem component for use in contextmenu
EBEAST: b/contextmenu.vue: add component for popup menus
EBEAST: variables.scss: provide basic b-menu-* styles
EBEAST: b/utilities.js: reimplement FocusGuard via event handlers
EBEAST: b/utilities.js: warn about swapping the `data_tmpl` field name
EBEAST: b/utilities.js: allow popup positioning at mouse pointer
EBEAST: b/utilities.js: popup_position(): calculate popup positions
EBEAST: b/utilities.js: allow modal shield background customization
EBEAST: b/utilities.js: prevent mousedown3+contextmenu to re-popup menus
EBEAST: b/utilities.js: refactor focus cycling and modals into JS classes
EBEAST: b/utilities.js: add fwdprovide() to forward ancestor properties
EBEAST: b/utilities.js: comment fixups
EBEAST: move main CSS color specs into variables.scss:
EBEAST: b/vflex.vue: add container for vertical layouting
EBEAST: b/hflex.vue: container for horizontal layouting
EBEAST: b/flex.vue: add container for horizontal or vertical layouting
EBEAST: window.html: fix argument processing
EBEAST: introduce GLOBALCONFIG to pass configs from main.js to the renderer
DOCS: rename @BUILDVERSION@ substitution
config-checks.mk: remove unused VERSION_LONG
BSE: Makefile.mk: avoid generating unused buildid.cc
BSE: remove version_buildid(), instead use Bse::version()
MISC: Makefile.mk: make distversion (version.sh -l) local to appimage and bintray
TOOLS: bsetool: remove buildid
BEAST-GTK: bstmain: remove buildid everywhere and stick to Bse::version()
Makefile.mk: make distversion (version.sh -l) local to dist and distcheck
config-checks.mk: get rid of unused VERSION_DATE
DOCS: Makefile.mk: call `./version.sh -d` on demand
BSE: remove version_date() from API
TOOLS: bsetool: remove version_date() from output
version.sh: fix short version if git is present
EBEAST: window.html: load BSE files from the command line
EBEAST: menus.js: print loading error to console
EBEAST: window.html: fix Vue / utilities dependency and provide $log
EBEAST: b/playcontrols.vue: remove old CSS
EBEAST: b/part-list.vue: fix double include
EBEAST: b/hotkeys.js: fix keyboard activation of jQuery element
EBEAST: b/utilities.js: guard against multiple instantiations
EBEAST: menus.js: fix manual browser back/forward keys
EBEAST: main.js: explicitely enable nodeIntegration
EBEAST: main.js: disable experimentalFeatures which we don't use
EBEAST: remove electron-devtools-installer/VUEJS_DEVTOOLS which causes crashes
EBEAST: v8bse/Makefile.mk: silence excessive V8 deprecation warnings
EBEAST: v8bse/Makefile.mk: relax version matches and update electron header URL
EBEAST: b/icon.vue: upgrade to use the Fork-Awesome-1.1.7 WOFF2 file
EBEAST: Makefile.mk: provide the Fork-Awesome-1.1.7 woff2 and CSS files
EBEAST: b/icon.vue: add unicode symbols via :uc and material icons via :mi
EBEAST: Makefile.mk: provide woff2 and CSS from material-icons-190326.1
EBEAST: b/icon.vue: fix nosize attribute
EBEAST: change vc-* references to b-*
EBEAST: Makefile.mk: change vc/ to b/
EBEAST: b/: change vc-* prefix to b-*
EBEAST: b/: rename beast vue component directory from vc/ to b/
Squashed 'external/v8pp/' changes from 792dd225f..f2720534b
EBEAST: v8pp_property: add v8pp::property wrapper for getter/setter pairs
EBEAST: v8bse/V8Stub.py: check result from v8::Script::Compile()->Run()
EBEAST: v8bse/nodemodule: add "v8pp/persistent.hpp" include
EBEAST: v8bse/nodemodule: use `v8::Local` instead of `v8::Handle`
EBEAST: v8bse/V8Stub.py: use `v8::Local` instead of `v8::Handle`
Squash 'external/v8pp' changes from cda26b60e..792dd225fa42
EBEAST: vc/utilities.js: use a 170ms delay for focus activation
EBEAST: package.json.in: upgrade electron to 3.1.12.
EBEAST: vc/modaldialog.vue: add focus cycling
EBEAST: vc/modaldialog.vue: reduce modal dialog wrappers
EBEAST: vc/utilities.js: modal_shield: add 'focuscycle' option
EBEAST: utilities.js: add list_focusables()
EBEAST: vc/utilities.js: fix missing focus_guard increments
EBEAST: temporarily add .active to elements activated via Enter
EBEAST: vc/hotkeys.js: use key matching from utilities.js
EBEAST: vc/utilities.js: add missing export of is_navigation_key_code
EBEAST: vc/utilities.js: export match_key_event()
EBEAST: vc/utilities.js: export key codes and is_navigation_key_code()
EBEAST: vc/utilities.js: add in_array()
EBEAST: vc/modaldialog.vue: fix tabindex for modal widget children
EBEAST: vc/hotkeys.js: allow Enter for focus activation via keyboard_click
EBEAST: vc/utilities.js: add keyboard_click()
EBEAST: vc/part-list.vue: remove extra this to fix linter warning
EBEAST: vc/bundle.js: sort component registration
EBEAST: use fork-awesome-sprites-0.1.svg instead of Font Awesome 4.7.0 sprites
EBEAST: remove icon-button.vue, we now use vc-icon
EBEAST: vc/playcontrols.vue: use vc-icon
EBEAST: vc/icon.vue: add component for SVG icon rendering
EBEAST: package.json.in: remove font-awesome-4.7.0 npm package
EBEAST: Makefile.mk: download fa-sprites-4.7.0.svg asset
BSE: bsestorage: fix scanner_parse_paren_rest to capture float digits
EBEAST: vc/part-list.vue: update docs and css includes
EBEAST: track-list.vue: keep track ctrls out of horizontal scroll area
EBEAST: part-list.vue: extract vc-part-list component
--
Yours sincerely,
Tim Janik
https://testbit.eu/timj
Free software author.