Initial: OPLabsBandChannel.lv2 + OPLabsBandBus.lv2

This commit is contained in:
2026-06-21 00:03:37 -04:00
commit f8e697a064
68 changed files with 9591 additions and 0 deletions
+154
View File
@@ -0,0 +1,154 @@
#ifndef OPLABSBANDBUS_HPP
#define OPLABSBANDBUS_HPP
#include <lv2/core/lv2.h>
#include <lv2/state/state.h>
#include <lv2/urid/urid.h>
#include <cstdint>
#include <cmath>
#include <cstring>
/**
* OPLabsBandBus — 8-channel stereo bus mixer LV2 plugin.
*
* Sums 8 stereo input pairs into a stereo output with per-channel
* volume, pan, mute controls and peak level metering. Includes master
* volume and mute. Compatible with PiPedal and any LV2 host.
*
* Port layout (62 ports total):
* Audio inputs: ch1L..ch8R (015, 16 ports)
* Audio outputs: outL, outR (1617, 2 ports)
* Controls in: ch1Vol..ch8Vol (1825, 8 ports)
* ch1Pan..ch8Pan (2633, 8 ports)
* ch1Mute..ch8Mute(3441, 8 ports)
* masterVol (42, 1 port)
* masterMute (43, 1 port)
* Controls out: ch1LevelL..ch8LevelL (4451, 8 ports)
* ch1LevelR..ch8LevelR (5259, 8 ports)
* masterLevelL, masterLevelR (6061, 2 ports)
*
* URI: http://ourpad.casa/plugins/oplabs-band-bus#
*/
class OPLabsBandBus {
public:
static constexpr const char* URI = "http://ourpad.casa/plugins/oplabs-band-bus#";
static constexpr uint32_t kNumChannels = 8;
enum Ports : uint32_t {
// Audio inputs (16)
kCh1L = 0, kCh1R = 1,
kCh2L = 2, kCh2R = 3,
kCh3L = 4, kCh3R = 5,
kCh4L = 6, kCh4R = 7,
kCh5L = 8, kCh5R = 9,
kCh6L = 10, kCh6R = 11,
kCh7L = 12, kCh7R = 13,
kCh8L = 14, kCh8R = 15,
// Audio outputs (2)
kOutL = 16,
kOutR = 17,
// Per-channel volume (8)
kCh1Vol = 18, kCh2Vol = 19,
kCh3Vol = 20, kCh4Vol = 21,
kCh5Vol = 22, kCh6Vol = 23,
kCh7Vol = 24, kCh8Vol = 25,
// Per-channel pan (8)
kCh1Pan = 26, kCh2Pan = 27,
kCh3Pan = 28, kCh4Pan = 29,
kCh5Pan = 30, kCh6Pan = 31,
kCh7Pan = 32, kCh8Pan = 33,
// Per-channel mute (8)
kCh1Mute = 34, kCh2Mute = 35,
kCh3Mute = 36, kCh4Mute = 37,
kCh5Mute = 38, kCh6Mute = 39,
kCh7Mute = 40, kCh8Mute = 41,
// Master controls (2)
kMasterVol = 42,
kMasterMute = 43,
// Per-channel level L (8)
kCh1LevelL = 44, kCh2LevelL = 45,
kCh3LevelL = 46, kCh4LevelL = 47,
kCh5LevelL = 48, kCh6LevelL = 49,
kCh7LevelL = 50, kCh8LevelL = 51,
// Per-channel level R (8)
kCh1LevelR = 52, kCh2LevelR = 53,
kCh3LevelR = 54, kCh4LevelR = 55,
kCh5LevelR = 56, kCh6LevelR = 57,
kCh7LevelR = 58, kCh8LevelR = 59,
// Master level (2)
kMasterLevelL = 60,
kMasterLevelR = 61,
kNumPorts = 62
};
// ---- Static LV2 callbacks ----
static LV2_Handle instantiate(const LV2_Descriptor* descriptor,
double sampleRate,
const char* bundlePath,
const LV2_Feature* const* features);
static void connectPort(LV2_Handle instance, uint32_t port, void* data);
static void activate(LV2_Handle instance);
static void run(LV2_Handle instance, uint32_t nSamples);
static void deactivate(LV2_Handle instance);
static void cleanup(LV2_Handle instance);
static const void* extensionData(const char* uri);
// ---- State callbacks ----
static LV2_State_Status saveState(LV2_Handle instance,
LV2_State_Store_Function store,
LV2_State_Handle handle,
uint32_t flags,
const LV2_Feature* const* features);
static LV2_State_Status restoreState(LV2_Handle instance,
LV2_State_Retrieve_Function retrieve,
LV2_State_Handle handle,
uint32_t flags,
const LV2_Feature* const* features);
private:
OPLabsBandBus(double sampleRate, const LV2_Feature* const* features);
~OPLabsBandBus() = default;
OPLabsBandBus(const OPLabsBandBus&) = delete;
OPLabsBandBus& operator=(const OPLabsBandBus&) = delete;
bool initUrids(const LV2_Feature* const* features);
static inline float dBToGain(float dB) {
return std::pow(10.0f, dB / 20.0f);
}
// URID map
LV2_URID_Map* uridMap = nullptr;
LV2_URID urid__stateDummy = 0;
// Audio port pointers [ch][0=L,1=R]
const float* pAudioIn[8][2] = {};
float* pAudioOut[2] = {};
// Control input port pointers
const float* pVol[8] = {};
const float* pPan[8] = {};
const float* pMute[8] = {};
const float* pMasterVol = nullptr;
const float* pMasterMute = nullptr;
// Control output port pointers (meters)
float* pLevelL[8] = {};
float* pLevelR[8] = {};
float* pMasterLevelL = nullptr;
float* pMasterLevelR = nullptr;
// Cached parameter values
float cachedVol[8] = {};
float cachedPan[8] = {};
bool cachedMute[8] = {};
float cachedMasterVol = 0.0f;
bool cachedMasterMute = false;
// Peak meter state
float peakL[8] = {};
float peakR[8] = {};
float peakMasterL = -70.0f;
float peakMasterR = -70.0f;
};
#endif // OPLABSBANDBUS_HPP