1
0

Start analyser

This commit is contained in:
Geraint 2025-06-29 09:51:03 +01:00
parent 5c31f6dbf8
commit a1b9153bdc
11 changed files with 123 additions and 220 deletions

6
.gitmodules vendored
View File

@ -4,3 +4,9 @@
[submodule "modules/hilbert-iir"]
path = modules/hilbert-iir
url = https://github.com/Signalsmith-Audio/hilbert-iir.git
[submodule "clap/modules/linear"]
path = modules/linear
url = https://github.com/Signalsmith-Audio/linear.git
[submodule "modules/linear"]
path = modules/linear
url = https://github.com/Signalsmith-Audio/linear.git

48
analyser.h Normal file
View File

@ -0,0 +1,48 @@
/* Copyright 2022 Signalsmith Audio Ltd. / Geraint Luff
Released under the Boost Software License (see LICENSE.txt) */
#pragma once
#include "stfx/stfx-library.h"
namespace signalsmith { namespace basics {
template<class BaseEffect>
struct AnalyserSTFX;
using AnalyserFloat = stfx::LibraryEffect<float, AnalyserSTFX>;
using AnalyserDouble = stfx::LibraryEffect<double, AnalyserSTFX>;
template<class BaseEffect>
struct AnalyserSTFX : public BaseEffect {
using typename BaseEffect::Sample;
using typename BaseEffect::ParamRange;
using typename BaseEffect::ParamStepped;
template<class Storage>
void state(Storage &storage) {
storage.info("[Basics] Analyser", "A Bark-scale spectrum analyser");
storage.version(0);
}
template<class Config>
void configureSTFX(Config &config) {
config.outputChannels = config.inputChannels;
config.auxInputs = config.auxOutputs = {};
}
void reset() {}
template<class Io, class Config, class Block>
void processSTFX(Io &io, Config &config, Block &block) {
for (size_t c = 0; c < config.inputChannels; ++c) {
auto &input = io.input[c];
auto &output = io.output[c];
for (size_t i = 0; i < block.length; ++i) {
output[i] = input[i];
}
}
}
};
}} // namespace

View File

