From 24260079bb9a7ed5529aa927f87e148b7e6b19ae Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Sun, 12 Jul 2026 06:10:11 -0400 Subject: [PATCH 1/3] tidy: use Session:setProperty when setting tempo. --- include/element/session.hpp | 3 --- src/nodes/midisetlist.cpp | 10 +++++----- src/services/mappingservice.cpp | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/include/element/session.hpp b/include/element/session.hpp index 4ecc5e0ff..2662a78fe 100644 --- a/include/element/session.hpp +++ b/include/element/session.hpp @@ -107,9 +107,6 @@ class Session : public Model, Session(); friend class Context; - /** Set a property. */ - inline void setProperty (const juce::Identifier& prop, const juce::var& val) { objectData.setProperty (prop, val, nullptr); } - friend class juce::ValueTree; virtual void valueTreePropertyChanged (juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property); virtual void valueTreeChildAdded (juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenAdded); diff --git a/src/nodes/midisetlist.cpp b/src/nodes/midisetlist.cpp index 5a43c4440..bf2feb662 100644 --- a/src/nodes/midisetlist.cpp +++ b/src/nodes/midisetlist.cpp @@ -112,15 +112,15 @@ void MidiSetListProcessor::maybeSendTempoAndPosition (int program) if (auto* entry = entries[program]) { if (entry->tempo >= 20.0) - s->getValueTree().setProperty (tags::tempo, entry->tempo, nullptr); + s->setProperty (tags::tempo, entry->tempo); if (entry->tsNum > 0 && entry->tsDen > 0) { - const int div = BeatType::fromDivisor (entry->tsDen); // raw denom -> BeatType enum - s->getValueTree().setProperty (tags::beatsPerBar, entry->tsNum, nullptr); - s->getValueTree().setProperty (tags::beatDivisor, div, nullptr); + const auto beatType = BeatType::fromDivisor (entry->tsDen); + s->setProperty (tags::beatsPerBar, entry->tsNum); + s->setProperty (tags::beatDivisor, beatType); if (auto e = _context.audio()) - e->setMeter (entry->tsNum, div); + e->setMeter (entry->tsNum, beatType); } if (auto e = _context.audio()) diff --git a/src/services/mappingservice.cpp b/src/services/mappingservice.cpp index 38538025d..bba848598 100644 --- a/src/services/mappingservice.cpp +++ b/src/services/mappingservice.cpp @@ -349,7 +349,7 @@ void MappingService::tapTempo() { if (auto bpm = context().mapping().tapTempo (Time::getMillisecondCounterHiRes())) if (auto session = context().session()) - session->data().setProperty (tags::tempo, *bpm, nullptr); + session->setProperty (tags::tempo, *bpm); } void MappingService::learnTempo() From 1ed0417fea53ed0bdf38428b56666a67909964d0 Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Sun, 12 Jul 2026 06:40:53 -0400 Subject: [PATCH 2/3] housekeeping: sort headers. update EL_ to ELEMENT_ prefixes in some macros --- include/element/ui/preferences.hpp | 12 ++++++------ src/services/deviceservice.hpp | 2 +- src/services/engineservice.cpp | 6 +++--- src/services/guiservice.cpp | 10 ++++------ src/services/mappingservice.cpp | 14 ++++++++------ src/services/mappingservice.hpp | 4 ++-- src/services/oscservice.cpp | 11 +++++------ src/services/presetservice.cpp | 8 ++++---- src/services/sessionservice.cpp | 6 +++--- src/ui/buttons.hpp | 1 - src/ui/emptyview.hpp | 4 ++-- src/ui/preferences.cpp | 24 ++++++++++++------------ 12 files changed, 50 insertions(+), 52 deletions(-) diff --git a/include/element/ui/preferences.hpp b/include/element/ui/preferences.hpp index 05377a391..9833f2854 100644 --- a/include/element/ui/preferences.hpp +++ b/include/element/ui/preferences.hpp @@ -5,12 +5,12 @@ #include -#define EL_GENERAL_SETTINGS_NAME "General" -#define EL_AUDIO_SETTINGS_NAME "Audio" -#define EL_MIDI_SETTINGS_NAME "MIDI" -#define EL_OSC_SETTINGS_NAME "OSC" -#define EL_PLUGINS_PREFERENCE_NAME "Plugins" -#define EL_REPOSITORY_PREFERENCE_NAME "Updates" +#define ELEMENT_GENERAL_SETTINGS_NAME "General" +#define ELEMENT_AUDIO_SETTINGS_NAME "Audio" +#define ELEMENT_MIDI_SETTINGS_NAME "MIDI" +#define ELEMENT_OSC_SETTINGS_NAME "OSC" +#define ELEMENT_PLUGINS_PREFERENCE_NAME "Plugins" +#define ELEMENT_REPOSITORY_PREFERENCE_NAME "Updates" namespace element { diff --git a/src/services/deviceservice.hpp b/src/services/deviceservice.hpp index 91cbd751e..9ccae6eb7 100644 --- a/src/services/deviceservice.hpp +++ b/src/services/deviceservice.hpp @@ -3,9 +3,9 @@ #pragma once +#include #include #include -#include namespace element { diff --git a/src/services/engineservice.cpp b/src/services/engineservice.cpp index b24f19b3a..4e3c5c524 100644 --- a/src/services/engineservice.cpp +++ b/src/services/engineservice.cpp @@ -3,17 +3,17 @@ #include #include +#include #include #include #include #include #include +#include #include "engine/graphmanager.hpp" -#include "nodes/mididevice.hpp" #include "engine/rootgraph.hpp" -#include -#include +#include "nodes/mididevice.hpp" #define ELEMENT_TRACE_SESSION_LOAD 0 diff --git a/src/services/guiservice.cpp b/src/services/guiservice.cpp index dbf22af0c..f08cb16f6 100644 --- a/src/services/guiservice.cpp +++ b/src/services/guiservice.cpp @@ -6,8 +6,6 @@ #include #include #include -#include - #include #include #include @@ -16,8 +14,8 @@ #include #include #include +#include -#include "appinfo.hpp" #include "auth.hpp" #include "engine/midipanic.hpp" #include "messages.hpp" @@ -30,8 +28,8 @@ #include "ui/virtualkeyboardview.hpp" #include "ui/windowmanager.hpp" -#ifndef EL_USE_SYSTEM_TRAY -#define EL_USE_SYSTEM_TRAY 1 +#ifndef ELEMENT_USE_SYSTEM_TRAY +#define ELEMENT_USE_SYSTEM_TRAY 1 #endif namespace element { @@ -1124,7 +1122,7 @@ void GuiService::refreshSystemTray() { // stabilize systray auto& settings = context().settings(); -#if EL_USE_SYSTEM_TRAY +#if ELEMENT_USE_SYSTEM_TRAY SystemTray::setEnabled (settings.isSystrayEnabled()); #else juce::ignoreUnused (settings); diff --git a/src/services/mappingservice.cpp b/src/services/mappingservice.cpp index bba848598..e4550cf68 100644 --- a/src/services/mappingservice.cpp +++ b/src/services/mappingservice.cpp @@ -1,15 +1,17 @@ // Copyright 2023 Kushview, LLC // SPDX-License-Identifier: GPL-3.0-or-later -#include "services/mappingservice.hpp" -#include "services/deviceservice.hpp" -#include "services/sessionservice.hpp" -#include -#include "engine/mappingengine.hpp" +#include + #include #include #include -#include +#include + +#include "engine/mappingengine.hpp" +#include "services/deviceservice.hpp" +#include "services/mappingservice.hpp" +#include "services/sessionservice.hpp" using namespace juce; diff --git a/src/services/mappingservice.hpp b/src/services/mappingservice.hpp index 032b08452..0a3d63857 100644 --- a/src/services/mappingservice.hpp +++ b/src/services/mappingservice.hpp @@ -3,9 +3,9 @@ #pragma once -#include -#include #include +#include +#include #include namespace element { diff --git a/src/services/oscservice.cpp b/src/services/oscservice.cpp index 930012f78..14aec1021 100644 --- a/src/services/oscservice.cpp +++ b/src/services/oscservice.cpp @@ -3,16 +3,15 @@ #include -#include - #include #include #include +#include #include "services/oscservice.hpp" -#define EL_OSC_ADDRESS_COMMAND "/element/command" -#define EL_OSC_ADDRESS_ENGINE "/element/engine" +#define ELEMENT_OSC_ADDRESS_COMMAND "/element/command" +#define ELEMENT_OSC_ADDRESS_ENGINE "/element/engine" using namespace juce; @@ -137,10 +136,10 @@ class OSCService::Impl return; application.reset (new CommandOSCListener (owner.context())); - receiver.addListener (application.get(), EL_OSC_ADDRESS_COMMAND); + receiver.addListener (application.get(), ELEMENT_OSC_ADDRESS_COMMAND); engine.reset (new EngineOSCListener (owner.context())); - receiver.addListener (engine.get(), EL_OSC_ADDRESS_ENGINE); + receiver.addListener (engine.get(), ELEMENT_OSC_ADDRESS_ENGINE); listenersReady = true; } diff --git a/src/services/presetservice.cpp b/src/services/presetservice.cpp index e11906bfc..f1318e4cd 100644 --- a/src/services/presetservice.cpp +++ b/src/services/presetservice.cpp @@ -1,13 +1,13 @@ // Copyright 2023 Kushview, LLC // SPDX-License-Identifier: GPL-3.0-or-later +#include +#include +#include #include #include -#include -#include "presetmanager.hpp" -#include -#include +#include "presetmanager.hpp" #include "services/presetservice.hpp" using juce::String; diff --git a/src/services/sessionservice.cpp b/src/services/sessionservice.cpp index 94f9832a4..de30ac773 100644 --- a/src/services/sessionservice.cpp +++ b/src/services/sessionservice.cpp @@ -1,12 +1,12 @@ // Copyright 2023 Kushview, LLC // SPDX-License-Identifier: GPL-3.0-or-later +#include +#include #include #include -#include -#include #include -#include +#include #include #include diff --git a/src/ui/buttons.hpp b/src/ui/buttons.hpp index 9aa1863f9..4658a303f 100644 --- a/src/ui/buttons.hpp +++ b/src/ui/buttons.hpp @@ -6,7 +6,6 @@ #include #include -// #include "ElementApp.h" #include "ui/icons.hpp" #include "tempo.hpp" diff --git a/src/ui/emptyview.hpp b/src/ui/emptyview.hpp index 27cf1d32c..5598bfa3c 100644 --- a/src/ui/emptyview.hpp +++ b/src/ui/emptyview.hpp @@ -16,7 +16,7 @@ class EmptyContentView : public ContentView setName ("EmptyView"); } - inline void paint (Graphics& g) override + inline void paint (juce::Graphics& g) override { g.fillAll (Colors::contentBackgroundColor); g.setColour (Colors::textColor); @@ -27,7 +27,7 @@ class EmptyContentView : public ContentView #else const String msg ("Session is empty.\nPress Shift+Ctl+N to add a graph."); #endif - g.drawFittedText (msg, 0, 0, getWidth(), getHeight(), Justification::centred, 2); + g.drawFittedText (msg, 0, 0, getWidth(), getHeight(), juce::Justification::centred, 2); } }; diff --git a/src/ui/preferences.cpp b/src/ui/preferences.cpp index e4b71e027..255df17e7 100644 --- a/src/ui/preferences.cpp +++ b/src/ui/preferences.cpp @@ -1394,28 +1394,28 @@ void Preferences::addPage (const String& name) Component* Preferences::createPageForName (const String& name) { - if (name == EL_GENERAL_SETTINGS_NAME) + if (name == ELEMENT_GENERAL_SETTINGS_NAME) { return new GeneralSettingsPage (_context, _ui); } - else if (name == EL_AUDIO_SETTINGS_NAME) + else if (name == ELEMENT_AUDIO_SETTINGS_NAME) { return new AudioSettingsComponent (_context.devices()); } - else if (name == EL_PLUGINS_PREFERENCE_NAME) + else if (name == ELEMENT_PLUGINS_PREFERENCE_NAME) { return new PluginSettingsComponent (_context); } - else if (name == EL_MIDI_SETTINGS_NAME) + else if (name == ELEMENT_MIDI_SETTINGS_NAME) { return new MidiSettingsPage (_context); } - else if (name == EL_OSC_SETTINGS_NAME) + else if (name == ELEMENT_OSC_SETTINGS_NAME) { return new OSCSettingsPage (_context, _ui); } #if ELEMENT_UPDATER - else if (name == EL_REPOSITORY_PREFERENCE_NAME) + else if (name == ELEMENT_REPOSITORY_PREFERENCE_NAME) { return new UpdatesSettingsPage (_context); } @@ -1428,17 +1428,17 @@ void Preferences::addDefaultPages() if (pageList->getNumRows() > 0) return; - addPage (EL_GENERAL_SETTINGS_NAME); - addPage (EL_AUDIO_SETTINGS_NAME); - addPage (EL_MIDI_SETTINGS_NAME); + addPage (ELEMENT_GENERAL_SETTINGS_NAME); + addPage (ELEMENT_AUDIO_SETTINGS_NAME); + addPage (ELEMENT_MIDI_SETTINGS_NAME); #if ! ELEMENT_SE - addPage (EL_OSC_SETTINGS_NAME); + addPage (ELEMENT_OSC_SETTINGS_NAME); #endif #if ELEMENT_UPDATER - addPage (EL_REPOSITORY_PREFERENCE_NAME); + addPage (ELEMENT_REPOSITORY_PREFERENCE_NAME); #endif - setPage (EL_GENERAL_SETTINGS_NAME); + setPage (ELEMENT_GENERAL_SETTINGS_NAME); } void Preferences::setPage (const String& name) From 12df0187fb2aceff8a11bafbc2ab0ef203f6b027 Mon Sep 17 00:00:00 2001 From: Michael Fisher Date: Sun, 12 Jul 2026 06:47:20 -0400 Subject: [PATCH 3/3] session: add tempo read/write property to Sesion lua binding. Fixes #1096 --- src/el/Session.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/el/Session.cpp b/src/el/Session.cpp index 40c18482c..895812a51 100644 --- a/src/el/Session.cpp +++ b/src/el/Session.cpp @@ -6,6 +6,8 @@ // @classmod el.Session // @pragma nostrip +#include + #include #include #include @@ -31,7 +33,7 @@ int luaopen_el_Session (lua_State* L) : std::shared_ptr(); }, - /// The sessions name. + /// The session's name. // @tfield string Session.name // @within Attributes "name", sol::property ( @@ -39,6 +41,17 @@ int luaopen_el_Session (lua_State* L) [](Session& self, const char* name) { self.setName (name); } ), + /// The session's current tempo. + // @tfield string Session.tempo + // @within Attributes + "tempo", sol::property ( + [](Session& self) { return self.getProperty(tags::tempo).toString().toStdString(); }, + [](Session& self, double tempo) { + tempo = std::clamp (tempo, 20.0, 999.0); + self.setProperty (tags::tempo, tempo); + } + ), + /// Convert to an XML string. // @function Session:toXmlString // @treturn string XML string of the session data.