Git Product home page Git Product logo

master_me's Introduction

Installers & Compatibility

here are the latest installers:
https://github.com/trummerschlunk/master_me/releases

Supported OS: Linux, macOS, Windows.

Plugin Formats: CLAP, VST, VST3, AU, LV2.

Standalone: Jack.

AAX is not supported (yet). master_me can be used in PROTOOLS via a VST-AAX wrapper (like Blue Cat's Patchwork).

master_me

Automatic audio mastering plugin for live-streaming and internet radio stations.

Introduction

With the first Covid-19 related lock-downs in 2020, many real-life concerts, conferences and festivals were forced into the digital domain - and sounded pretty crappy. Having worked for almost 20 years in audio mastering, Berlin based engineer Klaus Scheuermann started to develop master_me - a word fusion of automatic mastering and mini-me - in order to make open source streaming sound better. After a few weeks of learning and development, master_me was first used at the 'Quarantine Sessions' - a weekly distributed electro-acoustic improvised concert, hosted at Stanford's CCRMA Institute. master_me was developed further to be an easy-to-use tool for all live streaming applications. In 2022 it was funded by the Prototype Fund, an open source software funding initiative by the german ministry of education and research. A stable release is available since September 2022.

Who is master_me for?

master_me is for all live streamers and internet radio stations.

What is mastering

The term 'mastering' usually refers to the last step of sound manipulation in the audio production process. Historically the vinyl master was used to duplicate records. Nowadays a digital master is the file which is being duplicated and distributed to streaming or download platforms.

What is master_me

master_me is a multi platform, free and open source audio plug-in which optimizes sound in live streaming situations. Introducing no latency, it takes care of master levels and ‘polishes’ the sound with a chain of effects, closely modeled after the audio chain of Klaus Scheuermann’s mastering studio in Berlin, Germany.

Although tempting, it is NOT intended to automatically master your recorded music. Your art deserves closer, offline attention.

Nevertheless, certain modules of master_me can be a valuable tool as part of your music mastering chain.

Open Source and licensing

master_me is licensed under GPL3, see the LICENSE file for more details.

System requirements and compatibility

master_me is available in LV2, VST2, VST3 and CLAP formats for Linux, macOS and Windows, plus JACK Standalone for some systems.

Due to faust and its open architecture, it can possibly be compiled to a vast variety of target platforms not mentioned above.

Contributors

Concept and idea: Klaus Scheuermann
DSP: Klaus Scheuermann (trummerschlunk), Bart Brouns (magnetophon), Robin Gareus (x42), Jakob Dübel (jkbd)
GUI, Plugin: Filipe Coelho (falkTX)
Logo, Artwork: Peter Schlossnikel

More contributions from: Julius Smith, Dario Sanfilippo, Stéphane Letz, Romain Michon, Yann Orlarey, the Faust community.

master_me's DSP is written in Faust.
GUI and Plugin based on DPF (DISTRHO Plugin Framework).

Thanks to

The Faust community and everyone who supported the project.

Sponsor

master_me is sponsored by the Prototype Fund, an open source software funding initiative by the German Federal Ministry of Education and Research.

Quickstart

After Installation, load the plugin on the master channel of your streaming software or DAW.

Choose a preset.

Adjust a target-loudness (optional).

Interface

Handling

  • Click and drag any parameter vertically or horizontally (except the target slider which only has vertical movement)
  • Shift + click to reset to default
  • Ctrl + drag to go slower
  • Double-click a slider for manual text input

Easy Mode

The 'Easy' mode is a very reduced GUI to make master_me an easy-to-use tool for all content creators.

Only two choices can be made: choose a preset and set the desired target loudness

screenshot

Expert Mode

screenshot

Concept

The main concept of master_me is the combination of a leveler and a chain of dynamics processors.

The leveler can be seen as a big volume knob which you would grab, when the sound is too low or too high for your taste.

The following chain is designed to result in a natural, balanced and consistent sound if it is hit at the right level (->leveler). It will take care of peaks in the audio, like short loud noises and balance the frequency spectrum.

There are some additional modules before the leveler for your convenience.

Signal Flow

  • Pre-processing
  • Gate
  • EQ
  • Leveler
  • Knee Compressor
  • Multiband Mid-Side Compressor
  • Limiter
  • Brickwall

DSP signal flow

Modules

Module: pre-processing

The ‘pre-processing’ module contains:

  • a gain-slider to apply gain to the incoming signal before it hits master_me.
  • a ‘mono’ switch
  • phase switches for both left and right channels
  • ‘stereo-correct’ switch (custom designed process, see 'stereo-correct')

Module: gate

A simple noise gate with the following parameters:

  • threshold
  • attack
  • release

Module: EQ

The EQ offers some simple tools for frequency spectrum manipulation. The parameters are:

  • highpass frequency: the cutoff frequency of a soft highpass filter
  • tilt-gain: gain of a 'tilt' equalizer, which will bend the frequency spectrum either to the higher frequencies or the lower frequencies.
  • side-eq gain: gain parameter of the 'side-eq' which boosts a certain frequency range in the side signal in order to make the sound 'wider'.
  • side-eq frequency: center frequency of the side-eq
  • side-eq bandwidth: width of the side-eq

Module: leveler

The leveler is the most critical part of master_me. It will listen to the incoming signal and adjust it's volume to meet the target loudness. In order to make this as smooth and natural as possible, a complex algorithm was designed. The following parameters can be set:

  • target loudness: in lufs, a slider also available in 'easy' mode, next to the input meters on the left). Typical target loudness values are -18lufs for video streaming, -14lufs for podcasting, -23lufs for EBU broadcast standard.
  • brake threshold: this parameter is used by the leveler to detect silence. When silence is detected, the leveler 'freezes' and waits for incoming audio before it continues to adjust the loudness.
  • max +: determines the maximum amount of positive gain the leveler can apply to the incoming signal
  • max -: determines the maximum amount of negative gain the leveler can apply to the incoming signal
  • the brake-meter shows silence detection.