@ -1,7 +1,9 @@
cmake_minimum_required(VERSION 3.28)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
project(plugins VERSION 1.0.0)
set(NAME basics)
################ boilerplate config
@ -57,17 +59,16 @@ FetchContent_MakeAvailable(clap-helpers)
################ The actual plugin(s)
add_subdirectory(../ signalsmith-basics/) # need explicit path since it's not a subdir
set(NAME basics)
add_library(${NAME}_static STATIC)
target_link_libraries(${NAME}_static PUBLIC
clap
clap-helpers
)
target_include_directories(${NAME}_static PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../include
${CMAKE_CURRENT_SOURCE_DIR}/../modules
signalsmith-basics
)
target_sources(${NAME}_static PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/source/${NAME}.cpp
${CMAKE_CURRENT_SOURCE_DIR}/source/basics.cpp
)
make_clapfirst_plugins(

View File

@ -1,4 +1,4 @@
<REAPER_PROJECT 0.1 "7.20/macOS-arm64" 1747749064
<REAPER_PROJECT 0.1 "7.24/OSX64-clang" 1750919608
<NOTES 0 2
>
RIPPLE 0
@ -101,7 +101,7 @@
BAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAArAAAAAEAAAAAABAA
AQAAAAIAAAABAAAAZGVmYXVsdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMjcuMC4wLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
AAAQAAAA
AFByb2dyYW0gMQAQAAAA
>
FLOATPOS 0 0 0 0
FXID {11A0D811-6420-CB40-95D6-F9D12E45C862}
@ -125,54 +125,8 @@
>
<PROJBAY
>
<TRACK {6D299D8B-E766-F540-80D3-DA6147A064BA}
NAME "Sidechain Distortion"
PEAKCOL 16576
BEAT -1
AUTOMODE 0
PANLAWFLAGS 3
VOLPAN 0.56085967561807 0 -1 -1 1
MUTESOLO 0 0 0
IPHASE 0
PLAYOFFS 0 1
ISBUS 1 1
BUSCOMP 0 0 0 0 0
SHOWINMIX 1 0.6667 0.5 1 0.5 0 0 0
FIXEDLANES 9 0 0 0 0
SEL 1
REC 0 0 1 0 0 0 0 0
VU 2
TRACKHEIGHT 0 0 0 0 0 0 0
INQ 0 0 0 0.5 100 0 0 100
NCHAN 4
FX 1
TRACKID {6D299D8B-E766-F540-80D3-DA6147A064BA}
PERF 0
AUXRECV 2 3 1 0 0 0 0 0 2 -1:U 0 -1 ''
AUXRECV 3 3 1 0 0 0 0 0 2 -1:U 0 -1 ''
MIDIOUT -1
MAINSEND 1 0
<FXCHAIN
WNDRECT 184 282 862 150
SHOW 1
LASTSEL 0
DOCKED 0
BYPASS 0 0 0
<CLAP "CLAP: Sidechain Distortion (example) (Signalsmith Audio)" uk.co.signalsmith.dev.sidechain-distortion ""
CFG 0 0 0 ""
<OUT_PINS
>
<STATE
v2d2ZXJzaW9uAGVzdGF0Zb9ndmVyc2lvbgBnbGltaXREYr9ldmFsdWX7wDrCUmkT/3z/Z3RvbmVrSHq/ZXZhbHVl+0AVARbxhJ0S////
>
>
FLOATPOS 0 0 0 0
FXID {1F02CE63-5B2C-DD40-B8DA-6796E8E4CD70}
WAK 0 0
>
>
<TRACK {D098F2BD-6569-F946-9F66-5C0548DFE5B1}
NAME "Welcome Pad"
<TRACK {93E699D9-F890-234E-A113-7E0053A85B78}
NAME ""
PEAKCOL 16576
BEAT -1
AUTOMODE 0
@ -181,180 +135,25 @@
MUTESOLO 0 0 0
IPHASE 0
PLAYOFFS 0 1
ISBUS 2 -1
BUSCOMP 0 0 0 0 0
SHOWINMIX 1 0.6667 0.5 1 0.5 0 0 0
FIXEDLANES 9 0 0 0 0
SEL 0
REC 0 0 1 0 0 0 0 0
VU 2
TRACKHEIGHT 0 0 0 0 0 0 0
INQ 0 0 0 0.5 100 0 0 100
NCHAN 2
FX 1
TRACKID {D098F2BD-6569-F946-9F66-5C0548DFE5B1}
PERF 0
MIDIOUT -1
MAINSEND 1 0
<ITEM
POSITION 0
SNAPOFFS 0
LENGTH 12.5
LOOP 0
ALLTAKES 0
FADEIN 1 0 0 1 0 0 0
FADEOUT 1 0 0 1 0 0 0
MUTE 0 0
SEL 0
IGUID {96281C1B-0CD8-7A4C-BC7B-83E34DB38B24}
IID 4
NAME "Welcome Pad - stem"
VOLPAN 1 0 1 -1
SOFFS 0
PLAYRATE 1 1 0 -1 0 0.0025
CHANMODE 0
GUID {D46D1639-7253-D040-86A3-47C6E3A0FBCB}
<SOURCE WAVE
FILE "Media/sidechain-distortion_stems_Welcome Pad.wav"
>
>
>
<TRACK {F4D9FA0E-571B-E24E-B158-4F619AA188D8}
NAME Filtered
PEAKCOL 16576
BEAT -1
AUTOMODE 0
PANLAWFLAGS 3
VOLPAN 0 0 -1 -1 1
MUTESOLO 0 0 0
IPHASE 0
PLAYOFFS 0 1
ISBUS 0 0
BUSCOMP 0 0 0 0 0
SHOWINMIX 1 0.6667 0.5 1 0.5 0 0 0
FIXEDLANES 9 0 0 0 0
SEL 0
REC 0 0 1 0 0 0 0 0
SEL 1
REC 0 5088 1 7 0 0 0 0
VU 2
TRACKHEIGHT 0 0 0 0 0 0 0
INQ 0 0 0 0.5 100 0 0 100
NCHAN 2
FX 1
TRACKID {F4D9FA0E-571B-E24E-B158-4F619AA188D8}
TRACKID {93E699D9-F890-234E-A113-7E0053A85B78}
PERF 0
MIDIOUT -1
MAINSEND 1 0
<FXCHAIN
WNDRECT 847 421 815 444
SHOW 2
LASTSEL 1
DOCKED 0
BYPASS 0 0 0
<JS "Geraint's JSFX/Utility/Panalysis/Panalysis.jsfx" ""
1 0 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>
<JS_SER
zczMPQAAAAAAAAAA
>
FLOATPOS 0 0 0 0
FXID {6A5C4484-079E-F34D-8A18-CB456B094205}
WAK 0 0
BYPASS 0 0 0
<VST "VST: ReaEQ (Cockos)" reaeq.vst.dylib 0 "" 1919247729<56535472656571726561657100000000> ""
cWVlcu5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAAAAAAIAAAAAAAAAagAAAAEAAAAAABAA
IQAAAAIAAAAEAAAAAQAAAMS7LCro8zZAAAAAAAAA8D9GtvP91Hj1PwEDAAAAAQAAAHj7zCB2ucJAdouc1Fqk9D8QWDm0yHbyPwEBAAAAAQAAAAAAAAAAAPA/AAAAAEAC
AABrAQAAAgAAAA==
AAAQAAAA
>
FLOATPOS 0 0 0 0
FXID {5262179C-F519-424F-8C34-4765E9AE04E7}
WAK 0 0
>
<ITEM
POSITION 0
SNAPOFFS 0
LENGTH 12.5
LOOP 0
ALLTAKES 0
FADEIN 1 0 0 1 0 0 0
FADEOUT 1 0 0 1 0 0 0
MUTE 0 0
SEL 1
IGUID {102A7029-390F-704B-AE82-A4E1AA02CD03}
IID 8
NAME "Welcome Pad - stem"
VOLPAN 1 0 1 -1
SOFFS 0
PLAYRATE 1 1 0 -1 0 0.0025
CHANMODE 0
GUID {6D40E4DA-D9A6-5149-915A-965CEB60DCAE}
<SOURCE WAVE
FILE "Media/sidechain-distortion_stems_Welcome Pad.wav"
>
>
>
<TRACK {F52BCBA5-0B54-6B40-8D30-4E09891F36EC}
NAME Drums
PEAKCOL 16576
BEAT -1
AUTOMODE 0
PANLAWFLAGS 3
VOLPAN 0 0 -1 -1 1
MUTESOLO 1 0 0
IPHASE 0
PLAYOFFS 0 1
ISBUS 0 0
BUSCOMP 0 0 0 0 0
SHOWINMIX 1 0.6667 0.5 1 0.5 0 0 0
FIXEDLANES 9 0 0 0 0
SEL 0
REC 0 0 1 0 0 0 0 0
VU 2
TRACKHEIGHT 0 0 0 0 0 0 0
INQ 0 0 0 0.5 100 0 0 100
NCHAN 2
FX 1
TRACKID {F52BCBA5-0B54-6B40-8D30-4E09891F36EC}
PERF 0
MIDIOUT -1
MAINSEND 1 0
<FXCHAIN
WNDRECT 900 170 815 444
SHOW 0
LASTSEL 0
DOCKED 0
BYPASS 0 0 0
<VST "VST: ReaEQ (Cockos)" reaeq.vst.dylib 0 "" 1919247729<56535472656571726561657100000000> ""
cWVlcu5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAAIAAAABAAAAAAAAAAIAAAAAAAAAagAAAAEAAAAAABAA
IQAAAAIAAAADAAAAAQAAAJ0Q6aODFJFAAAAAAAAA8D+amZmZmZnpPwEEAAAAAQAAADNAfmGLZFZANFOMBg1H7z9/arx0kxjsPwEBAAAAAQAAAModDNkGk/o/AAAAAEAC
AABrAQAAAgAAAA==
AAAQAAAA
>
FLOATPOS 0 0 0 0
FXID {4CCB9CFD-8185-AE45-8B5D-ADB8ED3C4344}
WAK 0 0
>
<ITEM
POSITION 0
SNAPOFFS 0
LENGTH 12.5
LOOP 1
ALLTAKES 0
FADEIN 1 0 0 1 0 0 0
FADEOUT 1 0 0 1 0 0 0
MUTE 0 0
SEL 0
IGUID {AEF812EA-814E-294B-8BFA-79DB6C6C36A2}
IID 1
NAME Drums.wav
VOLPAN 1 0 1 -1
SOFFS 0
PLAYRATE 1 1 0 -1 0 0.0025
CHANMODE 0
GUID {DE8AA9D2-A674-E747-9071-19071A8A8C7E}
<SOURCE WAVE
FILE "Media/Drums.wav"
>
>
>
>

View File

@ -3,6 +3,7 @@
# define LOG_EXPR(expr) std::cout << #expr " = " << (expr) << std::endl;
#endif
#include "signalsmith-basics/analyser.h"
#include "signalsmith-basics/crunch.h"
#include "signalsmith-basics/limiter.h"
#include "signalsmith-basics/reverb.h"
@ -24,7 +25,7 @@ bool clap_init(const char *path) {
CLAP_PLUGIN_FEATURE_AUDIO_EFFECT,
CLAP_PLUGIN_FEATURE_DISTORTION,
});
plugins.add<signalsmith::basics::LimiterSTFX>({
.clap_version = CLAP_VERSION,
.id = "uk.co.signalsmith.basics.limiter",
@ -38,7 +39,7 @@ bool clap_init(const char *path) {
CLAP_PLUGIN_FEATURE_AUDIO_EFFECT,
CLAP_PLUGIN_FEATURE_LIMITER,
});
plugins.add<signalsmith::basics::ReverbSTFX>({
.clap_version = CLAP_VERSION,
.id = "uk.co.signalsmith.basics.reverb",
@ -52,6 +53,21 @@ bool clap_init(const char *path) {
CLAP_PLUGIN_FEATURE_AUDIO_EFFECT,
CLAP_PLUGIN_FEATURE_REVERB,
});
plugins.add<signalsmith::basics::AnalyserSTFX>({
.clap_version = CLAP_VERSION,
.id = "uk.co.signalsmith.basics.analyser",
.name = "[Basics] Analyser",
.vendor = "Signalsmith Audio",
.url = "",
.manual_url = "",
.support_url = "",
.version = "1.0.0"
}, {
CLAP_PLUGIN_FEATURE_AUDIO_EFFECT,
CLAP_PLUGIN_FEATURE_DISTORTION,
});
return plugins.clap_init(path);
}
void clap_deinit() {

View File

@ -1,8 +1,34 @@
#include "clap/entry.h"
/*
#include "../../stfx/clap/stfx-clap.h"
extern bool clap_init(const char *);
stfx::clap::Plugins stfxPlugins;
extern void addAnalyser();
extern void addCrunch();
extern void addLimiter();
extern void addReverb();
bool clap_init(const char *path) {
static bool added = false;
if (!added) {
addAnalyser();
addCrunch();
addLimiter();
addReverb();
}
return added = stfxPlugins.clap_init(path);
}
void clap_deinit() {
stfxPlugins.clap_deinit();
}
const void * clap_get_factory(const char *id) {
return stfxPlugins.clap_get_factory(id);
}
*/
extern bool clap_init(const char *path);
extern void clap_deinit();
extern const void * clap_get_factory(const char *);
extern const void * clap_get_factory(const char *id);
extern "C" {
const CLAP_EXPORT clap_plugin_entry clap_entry{

View File

@ -0,0 +1 @@
#include "../../analyser.h"

1
modules/linear Submodule

@ -0,0 +1 @@
Subproject commit 157b448e390663e78d845ca9f8dad65140f686ad

View File

@ -20,7 +20,7 @@ struct Plugin;
// A helper to make a CLAP plugin factory from STFX templates
struct Plugins {
template<template<class> class EffectSTFX, class ...Args>
void add(clap_plugin_descriptor desc, std::initializer_list<const char *> features, Args ...args) {
size_t add(clap_plugin_descriptor desc, std::initializer_list<const char *> features, Args ...args) {
size_t index = featureLists.size();
featureLists.emplace_back(features);
@ -31,6 +31,7 @@ struct Plugins {
creates.push_back([=](const clap_host *host){
return new Plugin<EffectSTFX>(*this, &descriptors[index], host, args...);
});
return index;
}
bool clap_init(const char *path) {
@ -651,3 +652,5 @@ struct Plugin : public clap_plugin {
};
}} // namespace
extern stfx::clap::Plugins stfxPlugins;

View File

@ -1,6 +1,7 @@
#pragma once
#include "./storage.h"
#include "../stfx-library.h" // for the ...ParamIgnore classes
namespace stfx { namespace storage {

View File

@ -9,6 +9,7 @@
#include <functional>
#include <atomic>
#include <memory>
#include <iostream> // we log to stderr if our queue gets full
namespace stfx { namespace web {