lmms icon indicating copy to clipboard operation
lmms copied to clipboard

Lv2: Do not duplicate mono plugins

Open JohannesLorenz opened this issue 1 year ago • 7 comments

This merges Lv2ControlBase and Lv2Proc into 1 class, as discussed in Discord.

The PR is preparation for adding L/R Routing, as proposed by @messmerd .

It already should be reviewed:

  1. Since the code was almost only moved between files, a code review over the whole PR seems overkill to me. The only interesting part is the Lv2Proc.cpp diff, as there, we now add together channel inputs and duplicate channel outputs for mono plugins, instead of duplicating processors.
  2. Testing should be versatile - in theory, anything Lv2 related could have gone wrong (but yet unlikely, due to copy and paste).

JohannesLorenz avatar Jul 21 '24 17:07 JohannesLorenz

Are there any mono Lv2 plugins you'd recommend testing this with?

messmerd avatar Jul 27 '24 04:07 messmerd

Are there any mono Lv2 plugins you'd recommend testing this with?

Any (though, for regression checks, testing stereo plugins will not harm). The following have a lot/only mono:

  • CALF
  • blop
  • fomp
  • blablack
  • guitarix (at least some)
  • LSP (there are mono variants of each effect)
Detailled list of mono plugins

http://calf.sourceforge.net/plugins/Analyzer http://calf.sourceforge.net/plugins/BassEnhancer http://calf.sourceforge.net/plugins/CompensationDelay http://calf.sourceforge.net/plugins/Compressor http://calf.sourceforge.net/plugins/Crusher http://calf.sourceforge.net/plugins/Deesser http://calf.sourceforge.net/plugins/Emphasis http://calf.sourceforge.net/plugins/EnvelopeFilter http://calf.sourceforge.net/plugins/Equalizer12Band http://calf.sourceforge.net/plugins/Equalizer30Band http://calf.sourceforge.net/plugins/Equalizer5Band http://calf.sourceforge.net/plugins/Equalizer8Band http://calf.sourceforge.net/plugins/Exciter http://calf.sourceforge.net/plugins/Filter http://calf.sourceforge.net/plugins/Filterclavier http://calf.sourceforge.net/plugins/Flanger http://calf.sourceforge.net/plugins/Gate http://calf.sourceforge.net/plugins/HaasEnhancer http://calf.sourceforge.net/plugins/Limiter http://calf.sourceforge.net/plugins/MonoCompressor http://calf.sourceforge.net/plugins/MonoInput http://calf.sourceforge.net/plugins/MultiChorus http://calf.sourceforge.net/plugins/MultiSpread http://calf.sourceforge.net/plugins/MultibandCompressor http://calf.sourceforge.net/plugins/MultibandEnhancer http://calf.sourceforge.net/plugins/MultibandGate http://calf.sourceforge.net/plugins/MultibandLimiter http://calf.sourceforge.net/plugins/Phaser http://calf.sourceforge.net/plugins/Pitch http://calf.sourceforge.net/plugins/Pulsator http://calf.sourceforge.net/plugins/Reverb http://calf.sourceforge.net/plugins/ReverseDelay http://calf.sourceforge.net/plugins/RingModulator http://calf.sourceforge.net/plugins/RotarySpeaker http://calf.sourceforge.net/plugins/Saturator http://calf.sourceforge.net/plugins/SidechainCompressor http://calf.sourceforge.net/plugins/SidechainGate http://calf.sourceforge.net/plugins/SidechainLimiter http://calf.sourceforge.net/plugins/StereoTools http://calf.sourceforge.net/plugins/TapeSimulator http://calf.sourceforge.net/plugins/TransientDesigner http://calf.sourceforge.net/plugins/VintageDelay http://calf.sourceforge.net/plugins/Vinyl http://calf.sourceforge.net/plugins/XOver2Band http://calf.sourceforge.net/plugins/XOver3Band http://calf.sourceforge.net/plugins/XOver4Band http://distrho.sf.net/plugins/Kars http://distrho.sf.net/plugins/MaBitcrush http://distrho.sf.net/plugins/MaFreeverb http://distrho.sf.net/plugins/MaPitchshift http://distrho.sf.net/plugins/Nekobi http://distrho.sf.net/plugins/glBars http://drobilla.net/plugins/blop/amp http://drobilla.net/plugins/blop/lp4pole http://drobilla.net/plugins/blop/pulse http://drobilla.net/plugins/blop/random http://drobilla.net/plugins/blop/sawtooth http://drobilla.net/plugins/blop/square http://drobilla.net/plugins/blop/sync_pulse http://drobilla.net/plugins/blop/sync_square http://drobilla.net/plugins/blop/tracker http://drobilla.net/plugins/blop/triangle http://drobilla.net/plugins/fomp/autowah http://drobilla.net/plugins/fomp/cs_chorus1 http://drobilla.net/plugins/fomp/cs_chorus2 http://drobilla.net/plugins/fomp/cs_phaser1 http://drobilla.net/plugins/fomp/cs_phaser1_lfo http://drobilla.net/plugins/fomp/mvchpf1 http://drobilla.net/plugins/fomp/mvclpf1 http://drobilla.net/plugins/fomp/mvclpf2 http://drobilla.net/plugins/fomp/mvclpf3 http://drobilla.net/plugins/fomp/mvclpf4 http://drobilla.net/plugins/fomp/parametric1 http://drobilla.net/plugins/fomp/pulse_vco http://drobilla.net/plugins/fomp/rec_vco http://drobilla.net/plugins/fomp/saw_vco http://drobilla.net/plugins/fomp/triple_chorus http://gareus.org/oss/lv2/b_whirl#extended http://gareus.org/oss/lv2/b_whirl#simple http://gareus.org/oss/lv2/darc#mono http://gareus.org/oss/lv2/dpl#mono http://gareus.org/oss/lv2/fat1 http://gareus.org/oss/lv2/fat1#microtonal http://gareus.org/oss/lv2/fat1#scales http://gareus.org/oss/lv2/fil4#mono http://gareus.org/oss/lv2/meters#BBCmono http://gareus.org/oss/lv2/meters#DINmono http://gareus.org/oss/lv2/meters#EBUmono http://gareus.org/oss/lv2/meters#K12mono http://gareus.org/oss/lv2/meters#K14mono http://gareus.org/oss/lv2/meters#K20mono http://gareus.org/oss/lv2/meters#NORmono http://gareus.org/oss/lv2/meters#SigDistHist http://gareus.org/oss/lv2/meters#TPnRMSmono http://gareus.org/oss/lv2/meters#VUmono http://gareus.org/oss/lv2/meters#bitmeter http://gareus.org/oss/lv2/meters#dBTPmono http://gareus.org/oss/lv2/meters#dr14mono http://gareus.org/oss/lv2/meters#spectr30mono http://gareus.org/oss/lv2/nodelay http://gareus.org/oss/lv2/nodelay#mega http://gareus.org/oss/lv2/nodelay#micro http://gareus.org/oss/lv2/onsettrigger#bassdrum_mono http://gareus.org/oss/lv2/phaserotate http://gareus.org/oss/lv2/sisco#Mono http://gareus.org/oss/lv2/spectra#Mono http://gareus.org/oss/lv2/testsignal http://gareus.org/oss/lv2/tuna#one http://gareus.org/oss/lv2/tuna#two http://gareus.org/oss/lv2/zeroconvolv#CfgMono http://gareus.org/oss/lv2/zeroconvolv#CfgMonoToStereo http://gareus.org/oss/lv2/zeroconvolv#Mono http://gareus.org/oss/lv2/zeroconvolv#MonoToStereo http://github.com/blablack/ams-lv2/dynamicwaves2_4 http://github.com/blablack/ams-lv2/dynamicwaves2_6 http://github.com/blablack/ams-lv2/dynamicwaves2_8 http://github.com/blablack/ams-lv2/dynamicwaves_4 http://github.com/blablack/ams-lv2/dynamicwaves_6 http://github.com/blablack/ams-lv2/dynamicwaves_8 http://github.com/blablack/ams-lv2/fftvocoder http://github.com/blablack/ams-lv2/mixer_2ch http://github.com/blablack/ams-lv2/mixer_4ch http://github.com/blablack/ams-lv2/mixer_8ch http://github.com/blablack/ams-lv2/mooglpf http://github.com/blablack/ams-lv2/ringmodulator http://github.com/blablack/ams-lv2/vcaexp http://github.com/blablack/ams-lv2/vcalin http://github.com/blablack/ams-lv2/vcf http://github.com/blablack/ams-lv2/vco2 http://github.com/blablack/ams-lv2/vco3 http://github.com/blablack/ams-lv2/vcorgan2_4 http://github.com/blablack/ams-lv2/vcorgan2_6 http://github.com/blablack/ams-lv2/vcorgan2_8 http://github.com/blablack/ams-lv2/vcorgan_4 http://github.com/blablack/ams-lv2/vcorgan_6 http://github.com/blablack/ams-lv2/vcorgan_8 http://github.com/blablack/ams-lv2/vcpanning http://github.com/blablack/deteriorate-lv2/downsampler_mono http://github.com/blablack/deteriorate-lv2/granulator_mono http://guitarix.sourceforge.net/plugins/gx_AxisFace_#AxisFace http://guitarix.sourceforge.net/plugins/gx_CreamMachine_#CreamMachine http://guitarix.sourceforge.net/plugins/gx_DOP250_#DOP250 http://guitarix.sourceforge.net/plugins/gx_Heathkit_#Heathkit http://guitarix.sourceforge.net/plugins/gx_KnightFuzz_#KnightFuzz http://guitarix.sourceforge.net/plugins/gx_MicroAmp_#MicroAmp http://guitarix.sourceforge.net/plugins/gx_SunFace_#SunFace http://guitarix.sourceforge.net/plugins/gx_TubeDistortion_#TubeDistortion http://guitarix.sourceforge.net/plugins/gx_aclipper_#aclipper http://guitarix.sourceforge.net/plugins/gx_alembic#alembic http://guitarix.sourceforge.net/plugins/gx_amp#GUITARIX http://guitarix.sourceforge.net/plugins/gx_ampegsvt_#ampegsvt http://guitarix.sourceforge.net/plugins/gx_bajatubedriver_#bajatubedriver http://guitarix.sourceforge.net/plugins/gx_barkgraphiceq_#barkgraphiceq http://guitarix.sourceforge.net/plugins/gx_blueamp_#blueamp http://guitarix.sourceforge.net/plugins/gx_bmp_#bmp http://guitarix.sourceforge.net/plugins/gx_boobtube_#boobtube http://guitarix.sourceforge.net/plugins/gx_bossds1_#bossds1 http://guitarix.sourceforge.net/plugins/gx_bottlerocket_#bottlerocket http://guitarix.sourceforge.net/plugins/gx_cabinet#CABINET http://guitarix.sourceforge.net/plugins/gx_clubdrive_#clubdrive http://guitarix.sourceforge.net/plugins/gx_colwah_#colwah http://guitarix.sourceforge.net/plugins/gx_compressor#compressor http://guitarix.sourceforge.net/plugins/gx_cstb#cstb http://guitarix.sourceforge.net/plugins/gx_detune_#detune http://guitarix.sourceforge.net/plugins/gx_digital_delay_#digital_delay http://guitarix.sourceforge.net/plugins/gx_duck_delay_#duck_delay http://guitarix.sourceforge.net/plugins/gx_epic_#epic http://guitarix.sourceforge.net/plugins/gx_eternity_#eternity http://guitarix.sourceforge.net/plugins/gx_expander#expander http://guitarix.sourceforge.net/plugins/gx_flanger#flanger http://guitarix.sourceforge.net/plugins/gx_fumaster#fumaster http://guitarix.sourceforge.net/plugins/gx_fuzz#fuzz_ http://guitarix.sourceforge.net/plugins/gx_fuzzface_#fuzzface http://guitarix.sourceforge.net/plugins/gx_fuzzfacefm_#fuzzfacefm http://guitarix.sourceforge.net/plugins/gx_gcb_95_#gcb_95 http://guitarix.sourceforge.net/plugins/gx_graphiceq_#graphiceq http://guitarix.sourceforge.net/plugins/gx_guvnor_#guvnor http://guitarix.sourceforge.net/plugins/gx_hfb_#hfb http://guitarix.sourceforge.net/plugins/gx_hogsfoot_#hogsfoot http://guitarix.sourceforge.net/plugins/gx_hornet_#hornet http://guitarix.sourceforge.net/plugins/gx_hotbox_#hotbox http://guitarix.sourceforge.net/plugins/gx_hyperion_#hyperion http://guitarix.sourceforge.net/plugins/gx_jcm800pre_#jcm800pre http://guitarix.sourceforge.net/plugins/gx_liquiddrive_#liquiddrive http://guitarix.sourceforge.net/plugins/gx_livelooper_#livelooper http://guitarix.sourceforge.net/plugins/gx_luna_#luna http://guitarix.sourceforge.net/plugins/gx_maestro_fz1b_#maestro_fz1b http://guitarix.sourceforge.net/plugins/gx_maestro_fz1s_#maestro_fz1s http://guitarix.sourceforge.net/plugins/gx_mbcompressor_#mbcompressor http://guitarix.sourceforge.net/plugins/gx_mbdelay_#mbdelay http://guitarix.sourceforge.net/plugins/gx_mbdistortion_#mbdistortion http://guitarix.sourceforge.net/plugins/gx_mbecho_#mbecho http://guitarix.sourceforge.net/plugins/gx_mbreverb_#mbreverb http://guitarix.sourceforge.net/plugins/gx_mole_#mole http://guitarix.sourceforge.net/plugins/gx_muff_#muff http://guitarix.sourceforge.net/plugins/gx_mxrdist_#mxrdist http://guitarix.sourceforge.net/plugins/gx_oc_2_#oc_2 http://guitarix.sourceforge.net/plugins/gx_phaser#phaser http://guitarix.sourceforge.net/plugins/gx_plexi#plexi http://guitarix.sourceforge.net/plugins/gx_quack_#quack http://guitarix.sourceforge.net/plugins/gx_rangem_#rangem http://guitarix.sourceforge.net/plugins/gx_redeye#bigchump http://guitarix.sourceforge.net/plugins/gx_redeye#chump http://guitarix.sourceforge.net/plugins/gx_redeye#vibrochump http://guitarix.sourceforge.net/plugins/gx_room_simulator_#room_simulator http://guitarix.sourceforge.net/plugins/gx_saturate_#saturate http://guitarix.sourceforge.net/plugins/gx_scream_#scream http://guitarix.sourceforge.net/plugins/gx_sd1sim_#sd1sim http://guitarix.sourceforge.net/plugins/gx_sd2lead_#sd2lead http://guitarix.sourceforge.net/plugins/gx_sfp_#sfp http://guitarix.sourceforge.net/plugins/gx_shakatube_#shakatube http://guitarix.sourceforge.net/plugins/gx_sloopyblue_#sloopyblue http://guitarix.sourceforge.net/plugins/gx_slowgear_#slowgear http://guitarix.sourceforge.net/plugins/gx_studiopre#studiopre http://guitarix.sourceforge.net/plugins/gx_supersonic_#supersonic http://guitarix.sourceforge.net/plugins/gx_susta_#susta http://guitarix.sourceforge.net/plugins/gx_switched_tremolo_#switched_tremolo http://guitarix.sourceforge.net/plugins/gx_timray_#timray http://guitarix.sourceforge.net/plugins/gx_tonemachine_#tonemachine http://guitarix.sourceforge.net/plugins/gx_tremolo#tremolo http://guitarix.sourceforge.net/plugins/gx_uvox#uvox http://guitarix.sourceforge.net/plugins/gx_valvecaster_#valvecaster http://guitarix.sourceforge.net/plugins/gx_vfm_#vfm http://guitarix.sourceforge.net/plugins/gx_vmk2d_#vmk2d http://guitarix.sourceforge.net/plugins/gx_voodoo_#voodoo http://guitarix.sourceforge.net/plugins/gx_voxbass_#voxbass http://guitarix.sourceforge.net/plugins/gx_vstb_#vstb http://guitarix.sourceforge.net/plugins/gx_w20#w20 http://guitarix.sourceforge.net/plugins/gxautowah#autowah http://guitarix.sourceforge.net/plugins/gxautowah#wah http://guitarix.sourceforge.net/plugins/gxbooster#booster http://guitarix.sourceforge.net/plugins/gxechocat#echocat http://guitarix.sourceforge.net/plugins/gxmetal_amp#metal_amp http://guitarix.sourceforge.net/plugins/gxmetal_head#metal_head http://guitarix.sourceforge.net/plugins/gxtape#tape http://guitarix.sourceforge.net/plugins/gxtilttone#tilttone http://guitarix.sourceforge.net/plugins/gxts9#ts9sim http://guitarix.sourceforge.net/plugins/gxtubedelay#tubedelay http://guitarix.sourceforge.net/plugins/gxtubetremelo#tubetremelo http://guitarix.sourceforge.net/plugins/gxtubevibrato#tubevibrato http://guitarix.sourceforge.net/plugins/gxtuner#tuner http://kxstudio.sf.net/carla/plugins/audiogain http://lsp-plug.in/plugins/lv2/ab_tester_x2_mono http://lsp-plug.in/plugins/lv2/ab_tester_x4_mono http://lsp-plug.in/plugins/lv2/ab_tester_x8_mono http://lsp-plug.in/plugins/lv2/art_delay_mono http://lsp-plug.in/plugins/lv2/autogain_mono http://lsp-plug.in/plugins/lv2/beat_breather_mono http://lsp-plug.in/plugins/lv2/chorus_mono http://lsp-plug.in/plugins/lv2/clipper_mono http://lsp-plug.in/plugins/lv2/comp_delay_mono http://lsp-plug.in/plugins/lv2/compressor_mono http://lsp-plug.in/plugins/lv2/crossover_mono http://lsp-plug.in/plugins/lv2/dyna_processor_mono http://lsp-plug.in/plugins/lv2/expander_mono http://lsp-plug.in/plugins/lv2/filter_mono http://lsp-plug.in/plugins/lv2/flanger_mono http://lsp-plug.in/plugins/lv2/gate_mono http://lsp-plug.in/plugins/lv2/gott_compressor_mono http://lsp-plug.in/plugins/lv2/graph_equalizer_x16_mono http://lsp-plug.in/plugins/lv2/graph_equalizer_x32_mono http://lsp-plug.in/plugins/lv2/impulse_responses_mono http://lsp-plug.in/plugins/lv2/impulse_reverb_mono http://lsp-plug.in/plugins/lv2/latency_meter http://lsp-plug.in/plugins/lv2/limiter_mono http://lsp-plug.in/plugins/lv2/loud_comp_mono http://lsp-plug.in/plugins/lv2/mb_clipper_mono http://lsp-plug.in/plugins/lv2/mb_compressor_mono http://lsp-plug.in/plugins/lv2/mb_dyna_processor_mono http://lsp-plug.in/plugins/lv2/mb_expander_mono http://lsp-plug.in/plugins/lv2/mb_gate_mono http://lsp-plug.in/plugins/lv2/mb_limiter_mono http://lsp-plug.in/plugins/lv2/mixer_x16_mono http://lsp-plug.in/plugins/lv2/mixer_x4_mono http://lsp-plug.in/plugins/lv2/mixer_x8_mono http://lsp-plug.in/plugins/lv2/noise_generator_x1 http://lsp-plug.in/plugins/lv2/oscillator_mono http://lsp-plug.in/plugins/lv2/para_equalizer_x16_mono http://lsp-plug.in/plugins/lv2/para_equalizer_x32_mono http://lsp-plug.in/plugins/lv2/para_equalizer_x8_mono http://lsp-plug.in/plugins/lv2/profiler_mono http://lsp-plug.in/plugins/lv2/room_builder_mono http://lsp-plug.in/plugins/lv2/sampler_mono http://lsp-plug.in/plugins/lv2/sc_autogain_mono http://lsp-plug.in/plugins/lv2/sc_compressor_mono http://lsp-plug.in/plugins/lv2/sc_dyna_processor_mono http://lsp-plug.in/plugins/lv2/sc_expander_mono http://lsp-plug.in/plugins/lv2/sc_gate_mono http://lsp-plug.in/plugins/lv2/sc_gott_compressor_mono http://lsp-plug.in/plugins/lv2/sc_limiter_mono http://lsp-plug.in/plugins/lv2/sc_mb_compressor_mono http://lsp-plug.in/plugins/lv2/sc_mb_dyna_processor_mono http://lsp-plug.in/plugins/lv2/sc_mb_expander_mono http://lsp-plug.in/plugins/lv2/sc_mb_gate_mono http://lsp-plug.in/plugins/lv2/sc_mb_limiter_mono http://lsp-plug.in/plugins/lv2/slap_delay_mono http://lsp-plug.in/plugins/lv2/spectrum_analyzer_x1 http://lsp-plug.in/plugins/lv2/surge_filter_mono http://lsp-plug.in/plugins/lv2/trigger_midi_mono http://lsp-plug.in/plugins/lv2/trigger_mono http://open-music-kontrollers.ch/lv2/mephisto#audio_1x1 http://www.niallmoody.com/ndcplugs/cycleshifter.htm https://bsutherland.github.io/JuceOPLVSTi/ https://github.com/asb2m10/dexed https://github.com/klangfreund/SpectrumAnalyser https://github.com/kronihias/ambix/ambix_encoder urn:zamaudio:ZaMultiComp urn:zamaudio:ZamAutoSat urn:zamaudio:ZamComp urn:zamaudio:ZamDelay urn:zamaudio:ZamDynamicEQ urn:zamaudio:ZamEQ2 urn:zamaudio:ZamGEQ31 urn:zamaudio:ZamGate urn:zamaudio:ZamGrains urn:zamaudio:ZamNoise urn:zamaudio:ZamPhono urn:zamaudio:ZamTube