Module: knee compressor

The knee compressor is a slow and soft mid-side compression module. It functions as a subtile, swinging compressor. Typical equivalents in the analog domain would be a Manley Stereo VARIABLE MU® compressor or a Vertigo VSC-2. The following parameters can be set:

  • strength: correlating to the ratio of compression. 0% equals a ratio of 1:1, 100% equals a ratio of 1:infinity
  • tar-thresh: offsets the compressors threshold, dependent on the target loudness.
  • attack: compressor's attack time in milliseconds
  • release: compressor's release time in milliseconds
  • knee: compressor's knee in dB
  • link: amount of gain reduction linking between mid and side channels
  • ff-fb: feedforward-feedback determines, where the compressor receives it's side-chain signal from. feedforward is the input of the compressor, feedback is the output of the 'brickwall' module.
  • make-up: simple gain makeup after compression
  • dry-wet: fades between the input signal and the compressed signal
  • the meters show the amount of compression on each channels

Module: multiband mid/side compressor

Being perhaps the most complicated module of master_me, this module works like this:

The audio is first converted from stereo to mid-side and then split into 8 frequency bands. The parameters apply to the lowest band (low) and the highest band (high). For the 6 bands in between, the parameters are interpolated between 'low' and 'high'.

The parameters for the lowest and highest band are:

  • strength: correlating to the ratio of compression. 0% equals a ratio of 1:1, 100% equals a ratio of 1:infinity
  • tar-thresh: offsets the band's threshold, dependent on the target loudness.
  • attack: band's attack time in milliseconds
  • release: band's release time in milliseconds
  • knee: band's knee in dB
  • link: amount of gain reduction linking between mid and side channels
  • crossover: the lowest and highest crossover frequencies can be set here. All crossovers in between will be interpolated.
  • the upper row of meters shows the gain reduction for all eight mid channels
  • the lower row of meters shows the gain reduction for all eight side channels

Module: limiter

