diff -Nru yoshimi-2.2.1/Changelog yoshimi-2.2.2.1/Changelog --- yoshimi-2.2.1/Changelog 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/Changelog 2022-09-14 22:56:29.000000000 +0000 @@ -1,4 +1,66 @@ -yoshimi 2.2.1 +yoshimi 2.2.2.1 + +2022-9-12 Will +bn2156 +* Applied riscV64 patch from debian. +* Changed text 'distorsion' to 'distortion' in code. + debian was reporting this as 'spelling error in binary' +* Set bugfix release 2.2.2.1 + +2022-9-8 Will +bn2155 +* BugFix: disabling a part in the panel window marked the main window + as disabled when that was pointed to a different part. + +2022-9-1 Will +bn2154 +* Updated meta-data +* Updated HTML guide +* Set release version 2.2.2 + +2022-8-29 Kristian +bn2153-a +* Removed redundant (time wasting) code from LV2. + +2022-8-27 Will +bn2153 +* Re-ordered retry attempts in MusicClient.cpp to avoid occasional lockups. + +2022-8-21 Will +bn2152 +* Split harmonicPhaseBandwidth label + SubSynth -> harmonicBandwidth + Add/PadSynth -> harmonicPhase + +2022-8-20 Kristian +bn2151a +* BugFix: phase randomness not recognised by modulators. + +2022-8-17 Will +bn2151 +* Fixed MIDI-learn regressions. + Settings saved, but not received. +* Suppressed clang compliler warnings. +* Doc updates. + +bn2150 (branch tempeff) +* Effect control labels now taken back out of inserts and + as a group now sit immediately above kit numbers. + +2022-8-16 Will +bn2149 +* Increased size of char array to suppress compiler warnings. +* Changed direct comparison to strcmp( to suppress compiler warnings. +* Commented out #include to suppress compiler warnings. + +2022-8-12 Will +bn2148 +* Attempt to improve EQ graph display. +* Small code cleanups and doc corrections. + +2022-8-4 Will +bn2147 +* Minor GUI updates. 2022-7-25 Will bn2146 diff -Nru yoshimi-2.2.1/debian/changelog yoshimi-2.2.2.1/debian/changelog --- yoshimi-2.2.1/debian/changelog 2022-07-26 23:12:23.000000000 +0000 +++ yoshimi-2.2.2.1/debian/changelog 2022-09-16 18:55:42.000000000 +0000 @@ -1,9 +1,32 @@ -yoshimi (2.2.1-1ppa1~jammy) jammy; urgency=low +yoshimi (2.2.2.1-2ppa1~jammy) jammy; urgency=low - * New upstream minor release 2.2.1 + * Yoshimi anniversary version 2.2.2 + * upstream bugfix version 2.2.2.1 + * bump Debian-Standard to v4.6.1 (no changes required) * Rebuild/Backport for Ubuntu Jammy(22.04 LTS) * unofficial DEB package by Ichthyostega + -- Hermann Vosseler Fri, 16 Sep 2022 20:55:42 +0200 + +yoshimi (2.2.2.1-1) unstable; urgency=medium + + * New upstream version 2.2.2.1 + (Closes: #1019471) + + -- IOhannes m zmölnig (Debian/GNU) Mon, 12 Sep 2022 23:39:18 +0200 + +yoshimi (2.2.2-1) unstable; urgency=medium + + * New upstream version 2.2.2 + + -- IOhannes m zmölnig (Debian/GNU) Tue, 06 Sep 2022 22:10:41 +0200 + +yoshimi (2.2.1-1~buster) Lumiera-buster-tool; urgency=low + + * New upstream minor release 2.2.1 + * Rebuild/Backport for Debian/Buster(oldstable). + * unofficial DEB package by Ichthyostega + -- Hermann Vosseler Wed, 27 Jul 2022 01:12:23 +0200 yoshimi (2.2.0-1~buster) Lumiera-buster-tool; urgency=low diff -Nru yoshimi-2.2.1/debian/control yoshimi-2.2.2.1/debian/control --- yoshimi-2.2.1/debian/control 2022-07-26 23:06:52.000000000 +0000 +++ yoshimi-2.2.2.1/debian/control 2022-09-16 18:55:42.000000000 +0000 @@ -28,7 +28,7 @@ pkg-config, sharutils, zlib1g-dev, -Standards-Version: 4.6.0 +Standards-Version: 4.6.1 Rules-Requires-Root: no Vcs-Git: https://github.com/Ichthyostega/yoshimi.git -b deb Homepage: https://yoshimi.sourceforge.io diff -Nru yoshimi-2.2.1/debian/copyright yoshimi-2.2.2.1/debian/copyright --- yoshimi-2.2.1/debian/copyright 2022-07-26 23:06:52.000000000 +0000 +++ yoshimi-2.2.2.1/debian/copyright 2022-09-15 00:06:01.000000000 +0000 @@ -4,91 +4,28 @@ Source: https://sourceforge.net/projects/yoshimi/files/ Files: * -Copyright: 2009-2011, Alan Calvert - 2014, Andrew Deryabin - 2009, James Morris - 2002-2009, Nasca Octavian Paul and others - 2014-2021, Will Godfrey & others -License: GPL-2+ - -Files: src/DSP/* - src/Effects/* - src/Interface/Data2Text.cpp - src/Interface/Data2Text.h - src/Interface/InterChange.cpp - src/Interface/InterChange.h - src/Interface/MidiDecode.cpp - src/Interface/MidiDecode.h - src/Interface/MidiLearn.cpp - src/Interface/MidiLearn.h - src/Interface/RingBuffer.h - src/Misc/Bank.cpp - src/Misc/Bank.h - src/Misc/Config.h - src/Misc/FileMgrFuncs.h - src/Misc/Microtonal.cpp - src/Misc/Microtonal.h - src/Misc/Part.cpp - src/Misc/Part.h - src/Misc/RandomGen.h - src/Misc/Splash.cpp - src/Misc/Splash.h - src/Misc/SplashPngHex - src/Misc/SynthEngine.cpp - src/Misc/SynthEngine.h - src/Misc/WavFile.cpp - src/Misc/WavFile.h - src/Misc/WaveShapeSamples.h - src/Misc/XMLwrapper.cpp - src/Misc/XMLwrapper.h - src/Params/* - src/Synth/* - src/UI/ADnoteUI.fl - src/UI/BankUI.fl - src/UI/ConfigUI.fl - src/UI/DynamicTooltip.cpp - src/UI/DynamicTooltip.h - src/UI/EffUI.fl - src/UI/EnvelopeUI.fl - src/UI/FilterUI.fl - src/UI/LFOUI.fl - src/UI/MasterMiscUI.fl - src/UI/MicrotonalUI.fl - src/UI/MidiLearnUI.fl - src/UI/MiscGui.cpp - src/UI/MiscGui.h - src/UI/OscilGenUI.fl - src/UI/PADnoteUI.fl - src/UI/PartUI.fl - src/UI/PresetsUI.fl - src/UI/ResonanceUI.fl - src/UI/SUBnoteUI.fl - src/UI/VirKeyboardUI.fl - src/UI/WidgetMWSlider.cpp - src/UI/WidgetMWSlider.h - src/UI/WidgetPDial.cpp - src/UI/WidgetPDial.h - src/globals.h -Copyright: 2009-2011, Alan Calvert +Copyright: 2002-2009, Nasca Octavian Paul and others + 2009-2011, Alan Calvert 2009, James Morris 2012-2013, Jeremy Jongepier and others + 2013, Nikita Zlobin + 2016, Rob Couto 2017, Jesper Lloyd - 2002-2009, Nasca Octavian Paul and others - 2016, Rob Couto & Will Godfrey - 2014-2021, Will Godfrey and others -License: LGPL-2+ + 2014, Andrew Deryabin + 2014-2022, Will Godfrey & others +License: GPL-2+ Files: debian/* Copyright: 2010-2011, Alessio Treglia 2010-2017, Jaromír Mikeš 2019, Olivier Humbert - 2020-2021, Dennis Braun + 2020-2022, Dennis Braun License: GPL-2+ Files: src/UI/ParametersUI.fl src/UI/VectorUI.fl Copyright: 2011, Alan Calvert - 2014-2021, Will Godfrey + 2014-2022, Will Godfrey License: GPL-3+ Files: banks/Drums/0004-Natural?Drum?Kit.xiz @@ -97,18 +34,6 @@ Copyright: 2012, Dario Straulino License: GPL-3 -Files: src/Misc/Config.cpp - src/UI/MasterUI.fl -Copyright: 2009-2011, Alan Calvert - 2014, Andrew Deryabin - 2003-2004, Benno Senoner and Christian Schoenebeck - 2005-2008, Christian Schoenebeck - 2017, Jesper Lloyd - 2002-2009, Nasca O. PAUL and others - 2013, Nikita Zlobin - 2014-2021, Will Godfrey & others -License: GPL-2+ or LGPL-2+ - Files: Util/YoshimiSplash.svg Copyright: 2006, Arun Kulshreshtha License: CC-BY-4.0 diff -Nru yoshimi-2.2.1/debian/patches/fix_privacy_breach_in_index_html.patch yoshimi-2.2.2.1/debian/patches/fix_privacy_breach_in_index_html.patch --- yoshimi-2.2.1/debian/patches/fix_privacy_breach_in_index_html.patch 2022-07-26 23:10:35.000000000 +0000 +++ yoshimi-2.2.2.1/debian/patches/fix_privacy_breach_in_index_html.patch 2022-09-15 00:16:01.000000000 +0000 @@ -8,7 +8,7 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/yoshimi_user_guide/index.html b/doc/yoshimi_user_guide/index.html -index 5456c5b..1035bea 100644 +index ed3459d..3e533a6 100644 --- a/doc/yoshimi_user_guide/index.html +++ b/doc/yoshimi_user_guide/index.html @@ -4,7 +4,7 @@ diff -Nru yoshimi-2.2.1/debian/watch yoshimi-2.2.2.1/debian/watch --- yoshimi-2.2.1/debian/watch 2022-07-26 23:06:52.000000000 +0000 +++ yoshimi-2.2.2.1/debian/watch 2022-09-14 23:06:05.000000000 +0000 @@ -1,3 +1,3 @@ version=4 -opts="uversionmangle=s/-/./,dversionmangle=s/~dfsg0.*//,repacksuffix=~dfsg0" \ -https://github.com/Yoshimi/yoshimi/releases .*/v?(\d[\d\.]+)\.tar\.gz +opts=filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/yoshimi-$1\.tar\.gz/ \ +https://github.com/Yoshimi/yoshimi/tags .*/v?(\d[\d\.]+)\.tar\.gz diff -Nru yoshimi-2.2.1/debian/yoshimi.lintian-overrides yoshimi-2.2.2.1/debian/yoshimi.lintian-overrides --- yoshimi-2.2.1/debian/yoshimi.lintian-overrides 2022-07-26 23:06:52.000000000 +0000 +++ yoshimi-2.2.2.1/debian/yoshimi.lintian-overrides 2022-09-14 23:06:05.000000000 +0000 @@ -1,11 +1,13 @@ # I can't find these spelling errors in source code using grep tool. # So overriding them. -spelling-error-in-binary usr/bin/yoshimi AfE Safe -spelling-error-in-binary usr/bin/yoshimi CONTROLL CONTROL -spelling-error-in-binary usr/bin/yoshimi defaulH default -spelling-error-in-binary usr/bin/yoshimi ment meant -spelling-error-in-binary usr/bin/yoshimi pres press -spelling-error-in-binary usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so AfE Safe -spelling-error-in-binary usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so CONTROLL CONTROL -spelling-error-in-binary usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so defaulH default -spelling-error-in-binary usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so ment meant +spelling-error-in-binary CONTROLL CONTROL [usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so] +spelling-error-in-binary TeH The [usr/bin/yoshimi] +spelling-error-in-binary TeH The [usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so] +spelling-error-in-binary buil build [usr/bin/yoshimi] +spelling-error-in-binary buil build [usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so] +spelling-error-in-binary controlL control [usr/bin/yoshimi] +spelling-error-in-binary defaulH default [usr/bin/yoshimi] +spelling-error-in-binary defaulH default [usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so] +spelling-error-in-binary ment meant [usr/bin/yoshimi] +spelling-error-in-binary ment meant [usr/lib/lv2/yoshimi.lv2/yoshimi_lv2.so] +spelling-error-in-binary pres press [usr/bin/yoshimi] diff -Nru yoshimi-2.2.1/desktop/metainfo/yoshimi.appdata.xml yoshimi-2.2.2.1/desktop/metainfo/yoshimi.appdata.xml --- yoshimi-2.2.1/desktop/metainfo/yoshimi.appdata.xml 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/desktop/metainfo/yoshimi.appdata.xml 2022-09-14 22:56:29.000000000 +0000 @@ -7,6 +7,7 @@ Yoshimi A Software Synthesizer for Linux + https://a.fsdn.com/allura/p/yoshimi/icon?1652648963

Yoshimi is a MIDI software synthesizer for Linux. It synthesizes in real time, can run polyphonic and/or monophonic in multiple simultaneous patches in one or more MIDI channels and has broad microtonal capability. It includes extensive additive, subtractive, and PAD synth capabilities which can be run simultaneously within the same patch. It also has comprehensive effects capabilities. @@ -28,7 +29,7 @@

-​ +​ yoshimi @@ -49,10 +50,14 @@ - AudioVideo Audio Midi - Synthesiser + Music + + Synthesizer + Softsynth + https://sourceforge.net/projects/yoshimi/ + http://yoshimi.github.io/docs/user-guide/ diff -Nru yoshimi-2.2.1/desktop/yoshimi.1 yoshimi-2.2.2.1/desktop/yoshimi.1 --- yoshimi-2.2.1/desktop/yoshimi.1 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/desktop/yoshimi.1 2022-09-14 22:56:29.000000000 +0000 @@ -1,4 +1,4 @@ -.TH yoshimi 1 " 2022" "yoshimi 2.2.1" +.TH yoshimi 1 " 2022" "yoshimi 2.2.2" .SH NAME yoshimi \- a software music synthesiser .SH SYNOPSIS diff -Nru yoshimi-2.2.1/desktop/yoshimi.desktop.in yoshimi-2.2.2.1/desktop/yoshimi.desktop.in --- yoshimi-2.2.1/desktop/yoshimi.desktop.in 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/desktop/yoshimi.desktop.in 2022-09-14 22:56:29.000000000 +0000 @@ -1,14 +1,14 @@ [Desktop Entry] Name=Yoshimi -Comment=Real Time Synthesizer -Comment[fr]=Synthétiseur temps-réel GenericName=Synthesizer GenericName[fr]=Synthétiseur +Comment=Real Time Synthesizer +Comment[fr]=Synthétiseur temps-réel +Icon=yoshimi Type=Application -Categories=Music;Midi;AudioVideo;X-Sound;Audio;X-Multitrack;X-Alsa;X-Jack; -Keywords=music;synthesiser;softsynth;microtonal;multichannel;midi;alsa;jack;realtime;standalone;lv2; Exec=yoshimi TryExec=yoshimi Terminal=false StartupNotify=true -Icon=yoshimi +Categories=Music;Midi;AudioVideo;X-Sound;Audio;X-Multitrack;X-Alsa;X-Jack; +Keywords=music;synthesiser;softsynth;microtonal;multichannel;midi;alsa;jack;realtime;standalone;lv2; diff -Nru yoshimi-2.2.1/dev_notes/Effect_Inserts.txt yoshimi-2.2.2.1/dev_notes/Effect_Inserts.txt --- yoshimi-2.2.1/dev_notes/Effect_Inserts.txt 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/dev_notes/Effect_Inserts.txt 2022-09-14 22:56:29.000000000 +0000 @@ -8,7 +8,7 @@ 2 Time (duration of effect) 3 Delay 4 Delay feedback -5 {reserved} +5 Bandwidth (only got bandwidth type) 6 {reserved} 7 Low pass filter 8 High pass filter diff -Nru yoshimi-2.2.1/dev_notes/GUI_Interpretations.txt yoshimi-2.2.2.1/dev_notes/GUI_Interpretations.txt --- yoshimi-2.2.1/dev_notes/GUI_Interpretations.txt 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/dev_notes/GUI_Interpretations.txt 2022-09-14 22:56:29.000000000 +0000 @@ -38,7 +38,7 @@ Effects and effect sources. In 'part' we use 0xf1 for system effects and 0xf2 for insertion effects. For these and normal part effects, 'kit' ORed with 0x80 is used to denote the effect type (reverb echo etc.) and 'engine' is used to denote the number of the effect being worked on (the limit depends on the effect source). As 'kit' and 'engine' are not relevant for effects it is safe to use them here. -Effects 'kit' numbers offset by 0x80. +Effects 'kit' numbers offset by 0x10. 0 None 1 Reverb Binary files /tmp/tmpzlnra6pi/kG4fNlB85h/yoshimi-2.2.1/dev_notes/Yoshimi Control Numbers.ods and /tmp/tmpzlnra6pi/NGkmrLBC0c/yoshimi-2.2.2.1/dev_notes/Yoshimi Control Numbers.ods differ Binary files /tmp/tmpzlnra6pi/kG4fNlB85h/yoshimi-2.2.1/doc/Histories.tar.bz2 and /tmp/tmpzlnra6pi/NGkmrLBC0c/yoshimi-2.2.2.1/doc/Histories.tar.bz2 differ diff -Nru yoshimi-2.2.1/doc/Yoshimi_2.2.1_features.txt yoshimi-2.2.2.1/doc/Yoshimi_2.2.1_features.txt --- yoshimi-2.2.1/doc/Yoshimi_2.2.1_features.txt 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/doc/Yoshimi_2.2.1_features.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -Version 2.2.1 - -There is a useful addition of a reset button in the part edit window. This sets the instrument to the default in the same way as the instrument instrument drop menu down does, but is more convenient. - -Also for both of these methods, if you hold down the ctrl key it will then offer to clear the entire part instead, i.e. controllers, aftertouch etc. The confirmation message has also been updated so that you know exactly which of these actions is about to be performed. - -There are more windows that now stay open when you change parts and update in place. These are the part Edit window itself, Kit, Effects, Controllers, MIDI CCs, Aftertouch. All of these will also reopen if they were visible when Yoshimi was last closed. - -If the main window has focus, the Escape key action has been disabled. This is so you don't accidentally drop right out of Yoshimi. - -Two new instruments have been added to the banks, 'Ride' in Drums and 'Nostagia' in Synth. - -The user guide and various docs have been updated. - -There are also a number of code improvements and a few bug fixes. - -Yoshimi source code is available from either: -https://sourceforge.net/projects/yoshimi -Or: -https://github.com/Yoshimi/yoshimi - -Full build instructions are in 'INSTALL'. - -Our list archive is at: -https://www.freelists.org/archive/yoshimi -To post, email to: -yoshimi@freelists.org diff -Nru yoshimi-2.2.1/doc/Yoshimi_2.2.2_features.txt yoshimi-2.2.2.1/doc/Yoshimi_2.2.2_features.txt --- yoshimi-2.2.1/doc/Yoshimi_2.2.2_features.txt 1970-01-01 00:00:00.000000000 +0000 +++ yoshimi-2.2.2.1/doc/Yoshimi_2.2.2_features.txt 2022-09-14 22:56:29.000000000 +0000 @@ -0,0 +1,17 @@ +Version 2.2.2 + +There are also a number of code improvements and a some bug fixes. Also the reproted metadata has been expanded. + +The user guide and various docs have been updated. + +Yoshimi source code is available from either: +https://sourceforge.net/projects/yoshimi +Or: +https://github.com/Yoshimi/yoshimi + +Full build instructions are in 'INSTALL'. + +Our list archive is at: +https://www.freelists.org/archive/yoshimi +To post, email to: +yoshimi@freelists.org diff -Nru yoshimi-2.2.1/doc/yoshimi_user_guide/files/yoshimi_user_guide_version yoshimi-2.2.2.1/doc/yoshimi_user_guide/files/yoshimi_user_guide_version --- yoshimi-2.2.1/doc/yoshimi_user_guide/files/yoshimi_user_guide_version 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/doc/yoshimi_user_guide/files/yoshimi_user_guide_version 2022-09-14 22:56:29.000000000 +0000 @@ -1 +1 @@ -2.2.1 \ No newline at end of file +2.2.2.1 \ No newline at end of file diff -Nru yoshimi-2.2.1/doc/yoshimi_user_guide/index.html yoshimi-2.2.2.1/doc/yoshimi_user_guide/index.html --- yoshimi-2.2.1/doc/yoshimi_user_guide/index.html 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/doc/yoshimi_user_guide/index.html 2022-09-14 22:56:29.000000000 +0000 @@ -8,7 +8,7 @@ -

The Yoshimi User Guide V2.2.1

+

The Yoshimi User Guide V2.2.2

Contents Window

diff -Nru yoshimi-2.2.1/doc/yoshimi_user_guide/mlearn/mlearn.html yoshimi-2.2.2.1/doc/yoshimi_user_guide/mlearn/mlearn.html --- yoshimi-2.2.1/doc/yoshimi_user_guide/mlearn/mlearn.html 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/doc/yoshimi_user_guide/mlearn/mlearn.html 2022-09-14 22:56:29.000000000 +0000 @@ -27,7 +27,12 @@

  • Mute This completely disables this line only. Bear in mind that if it had been blocking later lines, that will no longer be the case.
  • - CC The incoming CC to respond to. In the case of NRPNs this is presented as two hexadecimal 7bit values. + CC The incoming CC to respond to. In the case of NRPNs this is presented as two hexadecimal 7bit values. As well as these, there are three channel mode messages that are learnable and reported as pseudo CCs: +
    + 128 - Pitch bend
    + 129 - Channel Aftertouch
    + 130 - Key Aftertouch
    +
  • Chan A drop-down menu to select the incoming channel to recognise. The last entry allows all channels to be effective for this line.
  • @@ -44,7 +49,7 @@

    Note:
    -  You can have up to 400 learned lines, and multiple lines can respond to the same CC/Channel pair but performing completely different actions. +  You can have up to 400 learned lines, and multiple lines can respond to the same CC/Channel pair but performing completely different actions. Also you can change the Channel numbers and CC at a late date to suit different control sources.

    (buttons) diff -Nru yoshimi-2.2.1/README.txt yoshimi-2.2.2.1/README.txt --- yoshimi-2.2.1/README.txt 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/README.txt 2022-09-14 22:56:29.000000000 +0000 @@ -1,17 +1,8 @@ -Version 2.2.1 +Version 2.2.2 -There are just a few useful variations to the way -Yoshimi is controlled in this minor release. +This is just a minor bugfix and general update release. -A new 'reset' button in the part edit window. - -More windows stay open when you change parts. - -Two new instruments have been added to the default banks. - -Some doc updates and bugfixes. - -Full details are in /doc/Yoshimi_2.2.1_features.txt +Full details are in /doc/Yoshimi_2.2.2_features.txt Yoshimi source code is available from either: https://sourceforge.net/projects/yoshimi diff -Nru yoshimi-2.2.1/src/CLI/CmdInterpreter.cpp yoshimi-2.2.2.1/src/CLI/CmdInterpreter.cpp --- yoshimi-2.2.1/src/CLI/CmdInterpreter.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/CLI/CmdInterpreter.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -254,14 +254,14 @@ } nFXtype = readControl(synth, 0, ctl, section, UNUSED, nFX); result += (" eff " + asString(nFX + 1) + " " + fx_list[nFXtype].substr(0, 6)); - nFXpreset = readControl(synth, 0, EFFECT::control::preset, section, (TOPLEVEL::insert::none | 128) + nFXtype, nFX); + nFXpreset = readControl(synth, 0, EFFECT::control::preset, section, EFFECT::type::none + nFXtype, nFX); if (bitTest(context, LEVEL::InsFX) && readControl(synth, 0, EFFECT::sysIns::effectDestination, TOPLEVEL::section::systemEffects, UNUSED, nFX) == -1) result += " Unrouted"; else if (nFXtype > 0 && nFXtype != 7) { result += ("-" + asString(nFXpreset + 1)); - if (readControl(synth, 0, EFFECT::control::changed, section, (TOPLEVEL::insert::none | 128) + nFXtype, nFX)) + if (readControl(synth, 0, EFFECT::control::changed, section, EFFECT::type::none + nFXtype, nFX)) result += "?"; } return result; @@ -1020,7 +1020,7 @@ else all = input.matchnMove(1, "all"); if (!all) - msg.push_back(" effect presets"); + msg.push_back(" EFFECT presets"); for (int i = 0; i < 9; ++ i) { presetsPos = 1; @@ -1205,7 +1205,7 @@ if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); - value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, (TOPLEVEL::insert::none | 128) + nFXtype, nFX)); + value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } @@ -1221,7 +1221,7 @@ if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); - value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, (TOPLEVEL::insert::none | 128) + nFXtype, nFX)); + value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } @@ -1252,7 +1252,7 @@ if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); - value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, (TOPLEVEL::insert::none | 128) + nFXtype, nFX)); + value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } @@ -1283,7 +1283,7 @@ if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); - value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, (TOPLEVEL::insert::none | 128) + nFXtype, nFX)); + value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } @@ -1356,7 +1356,7 @@ if (selected == EFFECT::control::frequency && value == -1) { input.skipChars(); - value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, (TOPLEVEL::insert::none | 128) + nFXtype, nFX)); + value = freqBPMset(input, readControl(synth, 0, EFFECT::control::bpm, effClass, EFFECT::type::none + nFXtype, nFX)); if (value < 0) return REPLY::done_msg; // error already reported } @@ -1395,7 +1395,7 @@ value = string2int(input); } //cout << "Val " << value << " type " << controlType << " cont " << selected << " part " << context << " efftype " << int(nFXtype) << " num " << int(nFX) << endl; - return sendNormal(synth, 0, value, controlType, selected, effClass, (TOPLEVEL::insert::none | 128) + nFXtype, nFX); + return sendNormal(synth, 0, value, controlType, selected, effClass, EFFECT::type::none + nFXtype, nFX); } // Continue cos it's not for us. } @@ -1475,7 +1475,7 @@ partno = TOPLEVEL::section::insertEffects; else partno = TOPLEVEL::section::systemEffects; - return sendNormal(synth, 0, nFXpreset, controlType, EFFECT::control::preset, partno, (TOPLEVEL::insert::none | 128) + nFXtype, nFX); + return sendNormal(synth, 0, nFXpreset, controlType, EFFECT::control::preset, partno, EFFECT::type::none + nFXtype, nFX); } return REPLY::op_msg; } @@ -1833,7 +1833,7 @@ bool isDyn = false; if (bitTest(context, LEVEL::AllFX) && nFXtype == 8) { - kit = TOPLEVEL::insert::dynFilter | 128; + kit = EFFECT::type::dynFilter; engine = 0; if (bitTest(context, LEVEL::InsFX)) { @@ -2393,7 +2393,7 @@ if (input.matchnMove(1, "banks") || (bitFindHigh(context) == LEVEL::Bank && (input.isAtEnd() || input.isdigit()))) { - if (input.isAtEnd() | !input.isdigit()) + if (input.isAtEnd() || !input.isdigit()) ID = 128; else ID = string2int(input); @@ -4353,7 +4353,7 @@ } else if (input.matchnMove(1, "bandwidth")) { - insert = TOPLEVEL::insert::harmonicPhaseBandwidth; + insert = TOPLEVEL::insert::harmonicBandwidth; set = true; } if (set) @@ -5006,7 +5006,7 @@ if (input.matchnMove(1, "amp")) insert = TOPLEVEL::insert::harmonicAmplitude; else if (input.matchnMove(1, "phase")) - insert = TOPLEVEL::insert::harmonicPhaseBandwidth; + insert = TOPLEVEL::insert::harmonicPhase; if (input.lineEnd(controlType)) return REPLY::value_msg; diff -Nru yoshimi-2.2.1/src/CMakeLists.txt yoshimi-2.2.2.1/src/CMakeLists.txt --- yoshimi-2.2.1/src/CMakeLists.txt 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/CMakeLists.txt 2022-09-14 22:56:29.000000000 +0000 @@ -52,7 +52,7 @@ #add_definitions(-Wno-deprecated) # ^^^ comment these out on release pushes -set (YOSHIMI_VERSION "2.2.1") +set (YOSHIMI_VERSION "2.2.2.1") add_definitions (-DMIN_CONFIG_MAJOR=2) add_definitions (-DMIN_CONFIG_MINOR=0) @@ -464,6 +464,10 @@ target_link_libraries (yoshimi ${ARGP_LIB}) endif () +if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") + target_link_libraries (yoshimi atomic) +endif () + install (TARGETS yoshimi RUNTIME DESTINATION bin) install (DIRECTORY ../banks DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/yoshimi diff -Nru yoshimi-2.2.1/src/Effects/EffectMgr.cpp yoshimi-2.2.2.1/src/Effects/EffectMgr.cpp --- yoshimi-2.2.1/src/Effects/EffectMgr.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Effects/EffectMgr.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -4,7 +4,7 @@ Original ZynAddSubFX author Nasca Octavian Paul Copyright (C) 2002-2009 Nasca Octavian Paul Copyright 2009-2011, Alan Calvert - Copyright 2017-2019, Will Godfrey + Copyright 2017-2022, Will Godfrey This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public @@ -35,7 +35,7 @@ efxoutr{size_t(_synth->buffersize)}, insertion{insertion_}, filterpars{NULL}, - nefx{TOPLEVEL::insert::none}, + nefx{0}, // type none resolves to zero internally dryonly{false}, efx{} { @@ -48,7 +48,7 @@ void EffectMgr::defaults(void) { - changeeffect(TOPLEVEL::insert::none); + changeeffect(0); // type none resolves to zero internally setdryonly(false); } @@ -60,37 +60,37 @@ if (nefx == _nefx) return; nefx = _nefx; - switch (nefx) + switch (nefx + EFFECT::type::none) { - case TOPLEVEL::insert::reverb: + case EFFECT::type::reverb: efx.reset(new Reverb{insertion, efxoutl.get(), efxoutr.get(), synth}); break; - case TOPLEVEL::insert::echo: + case EFFECT::type::echo: efx.reset(new Echo{insertion, efxoutl.get(), efxoutr.get(), synth}); break; - case TOPLEVEL::insert::chorus: + case EFFECT::type::chorus: efx.reset(new Chorus{insertion, efxoutl.get(), efxoutr.get(), synth}); break; - case TOPLEVEL::insert::phaser: + case EFFECT::type::phaser: efx.reset(new Phaser{insertion, efxoutl.get(), efxoutr.get(), synth}); break; - case TOPLEVEL::insert::alienWah: + case EFFECT::type::alienWah: efx.reset(new Alienwah{insertion, efxoutl.get(), efxoutr.get(), synth}); break; - case TOPLEVEL::insert::distortion: + case EFFECT::type::distortion: efx.reset(new Distorsion{insertion, efxoutl.get(), efxoutr.get(), synth}); break; - case TOPLEVEL::insert::eq: + case EFFECT::type::eq: efx.reset(new EQ{insertion, efxoutl.get(), efxoutr.get(), synth}); break; - case TOPLEVEL::insert::dynFilter: + case EFFECT::type::dynFilter: efx.reset(new DynamicFilter{insertion, efxoutl.get(), efxoutr.get(), synth}); break; @@ -181,7 +181,7 @@ memset(efxoutr.get(), 0, synth->sent_bufferbytes); efx->out(smpsl, smpsr); - if (nefx == TOPLEVEL::insert::eq) + if (nefx == (EFFECT::type::eq - EFFECT::type::none)) { // this is need only for the EQ effect memcpy(smpsl, efxoutl.get(), synth->sent_bufferbytes); memcpy(smpsr, efxoutr.get(), synth->sent_bufferbytes); @@ -282,7 +282,7 @@ void EffectMgr::getfromXML(XMLwrapper *xml) { - changeeffect(xml->getpar127("type", geteffect())); + changeeffect(xml->getpar127("type", geteffect())); // not convinced this is OK? if (!efx || !geteffect()) return; changepreset(xml->getpar127("preset", efx->Ppreset)); @@ -324,47 +324,47 @@ float LimitMgr::geteffectlimits(CommandBlock *getData) { - int effType = getData->data.kit & 127; + int effType = getData->data.kit; float value = 0; switch (effType) { - case TOPLEVEL::insert::none: + case EFFECT::type::none: value = 0; break; - case TOPLEVEL::insert::reverb: + case EFFECT::type::reverb: Revlimit reverb; value = reverb.getlimits(getData); break; - case TOPLEVEL::insert::echo: + case EFFECT::type::echo: Echolimit echo; value = echo.getlimits(getData); break; - case TOPLEVEL::insert::chorus: + case EFFECT::type::chorus: Choruslimit chorus; value = chorus.getlimits(getData); break; - case TOPLEVEL::insert::phaser: + case EFFECT::type::phaser: Phaserlimit phaser; value = phaser.getlimits(getData); break; - case TOPLEVEL::insert::alienWah: + case EFFECT::type::alienWah: Alienlimit alien; value = alien.getlimits(getData); break; - case TOPLEVEL::insert::distortion: + case EFFECT::type::distortion: Distlimit dist; value = dist.getlimits(getData); break; - case TOPLEVEL::insert::eq: + case EFFECT::type::eq: EQlimit EQ; value = EQ.getlimits(getData); break; - case TOPLEVEL::insert::dynFilter: + case EFFECT::type::dynFilter: Dynamlimit dyn; value = dyn.getlimits(getData); break; default: - value = TOPLEVEL::insert::count - TOPLEVEL::insert::none; + value = EFFECT::type::count - EFFECT::type::none; break; } return value; diff -Nru yoshimi-2.2.1/src/globals.h yoshimi-2.2.2.1/src/globals.h --- yoshimi-2.2.1/src/globals.h 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/globals.h 2022-09-14 22:56:29.000000000 +0000 @@ -210,7 +210,6 @@ enum control : unsigned char { // insert any new entries here - /* * the following values must never appear in any other sections */ @@ -230,19 +229,7 @@ // inserts are here as they are split between many // sections but must remain distinct. enum insert : unsigned char { - none = 0, - reverb, - echo, - chorus, - phaser, - alienWah, - distortion, - eq, - dynFilter, - // any new effects should go here - count, // this must be the last type! - - LFOgroup, // 10 + LFOgroup = 0, filterGroup, envelopeGroup, envelopePointAdd, @@ -250,12 +237,13 @@ envelopePointChange, oscillatorGroup, harmonicAmplitude, - harmonicPhaseBandwidth, // this should be split in two + harmonicPhase, + harmonicBandwidth, resonanceGroup, resonanceGraphInsert, systemEffectSend, partEffectSelect, - kitGroup //23 + kitGroup }; enum insertType : unsigned char { @@ -1088,6 +1076,20 @@ effectDestination, // insert only effectEnable // system only }; + + enum type : unsigned char { // sits above part kits + none = NUM_KIT_ITEMS, + reverb, + echo, + chorus, + phaser, + alienWah, + distortion, + eq, + dynFilter, + // any new effects should go here + count, // this must be the last type! + }; } /* diff -Nru yoshimi-2.2.1/src/Interface/Data2Text.cpp yoshimi-2.2.2.1/src/Interface/Data2Text.cpp --- yoshimi-2.2.1/src/Interface/Data2Text.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Interface/Data2Text.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -135,7 +135,7 @@ return "Nothing to redo!"; } - if ((effSend >= (TOPLEVEL::insert::none | 128) && effSend <= (TOPLEVEL::insert::dynFilter | 128)) || (control >= PART::control::effectNumber && control <= PART::control::effectBypass && effSend == UNUSED)) + if ((effSend >= EFFECT::type::none && effSend < EFFECT::type::count) || (control >= PART::control::effectNumber && control <= PART::control::effectBypass && effSend == UNUSED)) { commandName = resolveEffects(getData, addValue); return withValue(commandName, type, showValue, addValue, value); @@ -182,7 +182,7 @@ case TOPLEVEL::insert::harmonicAmplitude: commandName = resolveOscillator(synth, getData, addValue); break; - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicPhase: commandName = resolveOscillator(synth, getData, addValue); break; case TOPLEVEL::insert::resonanceGroup: @@ -205,7 +205,7 @@ case TOPLEVEL::insert::harmonicAmplitude: commandName = resolveSub(getData, addValue); break; - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicBandwidth: commandName = resolveSub(getData, addValue); break; case TOPLEVEL::insert::filterGroup: @@ -254,7 +254,7 @@ case TOPLEVEL::insert::harmonicAmplitude: commandName = resolveOscillator(synth, getData, addValue); break; - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicPhase: commandName = resolveOscillator(synth, getData, addValue); break; } @@ -2198,7 +2198,7 @@ int value_int = int(value); - if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicBandwidth) { string Htype; if (insert == TOPLEVEL::insert::harmonicAmplitude) @@ -2603,7 +2603,7 @@ { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Harmonic " + to_string((int)control + 1) + " Amplitude" + isPad); } - else if (insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + else if (insert == TOPLEVEL::insert::harmonicPhase) { return ("Part " + to_string(npart + 1) + " Kit " + to_string(kititem + 1) + eng_name + " Harmonic " + to_string((int)control + 1) + " Phase" + isPad); } @@ -3258,8 +3258,8 @@ name = "Insert"; else name = "Part " + to_string(npart + 1); -; - if (effType == (TOPLEVEL::insert::dynFilter | 128) && getData->data.insert != UNUSED) + + if (effType == EFFECT::type::dynFilter && getData->data.insert != UNUSED) { if (npart == TOPLEVEL::section::systemEffects) name = "System"; @@ -3358,7 +3358,7 @@ if ((npart < NUM_MIDI_PARTS && control == PART::control::effectType) || (npart > TOPLEVEL::section::main && effType == UNUSED && control == EFFECT::sysIns::effectType)) { name += " set to"; - effType = value | TOPLEVEL::insert::none | 128; // TODO fix this! + effType = value | EFFECT::type::none; // TODO fix this! showValue = false; } else @@ -3367,13 +3367,13 @@ int ref = control; // we frequently modify this bool isBPM = (ref == 2 && offset == 1); //std::cout << "isbpm " << int(isBPM) << std::endl; - switch (effType & 127) + switch (effType) { - case TOPLEVEL::insert::none: + case EFFECT::type::none: effname = " None"; contstr = " "; break; - case TOPLEVEL::insert::reverb: + case EFFECT::type::reverb: { if (ref > 4) // there is no 5 or 6 in the list names ref -= 2; @@ -3397,7 +3397,7 @@ } break; } - case TOPLEVEL::insert::echo: + case EFFECT::type::echo: effname = " Echo "; if (ref > 6) // there is no 7-16 in the list names ref -= 10; @@ -3408,7 +3408,7 @@ contstr += (" " + bpm2text(float(value) / 127.0f)); } break; - case TOPLEVEL::insert::chorus: + case EFFECT::type::chorus: { effname = " Chorus "; if (ref > 10) // there is no 11-16 in the list names @@ -3442,7 +3442,7 @@ } break; } - case TOPLEVEL::insert::phaser: + case EFFECT::type::phaser: effname = " Phaser "; if (ref > 14) // there is no 15-16 in the list names ref -= 2; @@ -3475,7 +3475,7 @@ } } break; - case TOPLEVEL::insert::alienWah: + case EFFECT::type::alienWah: effname = " AlienWah "; if (ref > 10) // there is no 11-16 in the list names ref -= 6; @@ -3494,7 +3494,7 @@ contstr += (" " + bpm2text(float(value) / 127.0f)); } break; - case TOPLEVEL::insert::distortion: + case EFFECT::type::distortion: { effname = " Distortion "; if (ref > 5) // there is an extra line in the list names @@ -3532,7 +3532,7 @@ controlType = distortionlist[ref * 2]; break; } - case TOPLEVEL::insert::eq: + case EFFECT::type::eq: { effname = " EQ "; if (control > 1) @@ -3554,7 +3554,7 @@ controlType = eqlist[ref * 2]; break; } - case TOPLEVEL::insert::dynFilter: + case EFFECT::type::dynFilter: effname = " DynFilter "; if (ref > 10) // there is no 11-16 in the list names ref -= 6; @@ -3591,7 +3591,7 @@ break; } //std::cout << "control " << int(control) << std::endl; - if (control == EFFECT::control::preset && effType != (TOPLEVEL::insert::eq | 128)) + if (control == EFFECT::control::preset && effType != EFFECT::type::eq) { contstr = " Preset " + to_string (value + 1); showValue = false; diff -Nru yoshimi-2.2.1/src/Interface/InterChange.cpp yoshimi-2.2.2.1/src/Interface/InterChange.cpp --- yoshimi-2.2.1/src/Interface/InterChange.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Interface/InterChange.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -2067,7 +2067,7 @@ return true; } - if (effSend >= (TOPLEVEL::insert::none | 128) && effSend <= (TOPLEVEL::insert::dynFilter | 128)) + if (effSend >= (EFFECT::type::none) && effSend < (EFFECT::type::count)) { commandEffects(getData); return true; @@ -2197,7 +2197,7 @@ break; case TOPLEVEL::insert::oscillatorGroup: case TOPLEVEL::insert::harmonicAmplitude: - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicPhase: if (engine >= PART::engine::addMod1) { engine -= PART::engine::addMod1; @@ -2248,7 +2248,7 @@ commandSub(getData); part->kit[kititem].subpars->presetsUpdated(); break; - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicBandwidth: commandSub(getData); part->kit[kititem].subpars->presetsUpdated(); break; @@ -2319,7 +2319,7 @@ pars.presetsUpdated(); needApply = true; break; - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicPhase: commandOscillator(getData, pars.POscil.get()); pars.presetsUpdated(); needApply = true; @@ -4900,7 +4900,7 @@ target = 0; } } - tempData.data.insert = TOPLEVEL::insert::harmonicPhaseBandwidth; + tempData.data.insert = TOPLEVEL::insert::harmonicBandwidth; for (int i = 0; i < MAX_SUB_HARMONICS; ++i) { int val = pars->Phrelbw[i]; @@ -4936,7 +4936,7 @@ add2undo(getData, noteSeen); } - if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicBandwidth) { if (insert == TOPLEVEL::insert::harmonicAmplitude) { @@ -5600,7 +5600,7 @@ else add2undo(&tempData, noteSeen, true); } - tempData.data.insert = TOPLEVEL::insert::harmonicPhaseBandwidth; + tempData.data.insert = TOPLEVEL::insert::harmonicPhase; for (int i = 0; i < MAX_AD_HARMONICS; ++i) { tempData.data.value = oscil->Phphase[i]; @@ -5627,7 +5627,7 @@ getData->data.value = oscil->Phmag[control]; return; } - else if (insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + else if (insert == TOPLEVEL::insert::harmonicPhase) { if (write) { @@ -6940,7 +6940,7 @@ unsigned char type = getData->data.type; unsigned char control = getData->data.control; unsigned char npart = getData->data.part; - unsigned char effSend = getData->data.kit & 127; + unsigned char effSend = getData->data.kit; unsigned char effnum = getData->data.engine; bool write = (type & TOPLEVEL::type::Write) > 0; @@ -6962,9 +6962,11 @@ eff = synth->part[npart]->partefx[effnum]; else return; // invalid part number - if (effSend > TOPLEVEL::insert::dynFilter) + + if (effSend >= EFFECT::type::count) return; // invalid kit number - if (control != PART::control::effectType && effSend != eff->geteffect()) + + if (control != PART::control::effectType && effSend != (eff->geteffect() + EFFECT::type::none)) // geteffect not yet converted { if ((getData->data.source & TOPLEVEL::action::noAction) != TOPLEVEL::action::fromMIDI) synth->getRuntime().Log("Not Available"); // TODO sort this better for CLI as well as MIDI @@ -6975,7 +6977,7 @@ if (eff->geteffectpar(EFFECT::control::bpm) == 1) getData->data.offset = 1; // mark this for reporting in Data2Text - if (effSend == TOPLEVEL::insert::dynFilter && getData->data.insert != UNUSED) + if (effSend == EFFECT::type::dynFilter && getData->data.insert != UNUSED) { if (write) eff->seteffectpar(-1, true); // effect changed @@ -6993,7 +6995,7 @@ } if (write) { - if (effSend == TOPLEVEL::insert::eq) + if (effSend == EFFECT::type::eq) /* * specific to EQ * Control 1 is not a saved parameter, but a band index. @@ -7016,7 +7018,7 @@ else { eff->seteffectpar(control, value_int); - if (effSend == TOPLEVEL::insert::reverb && control == 10 && value_int == 2) + if (effSend == EFFECT::type::reverb && control == 10 && value_int == 2) // bandwidth type update for GUI getData->data.offset = eff->geteffectpar(12); } @@ -7024,7 +7026,7 @@ } else { - if (effSend == TOPLEVEL::insert::eq && control > 1) // specific to EQ + if (effSend == EFFECT::type::eq && control > 1) // specific to EQ { value = eff->geteffectpar(control + (eff->geteffectpar(1) * 5)); getData->data.parameter = eff->geteffectpar(1); @@ -7277,7 +7279,7 @@ } // should prolly move other inserts up here - if (effSend >= (TOPLEVEL::insert::none | 128) && effSend <= (TOPLEVEL::insert::dynFilter | 128)) + if (effSend >= EFFECT::type::none && effSend < EFFECT::type::count) { LimitMgr limits; return limits.geteffectlimits(getData); @@ -7288,7 +7290,7 @@ Part *part; part = synth->part[npart]; - if (engine == PART::engine::subSynth && (insert == UNUSED || (insert >= TOPLEVEL::oscillatorGroup && insert <= TOPLEVEL::harmonicPhaseBandwidth)) && parameter == UNUSED) + if (engine == PART::engine::subSynth && (insert == UNUSED || (insert >= TOPLEVEL::oscillatorGroup && insert <= TOPLEVEL::harmonicBandwidth)) && parameter == UNUSED) { SUBnoteParameters *subpars; subpars = part->kit[kititem].subpars; @@ -7345,7 +7347,7 @@ } return value; } - if (insert >= TOPLEVEL::insert::oscillatorGroup && insert <= TOPLEVEL::insert::harmonicPhaseBandwidth) + if (insert >= TOPLEVEL::insert::oscillatorGroup && insert <= TOPLEVEL::insert::harmonicPhase) { return part->kit[0].adpars->VoicePar[0].POscil->getLimits(getData); // we also use this for pad limits diff -Nru yoshimi-2.2.1/src/Interface/Text2Data.cpp yoshimi-2.2.2.1/src/Interface/Text2Data.cpp --- yoshimi-2.2.1/src/Interface/Text2Data.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Interface/Text2Data.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -473,33 +473,33 @@ ctl = PART::control::resonanceBandwidthDepth; } } + else if (findAndStep(source,"Time")) + { + if (findAndStep(source,"Stretch")) + ctl = PART::control::portamentoTimeStretch; + else + ctl = PART::control::portamentoTime; + } else if (findAndStep(source,"Portamento")) { if (findAndStep(source,"Receive")) ctl = PART::control::receivePortamento; - else if (findAndStep(source,"Time")) - { - if (findAndStep(source,"Stretch")) - ctl = PART::control::portamentoTimeStretch; - else - ctl = PART::control::portamentoTime; - } - else if (findAndStep(source,"Threshold Gate")) - { - if (findAndStep(source,"Type")) - ctl = PART::control::portamentoThresholdType; - else - ctl = PART::control::portamentoThreshold; - } - else if (findAndStep(source,"Prop")) - { - if (findAndStep(source,"Enable")) - ctl = PART::control::enableProportionalPortamento; - else if (findAndStep(source,"Rate")) - ctl = PART::control::proportionalPortamentoRate; - else if (findAndStep(source,"depth")) - ctl = PART::control::proportionalPortamentoDepth; - } + } + else if (findAndStep(source,"Threshold Gate")) + { + if (findAndStep(source,"Type")) + ctl = PART::control::portamentoThresholdType; + else + ctl = PART::control::portamentoThreshold; + } + else if (findAndStep(source,"Prop")) + { + if (findAndStep(source,"Enable")) + ctl = PART::control::enableProportionalPortamento; + else if (findAndStep(source,"Rate")) + ctl = PART::control::proportionalPortamentoRate; + else if (findAndStep(source,"depth")) + ctl = PART::control::proportionalPortamentoDepth; } if (ctl < UNUSED) { @@ -560,7 +560,7 @@ //cout << "effnum " << int(effnum) << endl; if (findAndStep(source, "DynFilter ~ Filter")) { - allData.data.kit = TOPLEVEL::insert::dynFilter | 128; + allData.data.kit = EFFECT::type::dynFilter; encodeFilter(source, allData); return; } @@ -593,55 +593,55 @@ } unsigned char efftype = findListEntry(source, 1, fx_list); - if (efftype >= TOPLEVEL::insert::count - TOPLEVEL::insert::none) + if (efftype >= EFFECT::type::count - EFFECT::type::none) { log(source, "effect type out of range"); return; } - int effpos = efftype + TOPLEVEL::insert::none; - allData.data.kit = efftype + (TOPLEVEL::insert::none | 128); + int effpos = efftype + EFFECT::type::none; + allData.data.kit = efftype + EFFECT::type::none; // now need to do actual control unsigned char result = UNUSED; std::cout << "effpos " << effpos << std::endl; switch (effpos) { - case TOPLEVEL::insert::reverb: + case EFFECT::type::reverb: result = findListEntry(source, 2, reverblist); if (result > 4) // no 5 or 6 result += 2; break; - case TOPLEVEL::insert::echo: + case EFFECT::type::echo: result = findListEntry(source, 2, echolist); if (result == 7) // skip unused numbers result = EFFECT::control::bpm; break; - case TOPLEVEL::insert::chorus: + case EFFECT::type::chorus: result = findListEntry(source, 2, choruslist); if (result >= 11) // skip unused numbers result = result - 11 + EFFECT::control::bpm; break; - case TOPLEVEL::insert::phaser: + case EFFECT::type::phaser: result = findListEntry(source, 2, phaserlist); if (result >= 15) // skip unused numbers result = result - 15 + EFFECT::control::bpm; break; - case TOPLEVEL::insert::alienWah: + case EFFECT::type::alienWah: result = findListEntry(source, 2, alienwahlist); if (result >= 11) // skip unused numbers result = result - 11 + EFFECT::control::bpm; break; - case TOPLEVEL::insert::distortion: + case EFFECT::type::distortion: result = findListEntry(source, 2, distortionlist); if (result > 5) // extra line result -= 1; break; - case TOPLEVEL::insert::eq: + case EFFECT::type::eq: result = findListEntry(source, 2, eqlist); if (result > 2) // extra line result -= 1; break; - case TOPLEVEL::insert::dynFilter: + case EFFECT::type::dynFilter: result = findListEntry(source, 2, dynfilterlist); if (result >= 11) // skip unused numbers result = result - 11 + EFFECT::control::bpm; @@ -1029,7 +1029,7 @@ } else if (findAndStep(source, "Bandwidth")) { - allData.data.insert = TOPLEVEL::insert::harmonicPhaseBandwidth; + allData.data.insert = TOPLEVEL::insert::harmonicBandwidth; ctl = harmonicNum; } if (ctl < UNUSED) @@ -1292,7 +1292,7 @@ if (findAndStep(source, "Amplitude")) allData.data.insert = TOPLEVEL::insert::harmonicAmplitude; else if (findAndStep(source, "Phase")) - allData.data.insert = TOPLEVEL::insert::harmonicPhaseBandwidth; + allData.data.insert = TOPLEVEL::insert::harmonicPhase; else log(source, " no harmonic type"); } diff -Nru yoshimi-2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.cpp yoshimi-2.2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.cpp --- yoshimi-2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -281,16 +281,6 @@ } -void *YoshimiLV2Plugin::idleThread() -{ - while (_synth->getRuntime().runSynth) - { - usleep(33333); // TODO what is the point of this? - } - return NULL; -} - - YoshimiLV2Plugin::YoshimiLV2Plugin(SynthEngine *synth, double sampleRate, const char *bundlePath, const LV2_Feature *const *features, const LV2_Descriptor *desc): MusicIO(synth, new SinglethreadedBeatTracker), _synth(synth), @@ -303,7 +293,6 @@ _bufferPos(0), _offsetPos(0), _bFreeWheel(NULL), - _pIdleThread(0), _lv2_desc(desc) { _uridMap.handle = NULL; @@ -383,8 +372,6 @@ getProgram(flatbankprgs.size() + 1); } _synth->getRuntime().runSynth = false; - if(_pIdleThread) - pthread_join(_pIdleThread, NULL); delete _synth; _synth = NULL; } @@ -418,12 +405,6 @@ _synth->getRuntime().runSynth = true; - if (!_synth->getRuntime().startThread(&_pIdleThread, YoshimiLV2Plugin::static_idleThread, this, false, 0, "LV2 idle")) - { - synth->getRuntime().Log("Failed to start idle thread"); - return false; - } - synth->getRuntime().Log("Starting in LV2 plugin mode"); return true; } @@ -667,12 +648,6 @@ } -void *YoshimiLV2Plugin::static_idleThread(void *arg) -{ - return static_cast(arg)->idleThread(); -} - - LV2_State_Status YoshimiLV2Plugin::static_StateSave(LV2_Handle instance, LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t flags, const LV2_Feature * const *features) { return static_cast(instance)->stateSave(store, handle, flags, features); diff -Nru yoshimi-2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.h yoshimi-2.2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.h --- yoshimi-2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.h 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/LV2_Plugin/YoshimiLV2Plugin.h 2022-09-14 22:56:29.000000000 +0000 @@ -79,14 +79,11 @@ float *_bFreeWheel; - pthread_t _pIdleThread; - float *lv2Left [NUM_MIDI_PARTS + 1]; float *lv2Right [NUM_MIDI_PARTS + 1]; void process(uint32_t sample_count); void processMidiMessage(const uint8_t *msg); - void *idleThread(void); std::vector flatbankprgs; const LV2_Descriptor *_lv2_desc; public: @@ -125,8 +122,6 @@ const LV2_Program_Descriptor * getProgram(uint32_t index); void selectProgramNew(unsigned char channel, uint32_t bank, uint32_t program); - static void *static_idleThread(void *arg); - static LV2_State_Status static_StateSave(LV2_Handle instance, LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t flags, const LV2_Feature *const * features); static LV2_State_Status static_StateRestore(LV2_Handle instance, LV2_State_Retrieve_Function retrieve, LV2_State_Handle handle, uint32_t flags, const LV2_Feature *const * features); diff -Nru yoshimi-2.2.1/src/Misc/BuildScheduler.h yoshimi-2.2.2.1/src/Misc/BuildScheduler.h --- yoshimi-2.2.1/src/Misc/BuildScheduler.h 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Misc/BuildScheduler.h 2022-09-14 22:56:29.000000000 +0000 @@ -24,7 +24,7 @@ #include #include #include -#include +//#include #include #include #include diff -Nru yoshimi-2.2.1/src/Misc/ConfBuild.h yoshimi-2.2.2.1/src/Misc/ConfBuild.h --- yoshimi-2.2.1/src/Misc/ConfBuild.h 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Misc/ConfBuild.h 2022-09-14 22:56:29.000000000 +0000 @@ -2,4 +2,4 @@ ConfBuild.h */ -#define BUILD_NUMBER 2146 +#define BUILD_NUMBER 2156 diff -Nru yoshimi-2.2.1/src/Misc/FileMgrFuncs.h yoshimi-2.2.2.1/src/Misc/FileMgrFuncs.h --- yoshimi-2.2.1/src/Misc/FileMgrFuncs.h 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Misc/FileMgrFuncs.h 2022-09-14 22:56:29.000000000 +0000 @@ -1,7 +1,7 @@ /* FileMgr.h - all file operations - Copyright 2019-2021 Will Godfrey and others. + Copyright 2019-2022 Will Godfrey and others. This file is part of yoshimi, which is free software: you can redistribute it and/or modify it under the terms of the GNU General Public @@ -421,7 +421,7 @@ { if (fn->d_type == DT_DIR) { - if(fn->d_name != dir1 && fn->d_name != dir2) + if (strcmp(fn->d_name, dir1) !=0 && strcmp(fn->d_name, dir2) !=0) ++ count; } } @@ -475,7 +475,9 @@ build.clear(); return; } - bool instype = ((exten == ".xiz") | (exten == ".xiy") | (exten == ".xi*")); + + // int to suppress clang compiler warning + bool instype = (int(exten == ".xiz") | (exten == ".xiy") | (exten == ".xi*")); string last; last.clear(); for (std::list::iterator it = build.begin(); it != build.end(); ++it) diff -Nru yoshimi-2.2.1/src/Misc/SynthEngine.cpp yoshimi-2.2.2.1/src/Misc/SynthEngine.cpp --- yoshimi-2.2.1/src/Misc/SynthEngine.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Misc/SynthEngine.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -870,7 +870,7 @@ } else { - putData.data.kit = (TOPLEVEL::insert::none | 128) + sysefx[effnum]->geteffect(); + putData.data.kit = EFFECT::type::none + sysefx[effnum]->geteffect(); putData.data.control = parnum; } } @@ -884,7 +884,7 @@ putData.data.control = 2; else { - putData.data.kit = (TOPLEVEL::insert::none | 128) + insefx[effnum]->geteffect(); + putData.data.kit = EFFECT::type::none + insefx[effnum]->geteffect(); putData.data.control = parnum; } } diff -Nru yoshimi-2.2.1/src/MusicIO/MusicClient.cpp yoshimi-2.2.2.1/src/MusicIO/MusicClient.cpp --- yoshimi-2.2.1/src/MusicIO/MusicClient.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/MusicIO/MusicClient.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -45,9 +45,9 @@ std::set clSet; music_clients c1 = {0, _synth->getRuntime().audioEngine, _synth->getRuntime().midiEngine}; clSet.insert(c1); - music_clients c2 = {1, jack_audio, jack_midi}; + music_clients c2 = {1, jack_audio, alsa_midi}; clSet.insert(c2); - music_clients c3 = {2, jack_audio, alsa_midi}; + music_clients c3 = {2, jack_audio, jack_midi}; clSet.insert(c3); music_clients c4 = {3, alsa_audio, alsa_midi}; clSet.insert(c4); @@ -55,8 +55,12 @@ clSet.insert(c5); music_clients c6 = {5, alsa_audio, no_midi}; clSet.insert(c6); - music_clients c7 = {6, no_audio, no_midi}; //this one always will do the work :) + music_clients c7 = {6, no_audio, alsa_midi}; clSet.insert(c7); + music_clients c8 = {7, no_audio, jack_midi}; + clSet.insert(c8); + music_clients c9 = {8, no_audio, no_midi}; //this one always will do the work :) + clSet.insert(c9); for (std::set::iterator it = clSet.begin(); it != clSet.end(); ++it) { @@ -76,7 +80,6 @@ delete client; } } - return 0; } diff -Nru yoshimi-2.2.1/src/Params/FilterParams.cpp yoshimi-2.2.2.1/src/Params/FilterParams.cpp --- yoshimi-2.2.1/src/Params/FilterParams.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Params/FilterParams.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -395,7 +395,7 @@ float value = getData->data.value; int request = int(getData->data.type & TOPLEVEL::type::Default); int control = getData->data.control; - int effType = getData->data.kit & 127; + int effType = getData->data.kit; int engine = getData->data.engine; unsigned char type = 0; @@ -411,7 +411,7 @@ switch (control) { case FILTERINSERT::control::centerFrequency: - if (effType == TOPLEVEL::insert::dynFilter) + if (effType == EFFECT::type::dynFilter) def = 45; else if (engine == PART::engine::subSynth) def = 80; @@ -423,7 +423,7 @@ case FILTERINSERT::control::Q: if (engine >= PART::engine::addVoice1) def = 60; - else if (effType != TOPLEVEL::insert::dynFilter) + else if (effType != EFFECT::type::dynFilter) def = 40; break; // for dynFilter it's the default 64 case FILTERINSERT::control::frequencyTracking: @@ -437,7 +437,7 @@ case FILTERINSERT::control::gain: break; case FILTERINSERT::control::stages: - if (effType == TOPLEVEL::insert::dynFilter) + if (effType == EFFECT::type::dynFilter) def = 1; else def = 0; diff -Nru yoshimi-2.2.1/src/Params/OscilParameters.cpp yoshimi-2.2.2.1/src/Params/OscilParameters.cpp --- yoshimi-2.2.1/src/Params/OscilParameters.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Params/OscilParameters.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -285,7 +285,7 @@ unsigned char learnable = TOPLEVEL::type::Learnable; type |= learnable; - if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicPhase) { // do harmonics stuff if (insert == TOPLEVEL::insert::harmonicAmplitude && control == 0) def = 127; diff -Nru yoshimi-2.2.1/src/Params/PADnoteParameters.cpp yoshimi-2.2.2.1/src/Params/PADnoteParameters.cpp --- yoshimi-2.2.1/src/Params/PADnoteParameters.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Params/PADnoteParameters.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -879,8 +879,8 @@ bool isOK = true; for (size_t tab = 0; tab < waveTable.numTables; ++tab) { - char tmpstr[20]; - snprintf(tmpstr, 20, "-%02zu", tab + 1); + char tmpstr[22]; + snprintf(tmpstr, 22, "-%02zu", tab + 1); string filename = basefilename + string(tmpstr) + EXTEN::MSwave; unsigned int block; unsigned short int sBlock; diff -Nru yoshimi-2.2.1/src/Params/SUBnoteParameters.cpp yoshimi-2.2.2.1/src/Params/SUBnoteParameters.cpp --- yoshimi-2.2.1/src/Params/SUBnoteParameters.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Params/SUBnoteParameters.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -409,7 +409,7 @@ unsigned char learnable = TOPLEVEL::type::Learnable; type |= learnable; - if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + if (insert == TOPLEVEL::insert::harmonicAmplitude || insert == TOPLEVEL::insert::harmonicBandwidth) { // do harmonics stuff if (control >= MAX_SUB_HARMONICS) { @@ -417,7 +417,7 @@ return 1; } - if (insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + if (insert == TOPLEVEL::insert::harmonicBandwidth) def = 64; else if (control == 0) def = 127; diff -Nru yoshimi-2.2.1/src/Synth/ADnote.cpp yoshimi-2.2.2.1/src/Synth/ADnote.cpp --- yoshimi-2.2.1/src/Synth/ADnote.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Synth/ADnote.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -148,11 +148,13 @@ , topVoice{topVoice_} , parentFMmod{parentFMmod_} { + // Start phase for sub-Voices should be negative so that the zero phase in + // the first cycle will result in a positive phase change. int phase = (topVoice==this)? 0 : synth.oscilsize - phaseOffset; - // Start phase for sub-Voices should be negative - // so that the zero phase in the first cycle will result in a positive phase change. - for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) + for (int nvoice = 0; nvoice < NUM_VOICES; ++nvoice) { NoteVoicePar[nvoice].phaseOffset = phase; + NoteVoicePar[nvoice].fmPhaseOffset = phase; + } construct(); } @@ -560,20 +562,6 @@ NoteVoicePar[nvoice].oscilSmp.attachReference(topVoice->NoteVoicePar[nvoice].oscilSmp); } - int oscposhi_start; - if (NoteVoicePar[nvoice].voice == -1) - oscposhi_start = adpars.VoicePar[vc].OscilSmp->getPhase(); - else - oscposhi_start = 0; - int kth_start = oscposhi_start; - for (int k = 0; k < unison; ++k) - { - oscposhi[nvoice][k] = kth_start % synth.oscilsize; - // put random starting point for other subvoices - kth_start = oscposhi_start + (int)(synth.numRandom() * adpars.VoicePar[nvoice].Unison_phase_randomness - / 127.0f * (synth.oscilsize - 1)); - } - if (adpars.VoicePar[nvoice].Type != 0) NoteVoicePar[nvoice].fmEnabled = NONE; else @@ -661,6 +649,8 @@ if (NoteVoicePar[nvoice].voice != -1) { + computePhaseOffsets(nvoice); + subVoice[nvoice].reset(new unique_ptr[unison_size[nvoice]]); for (size_t k = 0; k < unison_size[nvoice]; ++k) { @@ -675,6 +665,8 @@ if (NoteVoicePar[nvoice].fmVoice != -1) { + computeFMPhaseOffsets(nvoice); + bool voiceForFM = NoteVoicePar[nvoice].fmEnabled == FREQ_MOD; subFMVoice[nvoice].reset(new unique_ptr[unison_size[nvoice]]); for (size_t k = 0; k < unison_size[nvoice]; ++k) { @@ -914,35 +906,53 @@ if (adpars.VoicePar[nvoice].PFilterLfoEnabled) NoteVoicePar[nvoice].filterLFO.reset(new LFO{adpars.VoicePar[nvoice].FilterLfo, note.freq, &synth}); - // Voice Modulation Parameters Init - if (NoteVoicePar[nvoice].fmEnabled != NONE - && NoteVoicePar[nvoice].fmVoice < 0) + int kth_start = 0; + for (size_t k = 0; k < unison_size[nvoice]; ++k) { - // Perform Anti-aliasing only on MORPH or RING MODULATION + oscposhi[nvoice][k] = kth_start; + // put random starting point for other subvoices + kth_start = (int)(synth.numRandom() * adpars.VoicePar[nvoice].Unison_phase_randomness + / 127.0f * (synth.oscilsize - 1)); + } - int vc = nvoice; - if (adpars.VoicePar[nvoice].PextFMoscil != -1) - vc = adpars.VoicePar[nvoice].PextFMoscil; + // Voice Modulation Parameters Init + if (NoteVoicePar[nvoice].fmEnabled != NONE) + { + if (NoteVoicePar[nvoice].fmVoice < 0) + { + int vc = nvoice; + if (adpars.VoicePar[nvoice].PextFMoscil != -1) + vc = adpars.VoicePar[nvoice].PextFMoscil; - if (subVoiceNr == -1) { - // this voice maintains its own oscil wavetable... - NoteVoicePar[nvoice].fmSmp.allocateWaveform(synth.oscilsize); - - adpars.VoicePar[nvoice].FMSmp->newrandseed(); - if (!adpars.GlobalPar.Hrandgrouping) - adpars.VoicePar[vc].FMSmp->newrandseed(); + if (subVoiceNr == -1) { + // this voice maintains its own oscil wavetable... + NoteVoicePar[nvoice].fmSmp.allocateWaveform(synth.oscilsize); + + adpars.VoicePar[nvoice].FMSmp->newrandseed(); + if (!adpars.GlobalPar.Hrandgrouping) + adpars.VoicePar[vc].FMSmp->newrandseed(); + + } else { + // If subvoice use oscillator from original voice. + NoteVoicePar[nvoice].fmSmp.attachReference(topVoice->NoteVoicePar[nvoice].fmSmp); + } + for (size_t k = 0; k < unison_size[nvoice]; ++k) + oscposhiFM[nvoice][k] = + (oscposhi[nvoice][k] + adpars.VoicePar[vc].FMSmp-> + getPhase()) % synth.oscilsize; } else { - // If subvoice use oscillator from original voice. - NoteVoicePar[nvoice].fmSmp.attachReference(topVoice->NoteVoicePar[nvoice].fmSmp); + for (size_t k = 0; k < unison_size[nvoice]; ++k) + oscposhiFM[nvoice][k] = oscposhi[nvoice][k]; } + } + // Offset by oscillator phase. + if (NoteVoicePar[nvoice].voice == -1) { + int oscposhi_start; + oscposhi_start = adpars.VoicePar[nvoice].OscilSmp->getPhase(); for (size_t k = 0; k < unison_size[nvoice]; ++k) - oscposhiFM[nvoice][k] = - (oscposhi[nvoice][k] + adpars.VoicePar[vc].FMSmp-> - getPhase()) % synth.oscilsize; - - NoteVoicePar[nvoice].fmPhaseOffset = 0; + oscposhi[nvoice][k] = (oscposhi[nvoice][k] + oscposhi_start) % synth.oscilsize; } if (adpars.VoicePar[nvoice].PFMFreqEnvelopeEnabled != 0) @@ -1119,52 +1129,26 @@ NoteVoicePar[nvoice].oscilSmp.fillInterpolationBuffer(); } - int new_phase_offset = (int)((adpars.VoicePar[nvoice].Poscilphase - 64.0f) - / 128.0f * synth.oscilsize + synth.oscilsize * 4); - int phase_offset_diff = new_phase_offset - NoteVoicePar[nvoice].phaseOffset; - for (int k = 0; k < unison; ++k) { - oscposhi[nvoice][k] = (oscposhi[nvoice][k] + phase_offset_diff) % synth.oscilsize; - if (oscposhi[nvoice][k] < 0) - // This is necessary, because C '%' operator does not always - // return a positive result. - oscposhi[nvoice][k] += synth.oscilsize; - } - NoteVoicePar[nvoice].phaseOffset = new_phase_offset; - if (NoteVoicePar[nvoice].fmEnabled != NONE - && NoteVoicePar[nvoice].fmVoice < 0) - { - if (subVoiceNr == -1) { - int vc = nvoice; - if (adpars.VoicePar[nvoice].PextFMoscil != -1) - vc = adpars.VoicePar[nvoice].PextFMoscil; + && NoteVoicePar[nvoice].fmVoice < 0 + && subVoiceNr == -1) { + int vc = nvoice; + if (adpars.VoicePar[nvoice].PextFMoscil != -1) + vc = adpars.VoicePar[nvoice].PextFMoscil; - float freqtmp = 1.0f; - if (adpars.VoicePar[vc].POscilFM->Padaptiveharmonics != 0 - || (NoteVoicePar[nvoice].fmEnabled == MORPH) - || (NoteVoicePar[nvoice].fmEnabled == RING_MOD)) - freqtmp = getFMVoiceBaseFreq(nvoice); + float freqtmp = 1.0f; + if (adpars.VoicePar[vc].POscilFM->Padaptiveharmonics != 0 + || (NoteVoicePar[nvoice].fmEnabled == MORPH) + || (NoteVoicePar[nvoice].fmEnabled == RING_MOD)) + freqtmp = getFMVoiceBaseFreq(nvoice); - adpars.VoicePar[vc].FMSmp->getWave(NoteVoicePar[nvoice].fmSmp, freqtmp); - NoteVoicePar[nvoice].fmSmp.fillInterpolationBuffer(); - } - - int new_FMphase_offset = (int)((adpars.VoicePar[nvoice].PFMoscilphase - 64.0f) - / 128.0f * synth.oscilsize_f - + synth.oscilsize_f * 4.0f); - int FMphase_offset_diff = new_FMphase_offset - NoteVoicePar[nvoice].fmPhaseOffset; - for (size_t k = 0; k < unison_size[nvoice]; ++k) - { - oscposhiFM[nvoice][k] += FMphase_offset_diff; - oscposhiFM[nvoice][k] %= synth.oscilsize; - if (oscposhiFM[nvoice][k] < 0) - // This is necessary, because C '%' operator does not always - // return a positive result. - oscposhiFM[nvoice][k] += synth.oscilsize; - } - NoteVoicePar[nvoice].fmPhaseOffset = new_FMphase_offset; + adpars.VoicePar[vc].FMSmp->getWave(NoteVoicePar[nvoice].fmSmp, freqtmp); + NoteVoicePar[nvoice].fmSmp.fillInterpolationBuffer(); } + computePhaseOffsets(nvoice); + computeFMPhaseOffsets(nvoice); + bool is_pwm = NoteVoicePar[nvoice].fmEnabled == PW_MOD; unison_stereo_spread[nvoice] = @@ -1289,6 +1273,41 @@ } } +void ADnote::computePhaseOffsets(int nvoice) +{ + int new_phase_offset = (int)((adpars.VoicePar[nvoice].Poscilphase - 64.0f) + / 128.0f * synth.oscilsize + synth.oscilsize * 4); + int phase_offset_diff = new_phase_offset - NoteVoicePar[nvoice].phaseOffset; + for (size_t k = 0; k < unison_size[nvoice]; ++k) { + oscposhi[nvoice][k] = (oscposhi[nvoice][k] + phase_offset_diff) % synth.oscilsize; + if (oscposhi[nvoice][k] < 0) + // This is necessary, because C '%' operator does not always + // return a positive result. + oscposhi[nvoice][k] += synth.oscilsize; + } + NoteVoicePar[nvoice].phaseOffset = new_phase_offset; +} + +void ADnote::computeFMPhaseOffsets(int nvoice) +{ + if (NoteVoicePar[nvoice].fmEnabled != NONE) { + int new_FMphase_offset = (int)((adpars.VoicePar[nvoice].PFMoscilphase - 64.0f) + / 128.0f * synth.oscilsize_f + + synth.oscilsize_f * 4.0f); + int FMphase_offset_diff = new_FMphase_offset - NoteVoicePar[nvoice].fmPhaseOffset; + for (size_t k = 0; k < unison_size[nvoice]; ++k) + { + oscposhiFM[nvoice][k] += FMphase_offset_diff; + oscposhiFM[nvoice][k] %= synth.oscilsize; + if (oscposhiFM[nvoice][k] < 0) + // This is necessary, because C '%' operator does not always + // return a positive result. + oscposhiFM[nvoice][k] += synth.oscilsize; + } + NoteVoicePar[nvoice].fmPhaseOffset = new_FMphase_offset; + } +} + // Get Voice's Modullator base frequency float ADnote::getFMVoiceBaseFreq(int nvoice) { diff -Nru yoshimi-2.2.1/src/Synth/ADnote.h yoshimi-2.2.2.1/src/Synth/ADnote.h --- yoshimi-2.2.1/src/Synth/ADnote.h 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/Synth/ADnote.h 2022-09-14 22:56:29.000000000 +0000 @@ -166,6 +166,8 @@ void computeUnisonFreqRap(int nvoice); void computeNoteParameters(void); void computeWorkingParameters(void); + void computePhaseOffsets(int nvoice); + void computeFMPhaseOffsets(int nvoice); void initParameters(void); void initSubVoices(void); void killVoice(int nvoice); diff -Nru yoshimi-2.2.1/src/UI/EffUI.fl yoshimi-2.2.2.1/src/UI/EffUI.fl --- yoshimi-2.2.1/src/UI/EffUI.fl 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/EffUI.fl 2022-09-14 22:56:29.000000000 +0000 @@ -219,7 +219,7 @@ effchoruswindow->hide(); // delete (effchoruswindow); effphaserwindow->hide(); // delete (effphaserwindow); effalienwahwindow->hide(); // delete (effalienwahwindow); - effdistorsionwindow->hide(); // delete (effdistorsionwindow); + effdistortionwindow->hide(); // delete (effdistortionwindow); effeqwindow->hide(); // delete (effeqwindow); effdynamicfilterwindow->hide(); // delete (effdynamicfilterwindow); @@ -254,21 +254,21 @@ Fl_Choice revp { label Preset callback {// - send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {115 13 90 15} down_box BORDER_BOX color 14 selection_color 0 labelsize 11 textfont 1 textsize 10 textcolor 7 code0 {o->add("Cathedral 1");o->add("Cathedral 2");o->add("Cathedral 3");o->add("Hall 1");o->add("Hall 2");o->add("Room 1");o->add("Room 2");o->add("Basement");o->add("Tunnel");o->add("Echoed 1");o->add("Echoed 2");o->add("Very Long 1");o->add("Very Long 2");} } {} Fl_Choice revp10 { label Type callback {// - send_data(TOPLEVEL::action::forceUpdate, 10, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 10, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {240 13 75 15} down_box BORDER_BOX color 14 labelsize 11 textfont 1 textsize 10 textcolor 7 code0 {o->add("Random");o->add("Freeverb");o->add("Bandwidth");} } {} Fl_Dial revp0 { label Vol callback {// - send_data(0, 0, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, 0, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {10 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code1 {o->setValueType(VC_FXReverbVol);} class WidgetPDial @@ -277,7 +277,7 @@ label Pan callback {// int butt = 1; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {45 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code1 {o->setValueType(VC_PanningStd);} class WidgetPDial @@ -286,7 +286,7 @@ label Time callback {// int butt = 2; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Duration of effect} xywh {80 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code1 {o->setValueType(VC_FXReverbTime);} class WidgetPDial @@ -295,7 +295,7 @@ label {I.del} callback {// int butt = 3; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Initial delay} xywh {120 40 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_FXReverbIDelay);} class WidgetPDial @@ -304,7 +304,7 @@ label {I.delfb} callback {// int butt = 4; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Initial delay feedback} xywh {155 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_percent128);} class WidgetPDial @@ -313,7 +313,7 @@ label BW callback {// int butt = 12; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {200 40 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 deactivate code0 {if (eff->geteffectpar(10)==2) o->activate();} code1 {o->setValueType(VC_FXReverbBandwidth);} @@ -323,7 +323,7 @@ label {E/R} callback {// int butt = 6; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} xywh {235 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 deactivate class WidgetPDial } @@ -331,7 +331,7 @@ label LPF callback {// int butt = 7; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {Low pass filter} xywh {270 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXReverbLowPass);} class WidgetPDial @@ -340,7 +340,7 @@ label HPF callback {// int butt = 8; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip {High pass filter} xywh {305 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXReverbHighPass);} class WidgetPDial @@ -349,7 +349,7 @@ label Damp callback {// int butt = 9; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip Dampening xywh {340 40 30 30} box ROUND_UP_BOX labelsize 11 minimum 64 maximum 127 step 1 code0 {o->setValueType(VC_percent64_127);} class WidgetPDial @@ -358,7 +358,7 @@ label {R.S.} callback {// int butt = 11; - send_data(0, butt, o->value(), (TOPLEVEL::insert::reverb | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::reverb), TOPLEVEL::type::Integer);} tooltip RoomSize xywh {342 8 25 25} box ROUND_UP_BOX labelsize 10 align 4 minimum 1 maximum 127 step 1 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -377,14 +377,14 @@ Fl_Choice echop { label Preset callback {// - send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} xywh {102 13 96 15} down_box BORDER_BOX color 14 selection_color 0 labelsize 11 textfont 1 textsize 10 textcolor 7 code0 {o->add("Echo 1");o->add("Echo 2");o->add("Echo 3");o->add("Echo 4");o->add("Simple Echo");o->add("Canyon");o->add("Panning Echo 1");o->add("Panning Echo 2");o->add("Feedback Echo 3");} } {} Fl_Dial echop0 { label Vol callback {// - send_data(0, 0, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, 0, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {10 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXEchoVol);} class WidgetPDial @@ -393,7 +393,7 @@ label Pan callback {// int butt = 1; - send_data(0, butt, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} xywh {64 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial @@ -402,7 +402,7 @@ label Delay callback {// int butt = 2; - send_data(0, butt, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} xywh {118 40 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(eff->geteffectpar(EFFECT::control::bpm) ? VC_FXlfofreqBPM : VC_FXEchoDelay);} class WidgetPDial @@ -411,7 +411,7 @@ label {LRdl.} callback {// int butt = 3; - send_data(0, butt, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {Delay between L/R} xywh {172 40 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_FXEchoLRdel);} class WidgetPDial @@ -420,7 +420,7 @@ label {LRc.} callback {// int butt = 4; - send_data(0, butt, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {L/R crossover} xywh {226 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -429,7 +429,7 @@ label {Fb.} callback {// int butt = 5; - send_data(0, butt, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip Feedback xywh {280 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -438,7 +438,7 @@ label Damp callback {// int butt = 6; - send_data(0, butt, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip Dampening xywh {334 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -446,7 +446,7 @@ Fl_Check_Button echop17 { label BPM callback {// - send_data(0, EFFECT::control::bpm, o->value(), (TOPLEVEL::insert::echo | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::echo), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM. Note that the delay is capped at 5 seconds, even if the tempo is slower than this.} xywh {325 10 45 15} down_box DOWN_BOX labelsize 11 } } @@ -463,21 +463,21 @@ Fl_Choice chorusp { label Preset callback {// - send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {121 13 96 16} down_box BORDER_BOX color 14 selection_color 0 labelsize 11 textfont 1 textsize 10 textcolor 7 code0 {o->add("Chorus 1");o->add("Chorus 2");o->add("Chorus 3");o->add("Celeste 1");o->add("Celeste 2");o->add("Flange 1");o->add("Flange 2");o->add("Flange 3");o->add("Flange 4");o->add("Flange 5");} } {} Fl_Choice chorusp4 { label {LFO type} callback {// - send_data(0, 4, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, 4, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {189 65 43 15} down_box BORDER_BOX labelsize 10 align 2 textfont 1 textsize 9 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial chorusp0 { label Vol callback {// - send_data(0, 0, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, 0, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {10 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXdefaultVol);} class WidgetPDial @@ -486,7 +486,7 @@ label Pan callback {// int butt = 1; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {45 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial @@ -495,7 +495,7 @@ label Freq callback {// int butt = 2; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {85 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(eff->geteffectpar(EFFECT::control::bpm) ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial @@ -503,7 +503,7 @@ Fl_Dial chorusp18 { label Start callback {// - send_data(0, EFFECT::control::bpmStart, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpmStart, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {120 50 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (eff->geteffectpar(EFFECT::control::bpm)) o->activate(); else o->deactivate();} @@ -513,7 +513,7 @@ label Rnd callback {// int butt = 3; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {155 49 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -522,7 +522,7 @@ label {St.df} callback {// int butt = 5; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {L/R phase shift} xywh {237 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXlfoStereo);} class WidgetPDial @@ -531,7 +531,7 @@ label Dpth callback {// int butt = 6; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {LFO depth} xywh {272 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXChorusDepth);} class WidgetPDial @@ -540,7 +540,7 @@ label Delay callback {// int butt = 7; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {307 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXChorusDelay);} class WidgetPDial @@ -549,7 +549,7 @@ label Fb callback {// int butt =8; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip Feedback xywh {342 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXdefaultFb);} class WidgetPDial @@ -558,7 +558,7 @@ label {L/R} callback {// int butt = 9; - send_data(0, butt, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Channel routing} xywh {254 15 30 30} box ROUND_UP_BOX labelsize 11 align 1 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -566,7 +566,7 @@ Fl_Check_Button chorusflange { label Flange callback {// - send_data(0, 10, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, 10, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} xywh {120 10 55 20} box THIN_UP_BOX down_box DOWN_BOX color 230 labelfont 1 labelsize 10 hide deactivate code0 {o->value(eff->geteffectpar(10));} class Fl_Check_Button2 @@ -574,14 +574,14 @@ Fl_Check_Button chorusp11 { label Subtract callback {// - send_data(0, 11, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, 11, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Inverts the output} xywh {300 19 70 16} down_box DOWN_BOX color 230 labelsize 11 class Fl_Check_Button2 } Fl_Check_Button chorusp17 { label BPM callback {// - send_data(0, EFFECT::control::bpm, o->value(), (TOPLEVEL::insert::chorus | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::chorus), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {190 45 50 15} down_box DOWN_BOX labelsize 11 } } @@ -598,21 +598,21 @@ Fl_Choice phaserp { label Preset callback {// - send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {65 21 82 15} box UP_BOX down_box BORDER_BOX color 14 selection_color 0 labelsize 11 align 1 textfont 1 textsize 10 textcolor 7 code0 {o->add("Phaser 1");o->add("Phaser 2");o->add("Phaser 3");o->add("Phaser 4");o->add("Phaser 5");o->add("Phaser 6");o->add("APhaser 1");o->add("APhaser 2");o->add("APhaser 3");o->add("APhaser 4");o->add("APhaser 5");o->add("APhaser 6");} } {} Fl_Choice phaserp4 { label {LFO Type} callback {// - send_data(0, 4, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, 4, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {199 65 43 15} down_box BORDER_BOX labelsize 10 align 2 textfont 1 textsize 9 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial phaserp0 { label Vol callback {// - send_data(0, 0, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, 0, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {8 50 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXdefaultVol);} class WidgetPDial @@ -621,7 +621,7 @@ label Pan callback {// int butt = 1; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {46 50 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial @@ -630,7 +630,7 @@ label Freq callback {// int butt = 2; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {84 50 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(eff->geteffectpar(EFFECT::control::bpm) ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial @@ -638,7 +638,7 @@ Fl_Dial phaserp18 { label Start callback {// - send_data(0, EFFECT::control::bpmStart, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpmStart, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {125 50 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (eff->geteffectpar(EFFECT::control::bpm)) o->activate(); else o->deactivate();} @@ -648,7 +648,7 @@ label Rnd callback {// int butt = 3; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {165 50 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -656,7 +656,7 @@ Fl_Check_Button phaserp17 { label BPM callback {// - send_data(0, EFFECT::control::bpm, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {200 47 17 15} down_box DOWN_BOX labelsize 11 align 8 code0 {o->value(eff->geteffectpar(EFFECT::control::bpm));} class Fl_Check_Button2 @@ -665,7 +665,7 @@ label {St.df} callback {// int butt = 5; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Left/Right channel phase shift} xywh {248 50 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXlfoStereo);} class WidgetPDial @@ -674,7 +674,7 @@ label Depth callback {// int butt = 6; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {LFO depth} xywh {191 15 30 30} box ROUND_UP_BOX labelsize 11 align 1 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -683,7 +683,7 @@ label Fb callback {// int butt = 7; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip Feedback xywh {286 50 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXdefaultFb);} class WidgetPDial @@ -691,14 +691,14 @@ Fl_Counter phaserp8 { label Stages callback {// - send_data(0, 8, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, 8, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {326 63 45 15} type Simple labelsize 11 minimum 1 maximum 12 step 1 textfont 1 textsize 11 } Fl_Dial phaserp9 { label {L/R} callback {// int butt = 9; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Channel routing} xywh {229 15 30 30} box ROUND_UP_BOX labelsize 11 align 1 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -706,7 +706,7 @@ Fl_Check_Button phaserp10 { label {Sub.} callback {// - send_data(0, 10, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, 10, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Inverts the output} xywh {356 42 17 16} down_box DOWN_BOX color 230 labelsize 11 align 4 class Fl_Check_Button2 } @@ -714,7 +714,7 @@ label Phase callback {// int butt = 11; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} xywh {150 15 30 30} box ROUND_UP_BOX labelsize 11 align 1 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -722,7 +722,7 @@ Fl_Check_Button phaserp12 { label Hyper callback {// - send_data(0, 12, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, 12, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Hyper-sine} xywh {356 26 17 15} down_box DOWN_BOX labelsize 11 align 4 deactivate class Fl_Check_Button2 } @@ -730,7 +730,7 @@ label Dist callback {// int butt = 13; - send_data(0, butt, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip Distortion xywh {267 15 30 30} box ROUND_UP_BOX labelsize 11 align 1 maximum 127 deactivate code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -738,7 +738,7 @@ Fl_Check_Button phaserp14 { label Analog callback {// - send_data(TOPLEVEL::action::forceUpdate, 14, o->value(), (TOPLEVEL::insert::phaser | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 14, o->value(), (EFFECT::type::phaser), TOPLEVEL::type::Integer);} tooltip {Emulates FET} xywh {356 10 17 15} down_box DOWN_BOX labelsize 11 align 4 class Fl_Check_Button2 } @@ -756,21 +756,21 @@ Fl_Choice awp { label Preset callback {// - send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {135 13 96 15} down_box BORDER_BOX color 14 selection_color 0 labelsize 11 textfont 1 textsize 10 textcolor 7 code0 {o->add("Alienwah 1");o->add("Alienwah 2");o->add("Alienwah 3");o->add("Alienwah 4");} } {} Fl_Choice awp4 { label {LFO type} callback {// - send_data(0, 4, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, 4, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {185 65 43 15} down_box BORDER_BOX labelsize 10 align 2 textfont 1 textsize 9 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial awp0 { label Vol callback {// - send_data(0, 0, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, 0, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {5 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } @@ -778,7 +778,7 @@ label Pan callback {// int butt = 1; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {40 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } @@ -786,7 +786,7 @@ label Freq callback {// int butt = 2; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {80 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(eff->geteffectpar(EFFECT::control::bpm) ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial @@ -795,7 +795,7 @@ label Rnd callback {// int butt = 3; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {150 50 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -803,7 +803,7 @@ Fl_Dial awp18 { label Start callback {// - send_data(0, EFFECT::control::bpmStart, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpmStart, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {115 50 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (eff->geteffectpar(EFFECT::control::bpm)) o->activate(); else o->deactivate();} @@ -813,7 +813,7 @@ label {St.df} callback {// int butt = 5; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Left/Right channel phase shift} xywh {231 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } @@ -821,7 +821,7 @@ label Dpth callback {// int butt = 6; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip Depth xywh {266 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } @@ -829,7 +829,7 @@ label Fb callback {// int butt = 7; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip Feedback xywh {301 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } @@ -837,7 +837,7 @@ label {L/R} callback {// int butt = 9; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {285 15 30 30} box ROUND_UP_BOX labelsize 11 align 1 maximum 127 class WidgetPDial } @@ -845,27 +845,27 @@ label Phase callback {// int butt = 10; - send_data(0, butt, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {245 15 30 30} box ROUND_UP_BOX labelsize 11 align 1 maximum 127 class WidgetPDial } Fl_Counter awp8 { label Delay callback {// - send_data(0, 8, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, 8, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} xywh {338 64 35 15} type Simple labelsize 11 minimum 0 maximum 100 step 1 textsize 11 } Fl_Check_Button awp17 { label BPM callback {// - send_data(0, EFFECT::control::bpm, o->value(), (TOPLEVEL::insert::alienWah | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::alienWah), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {185 45 45 15} down_box DOWN_BOX labelsize 11 code0 {o->value(eff->geteffectpar(EFFECT::control::bpm));} } } } - Function {make_distorsion_window()} {} { - Fl_Window effdistorsionwindow { + Function {make_distortion_window()} {} { + Fl_Window effdistortionwindow { xywh {879 667 380 95} type Double box PLASTIC_UP_BOX color 221 labelfont 1 hide class Fl_Group } { @@ -876,21 +876,21 @@ Fl_Choice distp { label Preset callback {// - send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} xywh {139 13 96 16} down_box BORDER_BOX color 14 selection_color 0 labelsize 11 textfont 1 textsize 10 textcolor 7 code0 {o->add("Overdrive 1");o->add("Overdrive 2");o->add("Exciter 1");o->add("Exciter 2");o->add("Guitar Amp");o->add("Quantize");} } {} Fl_Choice distp5 { label Type callback {// - send_data(0, 5, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, 5, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} xywh {192 56 60 15} box UP_BOX down_box BORDER_BOX labelsize 10 align 2 textfont 1 textsize 9 code0 {o->add("Atan");o->add("Asym 1");o->add("Power1");o->add("Sine");o->add("Quants");o->add("Zigzag");o->add("Limit");o->add("LimtiU");o->add("LimitL");o->add("ILimit");o->add("Clip");o->add("Asym 2");o->add("Power2");o->add("Sigm");} } {} Fl_Dial distp0 { label Vol callback {// - send_data(0, 0, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, 0, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {10 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXDistVol);} class WidgetPDial @@ -899,7 +899,7 @@ label Pan callback {// int butt = 1; - send_data(0, butt, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} xywh {45 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_PanningStd);} class WidgetPDial @@ -908,7 +908,7 @@ label {LRc.} callback {// int butt = 2; - send_data(0, butt, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {L/R mix} xywh {80 40 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -917,7 +917,7 @@ label Drive callback {// int butt = 3; - send_data(0, butt, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {Input amplification} xywh {120 40 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -926,7 +926,7 @@ label Level callback {// int butt = 4; - send_data(0, butt, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {Output amplification} xywh {155 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXDistLevel);} class WidgetPDial @@ -935,7 +935,7 @@ label LPF callback {// int butt = 7; - send_data(0, butt, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {Low pass filter} xywh {285 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXDistLowPass);} class WidgetPDial @@ -944,7 +944,7 @@ label HPF callback {// int butt = 8; - send_data(0, butt, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {High pass filter} xywh {320 40 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXDistHighPass);} class WidgetPDial @@ -952,21 +952,21 @@ Fl_Check_Button distp6 { label {Neg.} callback {// - send_data(0, 6, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, 6, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} xywh {260 55 15 15} down_box DOWN_BOX labelsize 11 align 2 class Fl_Check_Button2 } Fl_Check_Button distp9 { label {St.} callback {// - send_data(0, 9, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, 9, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip Stereo xywh {357 55 15 15} down_box DOWN_BOX labelsize 11 align 2 class Fl_Check_Button2 } Fl_Check_Button distp10 { label PF callback {// - send_data(0, 10, o->value(), (TOPLEVEL::insert::distortion | 128), TOPLEVEL::type::Integer);} + send_data(0, 10, o->value(), (EFFECT::type::distortion), TOPLEVEL::type::Integer);} tooltip {Applies the filters(before or after) the distortion} xywh {357 38 15 15} down_box DOWN_BOX labelsize 11 align 1 class Fl_Check_Button2 } @@ -984,7 +984,7 @@ Fl_Dial eqp0 { label Gain callback {// - send_data(TOPLEVEL::action::forceUpdate, 0, o->value(), (TOPLEVEL::insert::eq | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 0, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} xywh {10 41 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(VC_FXEQgain);} class WidgetPDial @@ -992,7 +992,7 @@ Fl_Counter bandcounter { label Band callback {// - send_data(TOPLEVEL::action::forceUpdate, 1, o->value(), (TOPLEVEL::insert::eq | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 1, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip {Band no.} xywh {263 20 45 15} type Simple labelsize 11 align 1 minimum 0 maximum 1 step 1 textsize 11 code0 {o->bounds(0,MAX_EQ_BANDS-1);} } @@ -1002,7 +1002,7 @@ Fl_Dial freqdial { label Freq callback {//; - send_data(TOPLEVEL::action::forceUpdate, 11, o->value(), (TOPLEVEL::insert::eq | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 11, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} xywh {247 50 25 25} box ROUND_UP_BOX labelsize 10 when 3 maximum 127 code0 {o->setValueType(VC_FXEQfreq);} class WidgetPDial @@ -1010,7 +1010,7 @@ Fl_Dial gaindial { label Gain callback {// - send_data(TOPLEVEL::action::forceUpdate, 12, o->value(), (TOPLEVEL::insert::eq | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 12, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} xywh {277 50 25 25} box ROUND_UP_BOX labelsize 10 when 3 maximum 127 step 1 code0 {o->setValueType(VC_FXEQfilterGain);} class WidgetPDial @@ -1018,7 +1018,7 @@ Fl_Dial qdial { label Q callback {// - send_data(TOPLEVEL::action::forceUpdate, 13, o->value(), (TOPLEVEL::insert::eq | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 13, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip {Resonance/Bandwidth} xywh {307 50 25 25} box ROUND_UP_BOX labelsize 10 when 3 maximum 127 code0 {o->setValueType(VC_FXEQq);} class WidgetPDial @@ -1026,7 +1026,7 @@ Fl_Counter stagescounter { label Stages callback {// - send_data(TOPLEVEL::action::forceUpdate, 14, o->value(), (TOPLEVEL::insert::eq | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 14, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip {Additional filter stages} xywh {337 60 30 15} type Simple labelsize 10 minimum 1 maximum 127 step 1 textfont 1 textsize 11 code0 {o->bounds(0,MAX_FILTER_STAGES-1);} } @@ -1034,7 +1034,7 @@ Fl_Choice typechoice { label Type callback {// - send_data(TOPLEVEL::action::forceUpdate, 10, o->value(), (TOPLEVEL::insert::eq | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 10, o->value(), (EFFECT::type::eq), TOPLEVEL::type::Integer);} tooltip Type xywh {323 20 40 15} down_box BORDER_BOX labelsize 11 align 1 when 6 textfont 1 textsize 9 code0 {o->add("Off");o->add("Lp1");o->add("Hp1");o->add("Lp2");o->add("Hp2");o->add("Bp2");o->add("N2");o->add("Pk");o->add("LSh");o->add("HSh");} } {} @@ -1056,21 +1056,21 @@ Fl_Choice dfp { label Preset callback {// - send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, 16, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} xywh {132 13 90 16} down_box BORDER_BOX color 14 selection_color 0 labelsize 11 textfont 1 textsize 10 textcolor 7 code0 {o->add("WahWah");o->add("AutoWah");o->add("Sweep");o->add("VocalMorph1");o->add("VocalMorph2");} } {} Fl_Choice dfp4 { label {LFO type} callback {// - send_data(0, 4, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, 4, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {LFO function} xywh {190 60 43 15} down_box BORDER_BOX labelsize 10 align 2 textfont 1 textsize 9 code0 {o->add("Sine");o->add("Tri");} } {} Fl_Dial dfp0 { label Vol callback {// - send_data(0, 0, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, 0, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Effect volume} xywh {6 44 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } @@ -1078,7 +1078,7 @@ label Pan callback {// int butt = 1; - send_data(0, butt, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} xywh {42 44 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } @@ -1086,7 +1086,7 @@ label Freq callback {// int butt = 2; - send_data(0, butt, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {LFO frequency} xywh {80 44 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 code0 {o->setValueType(eff->geteffectpar(EFFECT::control::bpm) ? VC_FXlfofreqBPM : VC_FXlfofreq);} class WidgetPDial @@ -1095,7 +1095,7 @@ label Rnd callback {// int butt = 3; - send_data(0, butt, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {LFO randomness} xywh {155 44 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_percent127);} class WidgetPDial @@ -1103,7 +1103,7 @@ Fl_Dial dfp18 { label Start callback {// - send_data(0, EFFECT::control::bpmStart, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpmStart, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Start of LFO phase relative to start of beat. This has no effect unless you are syncing to a song position, using MIDI or a plugin host.} xywh {118 44 30 30} box ROUND_UP_BOX labelsize 11 when 4 maximum 127 code0 {o->setValueType(VC_PhaseOffset);} code1 {if (eff->geteffectpar(EFFECT::control::bpm)) o->activate(); else o->deactivate();} @@ -1112,14 +1112,14 @@ Fl_Dial dfp5 { label {St.df} callback {int butt = 5; - send_data(0, butt, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Left/Right channel phase shift} xywh {240 49 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } Fl_Dial dfp6 { label LfoD callback {int butt = 6; - send_data(0, butt, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {LFO depth} xywh {240 8 30 30} box ROUND_UP_BOX labelsize 11 align 8 maximum 127 class WidgetPDial } @@ -1134,21 +1134,21 @@ Fl_Dial dfp7 { label {A.S.} callback {int butt = 7; - send_data(0, butt, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Filter vs amplitude} xywh {282 44 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } Fl_Dial dfp9 { label {A.M} callback {int butt = 9; - send_data(0, butt, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, butt, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Rate that amplitude changes the filter} xywh {318 44 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 class WidgetPDial } Fl_Check_Button dfp8 { label {Inv.} callback {// - send_data(0, 8, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, 8, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Enable for filter frequency to lower with higher input amplitude} xywh {353 58 15 15} down_box DOWN_BOX labelsize 11 align 2 class Fl_Check_Button2 } @@ -1156,7 +1156,7 @@ Fl_Check_Button dfp17 { label BPM callback {// - send_data(0, EFFECT::control::bpm, o->value(), (TOPLEVEL::insert::dynFilter | 128), TOPLEVEL::type::Integer);} + send_data(0, EFFECT::control::bpm, o->value(), (EFFECT::type::dynFilter), TOPLEVEL::type::Integer);} tooltip {Synchronize the frequency to a multiple of the BPM.} xywh {191 41 45 15} down_box DOWN_BOX labelsize 11 code0 {o->value(eff->geteffectpar(EFFECT::control::bpm));} } @@ -1174,7 +1174,7 @@ Fl_Group fwin_filterui { label {DynFilter effect - Filter} xywh {5 5 275 75} box FLAT_BOX color 50 labelsize 12 align 144 - code0 {o->init(eff->filterpars,NULL,NULL, npart, (TOPLEVEL::insert::dynFilter | 128), neff);} + code0 {o->init(eff->filterpars,NULL,NULL, npart, (EFFECT::type::dynFilter), neff);} class FilterUI } {} Fl_Button filterclose { @@ -1203,19 +1203,19 @@ unsigned char control = getData->data.control; unsigned char efftype = getData->data.kit; unsigned char effnum = getData->data.engine; - bool isdynfilter = (effnum == (TOPLEVEL::insert::dynFilter | 128)); + bool isdynfilter = (effnum == (EFFECT::type::dynFilter)); unsigned char secondary = getData->data.offset; int textCol = 14; if (fetchData(0, EFFECT::control::changed, getData->data.part, efftype, effnum) != 0) textCol = FL_BLUE; //cout << "colour " << textCol << endl; - switch(efftype & 127) + switch(efftype) { - case TOPLEVEL::insert::none: + case EFFECT::type::none: break; - case TOPLEVEL::insert::reverb: + case EFFECT::type::reverb: switch (control) { case EFFECT::control::level: @@ -1269,7 +1269,7 @@ revp->redraw(); break; - case TOPLEVEL::insert::echo: + case EFFECT::type::echo: switch (control) { case EFFECT::control::level: @@ -1308,7 +1308,7 @@ echop->redraw(); break; - case TOPLEVEL::insert::chorus: + case EFFECT::type::chorus: switch (control) { case EFFECT::control::level: @@ -1365,7 +1365,7 @@ chorusp->redraw(); break; - case TOPLEVEL::insert::phaser: + case EFFECT::type::phaser: switch (control) { case EFFECT::control::level: @@ -1451,7 +1451,7 @@ phaserp->redraw(); break; - case TOPLEVEL::insert::alienWah: + case EFFECT::type::alienWah: switch (control) { case EFFECT::control::level: @@ -1511,7 +1511,7 @@ awp->redraw(); break; - case TOPLEVEL::insert::distortion: + case EFFECT::type::distortion: switch (control) { case EFFECT::control::level: @@ -1555,7 +1555,7 @@ distp->redraw(); break; - case TOPLEVEL::insert::eq: + case EFFECT::type::eq: //synth->getRuntime().Log("EQ " + to_string(value_int) + " " + to_string(int(control))); if (control == EFFECT::control::level) { @@ -1601,7 +1601,7 @@ effeqwindow->redraw(); break; - case TOPLEVEL::insert::dynFilter: + case EFFECT::type::dynFilter: if (isdynfilter) { // shouldn't get here //cout << "DyneFilter" << endl; @@ -1677,7 +1677,7 @@ make_chorus_window(); make_phaser_window(); make_alienwah_window(); - make_distorsion_window(); + make_distortion_window(); make_eq_window(); make_dynamicfilter_window(); @@ -1690,7 +1690,7 @@ effchoruswindow->position(px,py); effphaserwindow->position(px,py); effalienwahwindow->position(px,py); - effdistorsionwindow->position(px,py); + effdistortionwindow->position(px,py); effeqwindow->position(px,py); effdynamicfilterwindow->position(px,py); refresh(eff, npart, neff);} {} @@ -1707,7 +1707,7 @@ effchoruswindow->hide(); effphaserwindow->hide(); effalienwahwindow->hide(); - effdistorsionwindow->hide(); + effdistortionwindow->hide(); effeqwindow->hide(); effdynamicfilterwindow->hide(); eqband=0; @@ -1717,9 +1717,9 @@ delete(filterwindow); filterwindow=NULL; } - switch(eff->geteffect()) + switch(eff->geteffect() + EFFECT::type::none) // get effect not yet converted { - case TOPLEVEL::insert::reverb: + case EFFECT::type::reverb: revp->value(eff->getpreset()); revp0->value(eff->geteffectpar(0)); if (eff->insertion != 0) @@ -1740,7 +1740,7 @@ revp12->value(eff->geteffectpar(12)); effreverbwindow->show(); break; - case TOPLEVEL::insert::echo: + case EFFECT::type::echo: echop->value(eff->getpreset()); echop0->value(eff->geteffectpar(0)); if (eff->insertion != 0) @@ -1757,7 +1757,7 @@ echop17->value(eff->geteffectpar(17)); effechowindow->show(); break; - case TOPLEVEL::insert::chorus: + case EFFECT::type::chorus: chorusp->value(eff->getpreset()); chorusp0->value(eff->geteffectpar(0)); if (eff->insertion != 0) @@ -1789,7 +1789,7 @@ chorusp18->value(eff->geteffectpar(18)); effchoruswindow->show(); break; - case TOPLEVEL::insert::phaser: + case EFFECT::type::phaser: phaserp->value(eff->getpreset()); phaserp0->value(eff->geteffectpar(0)); if (eff->insertion != 0) @@ -1840,7 +1840,7 @@ effphaserwindow->show(); break; - case TOPLEVEL::insert::alienWah: + case EFFECT::type::alienWah: awp->value(eff->getpreset()); awp0->value(eff->geteffectpar(0)); if (eff->insertion != 0) @@ -1869,7 +1869,7 @@ awp18->value(eff->geteffectpar(18)); effalienwahwindow->show(); break; - case TOPLEVEL::insert::distortion: + case EFFECT::type::distortion: distp->value(eff->getpreset()); distp0->value(eff->geteffectpar(0)); if (eff->insertion != 0) @@ -1887,9 +1887,9 @@ distp8->value(eff->geteffectpar(8)); distp9->value(eff->geteffectpar(9)); distp10->value(eff->geteffectpar(10)); - effdistorsionwindow->show(); + effdistortionwindow->show(); break; - case TOPLEVEL::insert::eq: + case EFFECT::type::eq: { eqband = 0; int type = eff->geteffectpar(10); @@ -1905,11 +1905,12 @@ gaindial->deactivate(); stagescounter->value(eff->geteffectpar(14)); eqgraph->init(eff); + eqgraph->damage(1); eqgraph->redraw(); effeqwindow->show(); break; } - case TOPLEVEL::insert::dynFilter: + case EFFECT::type::dynFilter: make_filter_window(); dfp->value(eff->getpreset()); dfp0->value(eff->geteffectpar(0)); @@ -1952,36 +1953,35 @@ int textCol = 14; if (changed) textCol = FL_BLUE; - - switch ((efftype & 127) + TOPLEVEL::insert::none) + switch (efftype + EFFECT::type::none) { - case TOPLEVEL::insert::reverb: + case EFFECT::type::reverb: revp->color(textCol); revp->redraw(); break; - case TOPLEVEL::insert::echo: + case EFFECT::type::echo: echop->color(textCol); echop->redraw(); break; - case TOPLEVEL::insert::chorus: + case EFFECT::type::chorus: chorusp->color(textCol); chorusp->redraw(); break; - case TOPLEVEL::insert::phaser: + case EFFECT::type::phaser: phaserp->color(textCol); phaserp->redraw(); break; - case TOPLEVEL::insert::alienWah: + case EFFECT::type::alienWah: awp->color(textCol); awp->redraw(); break; - case TOPLEVEL::insert::distortion: + case EFFECT::type::distortion: distp->color(textCol); distp->redraw(); break; - case TOPLEVEL::insert::eq: + case EFFECT::type::eq: break; - case TOPLEVEL::insert::dynFilter: + case EFFECT::type::dynFilter: dfp->color(textCol); dfp->redraw(); break; diff -Nru yoshimi-2.2.1/src/UI/FilterUI.fl yoshimi-2.2.2.1/src/UI/FilterUI.fl --- yoshimi-2.2.1/src/UI/FilterUI.fl 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/FilterUI.fl 2022-09-14 22:56:29.000000000 +0000 @@ -920,17 +920,17 @@ bool fromUs = ((getData->data.source & TOPLEVEL::action::noAction) == TOPLEVEL::action::fromGUI); - if (part != npart || (kititem != (TOPLEVEL::insert::dynFilter | 128) && eng != engine)) + if (part != npart || (kititem != (EFFECT::type::dynFilter) && eng != engine)) return; - if (kititem == (TOPLEVEL::insert::dynFilter | 128)) + if (kititem == (EFFECT::type::dynFilter)) { //cout << "Dyn filter seen part " << int(part)<< endl; if (part == TOPLEVEL::section::systemEffects) - synth->getGuiMaster()->syseffectui->UpdatePresetColour(1, TOPLEVEL::insert::dynFilter - TOPLEVEL::insert::none); + synth->getGuiMaster()->syseffectui->UpdatePresetColour(1, EFFECT::type::dynFilter - EFFECT::type::none); else if (part == TOPLEVEL::section::insertEffects) - synth->getGuiMaster()->inseffectui->UpdatePresetColour(1, TOPLEVEL::insert::dynFilter - TOPLEVEL::insert::none); + synth->getGuiMaster()->inseffectui->UpdatePresetColour(1, EFFECT::type::dynFilter - EFFECT::type::none); else - synth->getGuiMaster()->partui->inseffectui->UpdatePresetColour(1, TOPLEVEL::insert::dynFilter - TOPLEVEL::insert::none); // normal part effect + synth->getGuiMaster()->partui->inseffectui->UpdatePresetColour(1, EFFECT::type::dynFilter - EFFECT::type::none); // normal part effect } qdial->activate(); diff -Nru yoshimi-2.2.1/src/UI/MasterMiscUI.fl yoshimi-2.2.2.1/src/UI/MasterMiscUI.fl --- yoshimi-2.2.1/src/UI/MasterMiscUI.fl 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/MasterMiscUI.fl 2022-09-14 22:56:29.000000000 +0000 @@ -466,12 +466,8 @@ int newpart = npart | synth->getGuiMaster()->panelgroup; synth->getGuiMaster()->activePart = npart + *plgroup; if (Fl::event() == FL_RELEASE && Fl::event_button() == FL_RIGHT_MOUSE) - { - if (newpart == synth->getGuiMaster()->partui->npart) - synth->getGuiMaster()->partui->Showedit(); - else - synth->getGuiMaster()->openedit = true; - } + synth->getGuiMaster()->partui->Showedit(); + if ((int)bankui->cbwig->value() != (newpart + 1)) { bankui->cbwig->value(newpart + 1); diff -Nru yoshimi-2.2.1/src/UI/MasterUI.fl yoshimi-2.2.2.1/src/UI/MasterUI.fl --- yoshimi-2.2.1/src/UI/MasterUI.fl 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/MasterUI.fl 2022-09-14 22:56:29.000000000 +0000 @@ -414,7 +414,6 @@ vectorui = new VectorUI(synth, bankui, paramsui); midilearnui = new MidiLearnUI(synth); yoshiLog = new ConsoleUI(synth); - openedit = false; make_window(); bool foundWindows = Showmaster(); @@ -2587,11 +2586,14 @@ { case PART::control::enable: { - partEnable->value(value); - if (value) - partControls->activate(); - else - partControls->deactivate(); + if (npart == newpart) + { + partEnable->value(value); + if (value) + partControls->activate(); + else + partControls->deactivate(); + } if (panelVisible) { panellistitem[panelpart]->partenabled->value(value); @@ -2984,26 +2986,11 @@ break; case MAIN::control::partNumber: - { - //bool ctlmidiSeen = partui->ctlmidi->visible(); - //if(partui->instrumenteditwindow->visible()) - //openedit = true; - // openedit also set by right click in mixer panel - // might need further refinement - if ((getData->data.source & TOPLEVEL::action::noAction) != TOPLEVEL::action::fromGUI) activePart = value_int; partSwitch(activePart); updatepanel(); - /*if (openedit) - { - partui->Showedit(); - openedit = false; - } - else - partui->instrumenteditwindow->hide();*/ - } break; case MAIN::control::availableParts: @@ -3106,7 +3093,6 @@ case MAIN::control::loadInstrumentByName: updatepartprogram(kititem); - //RecentInstruments->activate(); break; case MAIN::control::saveNamedInstrument: // save instrument @@ -3578,7 +3564,6 @@ updatelistitem(next); // select and/or modify activePart = npart; partui->rebuild(npart); - partui->redraw(); partEnable->value(synth->part[npart]->Penabled == 1); if (partEnable->value() == 1) @@ -3707,46 +3692,6 @@ } partSwitch(next);} {} } - Function {updateeffects(int data)} {} { - code {// - int partnum = data >> 24; - int effclass = (data >> 22) & 3; - int parameter = (data >> 8) & 0x7f; - - if (effclass == 2) - { - // will be part effects - } - else if (effclass == 1) - { - ninseff = parameter & 0x3f; - sysinsgroup->value(InsertionEffectsGrp); - showInsEfxUI(); - inseffnocounter->value(ninseff + 1); - inseffpart->value(partnum); - if (partnum != 1) // off - { - insefftype->activate(); - inseffectui->activate(); - } - else - { - insefftype->deactivate(); - inseffectui->deactivate(); - } - insefftype->value(synth->insefx[ninseff]->geteffect()); - inseffectui->refresh(synth->insefx[ninseff], TOPLEVEL::section::insertEffects, ninseff); - } - else - { - nsyseff = parameter & 0x3f; - sysinsgroup->value(SystemEffectsGrp); - syseffnocounter->value(nsyseff + 1); - sysefftype->value(synth->sysefx[nsyseff]->geteffect()); - syseffectui->refresh(synth->sysefx[nsyseff], TOPLEVEL::section::systemEffects, nsyseff); - showSysEfxUI(); - }} {} - } Function {setMasterLabel(string name)} {} { code {// string prefix; @@ -3832,13 +3777,13 @@ int efftype = fetchData(0, EFFECT::sysIns::effectType, TOPLEVEL::section::systemEffects, UNUSED, 0); if (efftype > 0) { - status = fetchData(0, EFFECT::control::changed, TOPLEVEL::section::systemEffects, efftype + (TOPLEVEL::insert::none | 128), ninseff); + status = fetchData(0, EFFECT::control::changed, TOPLEVEL::section::systemEffects, efftype + EFFECT::type::none, ninseff); syseffectui->UpdatePresetColour(status, sysefftype->value()); } efftype = fetchData(0,EFFECT::sysIns::effectType, TOPLEVEL::section::insertEffects, UNUSED, 0); if (efftype > 0) { - status = fetchData(0, EFFECT::control::changed, TOPLEVEL::section::insertEffects, efftype + (TOPLEVEL::insert::none | 128), ninseff); + status = fetchData(0, EFFECT::control::changed, TOPLEVEL::section::insertEffects, efftype + EFFECT::type::none, ninseff); inseffectui->UpdatePresetColour(status, insefftype->value()); } @@ -4617,8 +4562,6 @@ } decl {int msgGroup;} {private local } - decl {bool openedit;} {public local - } decl {float mainDW;} {private local } decl {float mainDH;} {private local diff -Nru yoshimi-2.2.1/src/UI/MiscGui.cpp yoshimi-2.2.2.1/src/UI/MiscGui.cpp --- yoshimi-2.2.1/src/UI/MiscGui.cpp 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/MiscGui.cpp 2022-09-14 22:56:29.000000000 +0000 @@ -294,7 +294,7 @@ return; } - if (kititem >= (TOPLEVEL::insert::none | 128) && kititem != UNUSED) // effects + if (kititem >= EFFECT::type::none && kititem < EFFECT::type::count) // effects { if (npart == TOPLEVEL::section::systemEffects) { @@ -427,7 +427,7 @@ case TOPLEVEL::insert::oscillatorGroup: case TOPLEVEL::insert::harmonicAmplitude: - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicPhase: if (synth->getGuiMaster()->partui->padnoteui->oscui) synth->getGuiMaster()->partui->padnoteui->oscui->returns_update(getData); break; @@ -480,7 +480,7 @@ break; case UNUSED: case TOPLEVEL::insert::harmonicAmplitude: - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicBandwidth: synth->getGuiMaster()->partui->subnoteui->returns_update(getData); break; } @@ -531,7 +531,7 @@ break; case TOPLEVEL::insert::oscillatorGroup: case TOPLEVEL::insert::harmonicAmplitude: - case TOPLEVEL::insert::harmonicPhaseBandwidth: + case TOPLEVEL::insert::harmonicPhase: if (synth->getGuiMaster()->partui->adnoteui->advoice->oscedit) synth->getGuiMaster()->partui->adnoteui->advoice->oscedit->returns_update(getData); break; diff -Nru yoshimi-2.2.1/src/UI/OscilGenUI.fl yoshimi-2.2.2.1/src/UI/OscilGenUI.fl --- yoshimi-2.2.1/src/UI/OscilGenUI.fl 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/OscilGenUI.fl 2022-09-14 22:56:29.000000000 +0000 @@ -387,7 +387,7 @@ else x = 64 - (int)o->value(); - send_data(TOPLEVEL::action::forceUpdate, TOPLEVEL::insert::harmonicPhaseBandwidth, n, x, TOPLEVEL::type::Integer);} + send_data(TOPLEVEL::action::forceUpdate, TOPLEVEL::insert::harmonicPhase, n, x, TOPLEVEL::type::Integer);} xywh {0 140 15 82} type {Vert Knob} box FLAT_BOX minimum 64 maximum -63 step 1 code0 {o->value(64 - oscil->Phphase[n]);} code1 {o->setValueType(VC_PhaseOffset); o->useCustomTip(true);} @@ -855,7 +855,7 @@ h[control]->mag->value(64 - value); } - else if (insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + else if (insert == TOPLEVEL::insert::harmonicPhase) { h[control]->phase->value(64 - value); } diff -Nru yoshimi-2.2.1/src/UI/PartUI.fl yoshimi-2.2.2.1/src/UI/PartUI.fl --- yoshimi-2.2.1/src/UI/PartUI.fl 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/PartUI.fl 2022-09-14 22:56:29.000000000 +0000 @@ -181,7 +181,7 @@ Fl_Button adeditbutton { label edit callback {// - partui->showparameters(n,0); + partui->showparameters(n,PART::engine::addSynth); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumentkitlist->hide();} xywh {422 4 40 15} box THIN_UP_BOX labelsize 11 @@ -198,7 +198,7 @@ Fl_Button subeditbutton { label edit callback {// - partui->showparameters(n,1); + partui->showparameters(n,PART::engine::subSynth); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumentkitlist->hide();} xywh {490 4 40 15} box THIN_UP_BOX labelsize 11 @@ -215,7 +215,7 @@ Fl_Button padeditbutton { label edit callback {// - partui->showparameters(n,2); + partui->showparameters(n,PART::engine::padSynth); if ((Fl::event_button() == 3)) synth->getGuiMaster()->partui->instrumentkitlist->hide();} xywh {560 4 40 15} box THIN_UP_BOX labelsize 11 @@ -465,7 +465,7 @@ Fl_Button adeditbutton { label Edit callback {// - showparameters(0,0); + showparameters(0,PART::engine::addSynth); //checkEngines(); seteditname(); if ((Fl::event_button() == 3)) @@ -495,7 +495,7 @@ Fl_Button subeditbutton { label Edit callback {// - showparameters(0,1); + showparameters(0,PART::engine::subSynth); //checkEngines(); seteditname(); if ((Fl::event_button() == 3)) @@ -525,7 +525,7 @@ Fl_Button padeditbutton { label Edit callback {// - showparameters(0,2); + showparameters(0,PART::engine::padSynth); //checkEngines(); seteditname(); if ((Fl::event_button() == 3)) @@ -1752,9 +1752,9 @@ code {// partfx->copy_label(synth->getGuiMaster()->setPartWindowTitle("Part Effects").c_str()); setEffNum(); - bool res = fetchData(0, EFFECT::control::changed, npart, (TOPLEVEL::insert::none | 128) + insefftype->value(), inseffnocounter->value() - 1); + bool res = fetchData(0, EFFECT::control::changed, npart, (EFFECT::type::none) + insefftype->value(), inseffnocounter->value() - 1); inseffectui->UpdatePresetColour(res, insefftype->value()); - fxRtext();} {} + lastfxW = 0;} {} } Function {kitrefresh()} {} { code {// @@ -2283,7 +2283,6 @@ code {// if (instrumenteditwindow->visible()) editRtext(); - if (partfx->visible()) { if (insefftype->value() == 8) // dynfilter @@ -2294,14 +2293,8 @@ inseffectui->filtRtext(); } } - if ( partfx->w() != lastfxW) - { - fxRtext(); - lastfxW = partfx->w(); - } + fxRtext(); } - - if (instrumentkitlist->visible() && instrumentkitlist->w() != lastkitW) { kitRtext(); @@ -2490,7 +2483,16 @@ } Function {fxRtext()} {} { code {// - float dScale = partfx->w() / float(fxDW); + if (lastfxW < 3) + { + ++lastfxW; + return; + } + if (lastfxW == partfx->w()) + return; + lastfxW = partfx->w(); + + float dScale = lastfxW / float(fxDW); if (dScale < 0.2f) dScale = 0.2f; diff -Nru yoshimi-2.2.1/src/UI/SUBnoteUI.fl yoshimi-2.2.2.1/src/UI/SUBnoteUI.fl --- yoshimi-2.2.1/src/UI/SUBnoteUI.fl 2022-07-25 18:20:19.000000000 +0000 +++ yoshimi-2.2.2.1/src/UI/SUBnoteUI.fl 2022-09-14 22:56:29.000000000 +0000 @@ -102,7 +102,7 @@ else o->value(0); - send_data(0, TOPLEVEL::insert::harmonicPhaseBandwidth, n, x, TOPLEVEL::type::Integer);} + send_data(0, TOPLEVEL::insert::harmonicBandwidth, n, x, TOPLEVEL::type::Integer);} tooltip {Harmonic's bandwidth multiplier} xywh {0 166 15 128} type {Vert Knob} box FLAT_BOX minimum 63 maximum -64 step 1 code0 {o->setValueType(VC_SubBandwidthRel);} code1 {o->useCustomTip(true);} @@ -749,7 +749,7 @@ h[control]->mag->value((int) value); return; } - if (insert == TOPLEVEL::insert::harmonicPhaseBandwidth) + if (insert == TOPLEVEL::insert::harmonicBandwidth) { h[control]->bw->value((int)value - 64); return;