JohannesLorenz avatar Jul 28 '24 12:07 JohannesLorenz

This is very likely buggy for mono plugins. From looking at the code, it looks like in that for mono plugins, inPorts().m_right and outPorts().m_right will be nullptr, so it will only read on left side and only write on left side.

JohannesLorenz avatar Aug 09 '24 21:08 JohannesLorenz

@messmerd Can you please review my enum, which I want to use for input and output Combo Boxes? Most should be correct (according to Discord). For the option "PC Output, Stereo Plugin:" in "Left", I was not 100% sure if the right plugin port should be averaged with the left or be discarded, but I assumed the latter.

enum LR
{
	// PC (=Pin Connector) mapping:
	// For a Stereo Plugin, this means the Left->Left and Right->Right bits are set,
	// For a Mono Plugin, this means all (both) bits are set.
	// This translates as follows:
	// PC Input/Output, Stereo Plugin: Forward stereo normally
	// PC Input, Mono Plugin: Average both LMMS ports to plugin input
	// PC Output, Mono Plugin: Duplicate output to both LMMS ports
	Dual,
	// For a Stereo Plugin, this means only the Left->Left bit is set,
	// For a Mono Plugin, this means only the Left->Mono bit is being set.
	// This translates as follows:
	// PC Input, Stereo Plugin: Forward left LMMS port to left plugin port,
	//     Fill right plugin port with zeroes
	// PC Input, Mono Plugin: Forward left to mono plugin input,
	//     Do not use/touch right
	// PC Output, Stereo Plugin: Forward left output to LMMS port,
	//     Right LMMS output port keeps values from right LMMS input port
	//     (This means the right plugin output is being discarded)
	// PC Output, Mono Plugin: Forward output to left LMMS port,
	//     Right LMMS output port keeps values from right LMMS input port
	Left,
	// Symmetrical to Left
	Right
};

JohannesLorenz avatar Aug 11 '24 18:08 JohannesLorenz

Btw, another possibility would be, for Mono plugins, only allow Dual for now. This would still cover all current use cases.

JohannesLorenz avatar Aug 11 '24 18:08 JohannesLorenz

@JohannesLorenz It sounds like what you're considering implementing is just another form of L/R routing. We're planning on eventually using pin connectors instead, so I wouldn't want you to waste work on a 2nd L/R routing implementation that's just going to be replaced. If you add any sort of L/R routing functionality, we'd need an upgrade routine when it is replaced with the pin connector.

For now, I think you should do this unconditionally without offering any ComboBox to the user:

  • For mono-input plugins, downmix LMMS's stereo audio to plugin's mono input
  • For mono-output plugins, upmix plugin's mono output to LMMS's stereo
  • For mono-input/mono-output plugins, do both

These are the same defaults for mono plugins that the pin connector uses.

messmerd avatar Aug 12 '24 17:08 messmerd

Status: This is waiting for #7459 .

JohannesLorenz avatar Aug 26 '24 17:08 JohannesLorenz