The 'limiter' it is rather a sound-shaping limiter than a clip-protection limiter. It's equivalents in the analog domain would typically be a Chandler TG-1 or a UREI 1178. Although the limiter can apply high compression ratios, it will not prevent from digital overshoots higher than threshold (which the brickwall module will take care of). The parameters are:

  • strength: correlating to the ratio of compression. 0% equals a ratio of 1:1, 100% equals a ratio of 1:infinity
  • tar-thresh: offsets the limiter's threshold, dependent on the target loudness.
  • attack: limiter's attack time in milliseconds
  • release: limiter's release time in milliseconds
  • knee: limiter's knee in dB
  • ff-fb: feedforward-feedback determines, where the limiter receives it's side-chain signal from. feedforward is the input of the limiter, feedback is the output of the limiter.
  • make-up: simple gain makeup after limiting.
  • gain reduction meter: shows gain reduction applied to the signal.

Module: brickwall

The 'brickwall' module is the last process in master_me's chain of modules. It is a fast brickwall limiter which will not allow any peaks above the desired 'ceiling'. The 'brickwall' process is a protection limiter and will not sound nice, if it needs to work a lot.

custom module: stereo correct

this process was custom developed for the Chaos Computer Club's VOC (video operation center). It constantly checks the phase of an incoming signal.

If phase == 1, all audio is made mono. If phase == -1, one channel is phase switched and the audio is monofied.

This helps detect and fix broken audio signals and unwanted panning.

Building

Build requirements: gcc or clang as compiler, faust, faustpp and gnu make

On Linux the following extra development libraries are needed:

  • OpenGL
  • X11
  • Xext
  • Xrandr

Runtime requirements: OpenGL2 capable graphics card (or software rendering via MESA on Linux)

Once requirements are in place, simply run:

git submodule update --init --recursive
make

Build "legacy" generic faust UI for JACK

faust2jack soundsgood.dsp
# then run as ./soundsgood

master_me's People

Contributors

falktx avatar magnetophon avatar trebmuh avatar trummerschlunk avatar x42 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

master_me's Issues

Use `stdfaust.lib` for smoothing

I think, lp1p(cf) is identical to si.smooth(ba.tau2pole(foo)) with foo = 1/(2*ma.PI*cf).

I looked at the C++-Code generated from

process = _ <: lp1p(cf), si.smooth(ba.tau2pole(1/(2*ma.PI*cf)))
with {
  cf = ma.E;
};

which yields

for (int i0 = 0; i0 < count; i0 = i0 + 1) {
	float fTemp0 = fConst1 * float(input0[i0]);

	fRec0[0] = fConst0 * fRec0[1] + fTemp0;
	output0[i0] = FAUSTFLOAT(fRec0[0]);
	fRec1[0] = fTemp0 + fConst0 * fRec1[1]; // summands swapped
	output1[i0] = FAUSTFLOAT(fRec1[0]);

	fRec0[1] = fRec0[0];
	fRec1[1] = fRec1[0];
}

I would prefer using the standard library. At first, lp1p(cf) made me think, "oh, super-elaborated ballistics going on".

advanced leveler

(moved to low-prio, as not critical for first release)

  • feedback circuit
  • expander in brake
  • scaled speeds for 'above target' and 'below target'
  • deadzone (strong break if feedback signal is close to target)
  • investigate 'rubberband effect' at higher 'length' for lk2_var

Texts for 'Easy' page

These are the texts for 'Easy' page:

Hi there,

master_me is a free and open source automatic mastering plugin for live streamers, podcasters and internet radio stations.

You are currently in “Easy” mode.
Select a preset from the bottom and forget about it.

Choose “Expert” mode to see and tweak what's under the hood.

Happy streaming!

And on the right side:

master_me
A plugin by Klaus Scheuermann.
With contributions from falkTX, jkbd, magnetophon, x42 and others.
Made with Faust and DPF.
Supported by the Prototype Fund / German Federal Ministry of Education and Research.

Feature request: expose crossover frequencies.

IMHO, anybody who can handle the "expert" interface, will welcome being able to tweak the crossover frequencies.

crossoverFreqs = vslider("v:soundsgood/t:expert/h:[5]mscomp/h:[1]low band/[1]mscomp low freq", 60, 20, 20000, 1),vslider("v:soundsgood/t:expert/h:[5]mscomp/h:[2]high band/[1]mscomp high freq", 8000, 20, 20000, 1):LogArray(Nr_crossoverFreqs);

Make target slider -2dB max

As previously discussed.

Ticket serves as reminder and to check on progress on the task. Which as of now is still TODO.

Multiband compressor introduces phase smearing

I did a few listening tests, and the confirmed this by measurement. The LR4 cross-over network used by the mscomp adds a 180 deg phase-shift where bands overlap:

mscomp-phase-smearing

A multiband compressor is commonly implemented:

  • Band-split the key signal (x-over network of LR4 is fine here)
  • Analyze each freq band, calculate compression gain
  • Use shelving filters to apply the gain to the signal

I've whipped up some FAUST code for this which should be straight forward to integrate here.

https://gist.github.com/eeb2aa9f9cc4a9083fb2cf2d86645c9a

@magnetophon Since you have significantly contributed to FAUST's compressor lib, you may be interested in this as well.

who wins, when leveler and limiters fight against each other? max-gain!

There is one problematic situation with the new feedback concept of the leveler (which works so nicely now):

If target is higher than possible with the settings of limiter and brickwall, they will fight against each other resulting in maximum gain of the leveler.

I think it cannot be avoided, but with limiting certain ranges.
An 'expert' will not set these settings.

What are your ideas on that?

presets

there are two kinds of presets:

  • preset buttons on easy page
  • plugin presets loadable from DAW

todo on dsp/faust side:

  • 5 nice 'easy' presets (high-prio)

todo on gui side:

  • store and load preset data (high-prio)
  • export lv2 presets
  • deal with parameter changes after preset load (mid-prio)

Missing parameter units

A few parameters do not have units, this ticket serves to track down these and possibly make a decision on them.

Switches (including bypass) do not need them.
But others should have them, if possible.

(Personally I find 0-100% more readable than 0.0-1.0 raw values)

Current parameters without unit:

  • leveler gain (passive)
  • leveler gate (passive)
  • gate attack
  • gate hold
  • gate release
  • leveler speed
  • leveler max+
  • leveler max-
  • eq tilt gain typo (db vs dB)
  • eq side gain typo (db vs dB)
  • eq side bandwidth
  • kneecomp strength
  • kneecomp knee
  • kneecomp link
  • kneecomp fffb
  • kneecomp drywet
  • everything in mscomp except output gain (active)
  • limiter strength
  • limiter attack
  • limiter release
  • limiter fffb
  • limiter knee

very high cpu usage

opening a ticket to generate a discussion around this.
currently the plugin is quite heavy, ideas for optimizing its cpu usage would be quite welcome.

we could try a few compiler optimization flags and see what works best.
also reducing the gui-oriented calls on the dsp side, as mentioned in other tickets.

this can be a blocker for some people doing live-streams, as the capturing + recording takes a significant amount of cpu. if audio processing does too, the system might not be that much responsive when all parts are on.

kneecomp: order of gui elements in faust/faustlive

Am am not seeing it... why are parameters displayed in wrong order?

sc_compressor =
    (
        (ms_enc,ms_enc):
        (((RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,0,link,N)),si.bus(N) )
         : ro.interleave(N,2) : par(i,N,(meter : post_gain : ba.db2linear*(1-bypass)+bypass)*_))
        : ms_dec)
with {
    N = 2;
    bypass = checkbox("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_bypass][1]kneecomp bypass"):si.smoo;
    strength = vslider("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_strength][2]kneecomp strength", 0.1, 0, 1, 0.1);
    thresh = target + vslider("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_threshold][unit:dB][3]kneecomp threshold",init_kneecomp_thresh,-12,6,1);
    att = vslider("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_attack][unit:ms][4]kneecomp attack",40,1,100,1)*0.001;
    rel = vslider("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_release][unit:ms][5]kneecomp release",200,1,1000,1)*0.001;
    knee = vslider("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_knee][6]kneecomp knee",6,0,30,1);
    link = vslider("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_link][7]kneecomp link", 0.6, 0, 1, 0.1);
    meter = _<: _,( vbargraph("v:soundsgood/t:expert/h:[5]kneecomp/[unit:dB]",-6,0)) : attach;

    // dev version of faust has this in the libs, TODO, use co.RMS_compression_gain_N_chan_db
    RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,1) =
        RMS_compression_gain_mono_db(strength,thresh,att,rel,knee,prePost);

    RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,N) =
        par(i,N,RMS_compression_gain_mono_db(strength,thresh,att,rel,knee,prePost))
        <: (si.bus(N),(ba.parallelMin(N) <: si.bus(N))) : ro.interleave(N,2) : par(i,N,(it.interpolate_linear(link)));

    RMS_compression_gain_mono_db(strength,thresh,att,rel,knee,prePost) =
        RMS(rel) : ba.bypass1(prePost,si.onePoleSwitching(att,0)) : ba.linear2db : gain_computer(strength,thresh,knee) : ba.bypass1((prePost!=1),si.onePoleSwitching(0,att))
    with {
        gain_computer(strength,thresh,knee,level) =
            select3((level>(thresh-(knee/2)))+(level>(thresh+(knee/2))),
                    0,
                    ((level-thresh+(knee/2)) : pow(2)/(2*max(ma.EPSILON,knee))),
                    (level-thresh))
            : max(0)*-strength;
        RMS(time) = ba.slidingRMS(s) with {
            s = ba.sec2samp(time):int:max(1);
        };
    };
    //post_gain
    post_gain =
        _+
        (vslider("v:soundsgood/t:expert/h:[5]kneecomp/[symbol:kneecomp_makeup][unit:dB][8]kneecomp makeup", init_kneecomp_postgain,-10,+10,0.5) :si.smoo);
};

image

avoid sqrt() calls in inner loop DSP for mid/side calc

https://github.com/trummerschlunk/soundsgood/blob/e8eb9ba756971c22c5da8ca5a1f887f9f342faac/soundsgood.dsp#L395

One usually uses a factor or 0.5 when converting left/right to mid/side and then just sums for the inverse

mid = 0.5 * (left + right)
side = 0.5 * (left - right)

and then

left = mid + side
right  = mid -side

As opposed to the sqrt() approach, this also ensure that the mid value will not exceed 1.0, if both source values are below 1.0.

Note multiply by 0.5, which is faster than diving by two (although some compilers change this with fast-math)

level meters are mono

More like a question, not sure if this is intentional or not but currently seems all meters are mono.
Is this on purpose?

leveler gate -> leveler brake

As the silence detection function s not a gate anymore, but an expander which puts a 'brake' on 'speed', it needs renaming.

leveler_gate meter -> leveler_brake meter
leveler_gate_threshold -> leveler_brake_threshold

symbols and labels

Oddities with leveler gate meter values

The leveler gate meter has % unit, but range of 0 to 1.
Plus minimum value only seems to ever each 0.143, which is weird

Currently looks wrong on the gui too, as it does not behave like all the other meters.
For this one we want the meter to go from left to right, correct? (ie, from 0 to 100%..?)

GUI related issues and ideas

  • target fader needs some label 'target'
  • mb-ms-comp: name needs multiband reference. Let's make it 'Multiband MidSide Comp'. Hope it fits.
  • mb-ms-comp: numeric readout or scale on the meters.
  • mb-ms-comp: rename 'output-gain' to 'makeup'
  • mb-ms-comp: put 'low' and 'high' below the paramters, so parameters are in horizontal line with kneecomp and limiter.
  • all: separator before meters without 'Outputs:'
  • 'enable' left of pluginname?
  • change plugin name to 'master_me'
  • gate meter missing

side eq

I implemented a 'side eq'.

desired function: boost on the side signal in an area (width) around a center frequency (eq side freq) by an amount in dB (eq side gain)

It's done with a bandpass filter added to the source signal.

  1. I am having trouble calculating the loudness of the bandpass so it feels like a parametric eq. (0 adds nothing, +x adds x db)

  2. My from width to low and high frequency of the bandpass is messy and broken in low frequencies.

Help needed...

error building under macOS 11 with homebrew faust

Getting this error on macOS 11, for the CI automated build:

ERROR : path '/soundsgood/expert/mscomp_meter/1' is already used

any hints?

issue does not happen on macOS 12 or on Linux, so perhaps a faust side issue?

Dealing with keyboard input on plugin hosts

Reaper by default does not give plugin UIs keyboard focus, which makes it super easy to press backspace and have it delete the plugin 😡

It is the same issue as dealt in DISTRHO/Cardinal#304
We need the same hacks here too, likely best pushed as direct DPF functionality.

Project Title

Dear all,

I have been wrapping my head around this for quite some time now.
I kind of like 'soundsgood' as the name for a tool you throw at the master and hopefully then it 'soundsgood'.

I also like master_me as the project from which this one came...

So. If you have any other ideas for naming this beast, please share - thank you!

giving names and symbols to compressor gain reduction controls

There is commented code around the compressor gain reduction naming part:

  //meter(i) = _<:(_, (ba.linear2db:max(-40):min(0):vbargraph("v:soundsgood/t:expert/h:[6]mscomp_meter/[%i][unit:dB]%i[tooltip: gain reduction in dB]", -3, 0))):attach;
  meter(i) = _<:(_, (ba.linear2db:max(-40):min(0):vbargraph("v:soundsgood/t:expert/h:[6]mscomp_meter/[%i][unit:dB][tooltip: gain reduction in dB]", -3, 0))):attach;

From what I could understand, these are dynamic stereo controls, so giving a name makes it appear duplicate.

I guess it is commented out until a solution is found.
This ticket can serve as a reminder, as we need this for the plugin version too.

slider double-click

A ticket to discuss the double-click text input topic in particular.

Few things to do:

  • make font size match theme one
  • make highlight color match current slider background color?
  • ensure no right-click menus can be used (would go into imgui widgets, which dont match plugin ones)

after those are done, we will need testing.

Expose a few more parameters, increase some ranges.

I understand that the main goal is to make more or less subtle corrections to the audio based on presets.

At the same we want to expose te expert interface as well.
It would be nice if that one allows to do heavy corrections or creative sound design.

Finally, I think the plugin would become more intuitive to work with if all similar parameters and displays have the same range.
With a consistent mapping between the visual position of a fader (or meter) and it's meaning you can get used to them quicker and focus on the sound more.

Therefore, I propose the following ranges:

  • all GR meters to -24 dB - 0 dB
  • all thresholds -24 dB to +24 dB
  • all makeup gains -24 dB to +24 dB
  • all eq gains -24 dB to +24 dB
  • all knee parameters exposed (so every compressor and limiter you choose to include), range -24dB to 0dB
  • all attack & release 0 to 1000 ms, log scale (IIUC a log scale cannot start at 0, so in reality ths needs to be a 'faked' log scale)
  • hp freq 0 to 1000 Hz, 'faked' log scale.
  • all eq freqs 20 Hz to 20 kHz
  • all comp strengths 0 to 8, ideally with 1 being the middle.
  • make each dynamics block have the option of MS or stereo.

IO level meters have init/default/start at 0dB

Either something wrong in faust, or the way the meters are defined.
The "init" or default value for the level meters (and maybe others, not sure) is 0dB instead of the expected matching minimum.

This makes it so that, under a few hosts, the UI starts with the meters at 0dB and trigger the falloff on start.

Would be nice if the init/default values for level meters would be set as its minimum (as if there was no audio) instead of 0dB as it is now.

whole code only works with compiler option -double

I am not 100% sure, but I guess it's a problem wit ma.EPSILON..?
Does the -double option make the code more cpu-heavy?

With the need for '-double' I can't use the faustide.grame.fr which I find quite comfortable.

Which IDEs do you guys use? I went for ATOM and Faustlive. Not too slick...

sync level meters output with GUI drawing

this is an issue as a form of question, because I dont know faust enough to understand how this is typically done.

we want to have level meters on the gui, but in order to make these meters actually useful the dsp level-meter side needs to keep going until notified by the ui that it has read the meter values.

the amateur approach is typically to calculate RMS and other values within a process cycle, every cycle, and set the passive / output meter value to that.
this is not a good approach, as the meter values would then be block-size dependent. also there could be several meter values calculated and reset before the GUI even shows a single one..
in short, level meters should run as commanded by the UI.

the flow is typically:

  1. plugin is running, no UI visible yet. plugin has internal values for level metering but we skip them to save cpu load
  2. UI is open, and tells dsp to start level meter stuff
  3. dsp now has level metering active, and keep setting the level-meter value(s) across several audio cycles (that is, the maximum or average value keeps being calculated until told otherwise)
  4. UI repaint happens, it reads the last level-meter value(s) and tells the dsp to start again
  5. dsp sets its internal maximum/average to 0 and continues with the level-metering, same as step 3
  6. another UI repaint, same as step 4
  7. steps 5 and 6 keep going while UI is open
  8. UI is closed, it tells the dsp side it can stop the level metering

There are possible deviations to this, we can keep level metering active with a fixed time (in ms) if we want for example lv2 control outputs to have useful values even while UI is not open.

now my question is... how do we deal with this with faust?
can we specify a time-window for the metering? can it run "forever" (not bound to time) and wait for a signal to reset its internal values?

dsp code TODOs

  • global bypass

  • leveler: try expander instead of gate for silence detection

  • leveler: fix wrong calculation

  • side-eq: try different shelf eqs

  • kneecomp: drywet control (after makeup)

  • kneecomp: feedforward/feedback control

  • limiter: try different limiters available in faust

Tracking plugin version progress

I am making a DPF-based plugin version for soundsgood, with faustpp for the templating stuff, which nicely gets us a C++ class with some filled in values based on a template.
Check the dpf branch for current progress, there are builds via github actions too.

Also see #23 for the GUI sketches, where discussion on the layout and other high level concepts should happen.
This ticket is only about the implementation, and mostly so others can easily follow current progress.
We can assume I will do all these things, anything that requires intervention I will open as separate tickets.

Current TODO for plugin/dsp side:

  • implement custom bypass
  • report latency to host (is there a final decision whether to use faust modules that use latency?, related to #13)
  • properly name all parameters (depends on #22)
  • update static lv2 ttl to match dpf exported one (for handling states)

Current TODO for UI appearance:

  • define and implement consistent color palette
  • finalize widget styling

Current TODO for UI widgets:

  • easy vs expert mode switch (stored as plugin state)
  • finalize lufs meters
  • finalize gain reduction meter (db scaling for drawing)
  • allow both horizontal and vertical drag for parameter sliders
  • target slider dragging offset with correct dB scaling

Current TODO for UI layout:

  • finish easy mode layout (non-final widgets, but everything mapped to params)
  • finish expert mode layout (non-final widgets, but everything mapped to params)
  • add arrows to expert mode
  • make UI scalable
  • show version/git-tag in UI

Current TODO for UI features:

  • reuse nanovg context across widgets (see #82)
  • slider double-click for text input of parameter values

Can be left for later or v1.1:

  • proper UI level metering (depends on #9 and #16)

Unclear at the moment:

  • how do we define presets? UI only or exported with plugin?
  • do we want UI to be resizable? or stick with only a small set of zoom factors?

What is the target environment?

In the best case, this software runs everywhere and shines with all the platform dependent details. Sure, beauty is our business.
But what is the most important niche, where it has to run properly as soon as possible? That is:

  • Operating System
  • Plug-in host or interface
  • GUI related environment

unbounded gate meter values

something seems wrong with the new gate meter.
it has a proper value where there is sound input, but cut the input and gate meter value gets lower and lower and lower... eventually stopping at -758.6 dB.

This seems like a bug..

Documentation

What's your favorite place and format of documentation for a plugin like this?

Wiki? Markup document?
Preferably here on the repo, right?

Optiimzation - avoid log() calls in inner loop

https://github.com/trummerschlunk/soundsgood/blob/e8eb9ba756971c22c5da8ca5a1f887f9f342faac/soundsgood.dsp#L348

The value is for display only. With a custom GUI it's preferable to have the GUI call it.
Currently FAUST compiles this into the inner loop and calls log10() for each sample!

Since it's for display only, accuracy is not required you might want to investigate a fast_log implementation
https://www.flipcode.com/archives/Fast_log_Function.shtml

translations?

just wondering if there is a need or preference for translations.
germans typically like to see things in german 🇩🇪
but maybe audio production terms go with english? tbh I am not sure how german producers handle this.

just asking, setting up a switch for english | german mode is quite doable with the current code.

limiter: missing latency report

The brickwall limiter, when enabled, adds a a latency of 480 samples (@ 48kHz).
it's really limiter_lad_lookahead = 0.01; * ma.SR

When bypassing the limiter (or the whole effect), either the latency has to be reset to 0, or ideally a crossfade happens with a signal that is delayed by latency.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.