├── VERSION ├── modules ├── .gitkeep └── melatonin_inspector │ ├── .gitattributes │ ├── .github │ └── FUNDING.yml │ ├── Assets │ ├── Clear.png │ ├── Logo.png │ ├── Search.png │ ├── move-on.png │ ├── tab-off.png │ ├── tab-on.png │ ├── dogfood-on.png │ ├── enabled-on.png │ ├── expand-off.png │ ├── expand-on.png │ ├── move-off.png │ ├── timing-off.png │ ├── timing-on.png │ ├── dogfood-off.png │ ├── enabled-off.png │ ├── Eyedropper-off.png │ ├── Eyedropper-on.png │ ├── speedometer-off.png │ └── speedometer-on.png │ ├── .gitignore │ ├── LICENSE │ ├── melatonin │ ├── helpers │ │ ├── inspector_settings.h │ │ ├── misc.h │ │ └── timing.h │ └── components │ │ ├── accesibility.h │ │ ├── inspector_image_button.h │ │ └── tree_component.h │ ├── LatestCompiledAssets │ ├── BinaryData7.cpp │ ├── BinaryData8.cpp │ ├── BinaryData18.cpp │ └── BinaryData17.cpp │ ├── melatonin_inspector.cpp │ ├── tests │ ├── member_disabled.cpp │ ├── member_enabled.cpp │ ├── unique_ptr_enabled.cpp │ └── unique_ptr_disabled.cpp │ └── update_juce_colours.rb ├── Fire1.png ├── Fire2.png ├── Fire3.png ├── support.png ├── packaging ├── icon.png ├── background.jpg ├── pamplejuce.icns ├── background@2x.jpg ├── dmg.json ├── EULA └── installer.iss ├── assets └── images │ ├── firelogo.png │ ├── firelogo.psd │ ├── fire_anime.png │ ├── pamplejuce.png │ ├── firewingslogo.png │ └── firewingslogo.psd ├── .gitattributes ├── tests ├── MyTests.cpp ├── TestAudioFiles │ └── drum.wav ├── GoldenMasters │ ├── init_sine_output.wav │ ├── test2_sine_output.wav │ ├── test_sine_output.wav │ ├── 2bands_hq_sine_output.wav │ ├── bias0.18_drums_output.wav │ ├── bias0.18_sine_output.wav │ ├── bug preset_sine_output.wav │ ├── init_drums_output.wav │ ├── init_mix0_sine_output.wav │ ├── lfo_all1_drums_output.wav │ ├── lfo_all1_sine_output.wav │ ├── lfo_sawup_sine_output.wav │ ├── lfo_smooth_sine_output.wav │ ├── lfo_square_sine_output.wav │ ├── max_drive_sine_output.wav │ ├── test2_drums_output.wav │ ├── test_drums_output.wav │ ├── two_bands_sine_output.wav │ ├── wings test_sine_output.wav │ ├── 2bands_hq_drums_output.wav │ ├── 2bands_mixtype1_sine_output.wav │ ├── 2bands_mixtype3_sine_output.wav │ ├── 2bands_mixtype4_sine_output.wav │ ├── 2bands_nosafe_drums_output.wav │ ├── 2bands_nosafe_sine_output.wav │ ├── 3bands_nosafe_drums_output.wav │ ├── 3bands_nosafe_sine_output.wav │ ├── 4bands_nosafe_drums_output.wav │ ├── 4bands_nosafe_sine_output.wav │ ├── bias0.18rec0.5_sine_output.wav │ ├── bug preset_drums_output.wav │ ├── half_drive_safe_sine_output.wav │ ├── init_mix0_drums_output.wav │ ├── init_no_safe_drums_output.wav │ ├── init_no_safe_hq_sine_output.wav │ ├── init_no_safe_sine_output.wav │ ├── init_not_enable_sine_output.wav │ ├── lfo_all1_bypass_sine_output.wav │ ├── lfo_drive_bi_drums_output.wav │ ├── lfo_drive_bi_sine_output.wav │ ├── lfo_drive_uni_drums_output.wav │ ├── lfo_drive_uni_sine_output.wav │ ├── lfo_lfo1_to_rec1_sine_output.wav │ ├── lfo_sawup_drums_output.wav │ ├── lfo_smooth_drums_output.wav │ ├── lfo_square_drums_output.wav │ ├── max_drive_drums_output.wav │ ├── max_drive_hq_drums_output.wav │ ├── max_drive_hq_sine_output.wav │ ├── max_drive_safe_sine_output.wav │ ├── test_downsample_sine_output.wav │ ├── two_bands_drums_output.wav │ ├── wings test_drums_output.wav │ ├── 2bands_hq_mixtype1_drums_output.wav │ ├── 2bands_hq_mixtype1_sine_output.wav │ ├── 2bands_hq_mixtype2_drums_output.wav │ ├── 2bands_hq_mixtype2_sine_output.wav │ ├── 2bands_mixtype1_drums_output.wav │ ├── 2bands_mixtype3_drums_output.wav │ ├── 2bands_mixtype4_drums_output.wav │ ├── bias0.18rec0.5_drums_output.wav │ ├── half_drive_no_safe_drums_output.wav │ ├── half_drive_no_safe_hq_sine_output.wav │ ├── half_drive_no_safe_sine_output.wav │ ├── half_drive_safe_drums_output.wav │ ├── init_no_safe_hq_drums_output.wav │ ├── init_not_enable_drums_output.wav │ ├── lfo_all1_bypass_drums_output.wav │ ├── lfo_lfo1_to_rec1_drums_output.wav │ ├── max_drive_safe_drums_output.wav │ ├── test_downsample_drums_output.wav │ ├── half_drive_no_safe_comp_drums_output.wav │ ├── half_drive_no_safe_comp_sine_output.wav │ ├── half_drive_no_safe_extreme_sine_output.wav │ ├── half_drive_no_safe_hq_drums_output.wav │ ├── half_drive_no_safe_width_sine_output.wav │ ├── half_drive_no_safe_extreme_drums_output.wav │ ├── half_drive_no_safe_width_drums_output.wav │ ├── half_drive_no_safe_global_filter_drums_output.wav │ └── half_drive_no_safe_global_filter_sine_output.wav ├── Catch2Main.cpp ├── PluginBasics.cpp ├── helpers │ └── test_helpers.h └── Presets │ ├── init.fire │ ├── init_mix0.fire │ ├── max_drive.fire │ ├── init_no_safe.fire │ ├── max_drive_hq.fire │ ├── bias0.18.fire │ ├── half_drive_safe.fire │ ├── init_no_safe_hq.fire │ ├── init_not_enable.fire │ ├── max_drive_safe.fire │ ├── half_drive_no_safe.fire │ ├── bias0.18rec0.5.fire │ ├── half_drive_no_safe_hq.fire │ ├── bug preset.fire │ ├── 2bands_nosafe.fire │ ├── half_drive_no_safe_extreme.fire │ ├── 2bands_mixtype3.fire │ ├── test_downsample.fire │ ├── half_drive_no_safe_comp.fire │ ├── half_drive_no_safe_width.fire │ ├── 2bands_mixtype4.fire │ ├── two_bands.fire │ ├── 3bands_nosafe.fire │ ├── 4bands_nosafe.fire │ ├── 2bands_hq.fire │ ├── test.fire │ ├── 2bands_mixtype1.fire │ ├── 2bands_hq_mixtype1.fire │ ├── 2bands_hq_mixtype2.fire │ ├── wings test.fire │ ├── half_drive_no_safe_global_filter.fire │ └── test2.fire ├── JuceLibraryCode ├── JuceLV2Defines.h ├── include_juce_core.mm ├── include_juce_dsp.cpp ├── include_juce_dsp.mm ├── include_juce_core.cpp ├── include_juce_events.mm ├── include_juce_opengl.mm ├── include_juce_events.cpp ├── include_juce_opengl.cpp ├── include_juce_graphics.cpp ├── include_juce_graphics.mm ├── include_juce_gui_extra.mm ├── include_juce_audio_utils.mm ├── include_juce_gui_basics.cpp ├── include_juce_gui_basics.mm ├── include_juce_gui_extra.cpp ├── include_juce_audio_basics.cpp ├── include_juce_audio_basics.mm ├── include_juce_audio_utils.cpp ├── include_juce_cryptography.cpp ├── include_juce_cryptography.mm ├── include_juce_audio_devices.cpp ├── include_juce_audio_devices.mm ├── include_juce_audio_formats.cpp ├── include_juce_audio_formats.mm ├── include_juce_graphics_Sheenbidi.c ├── include_juce_audio_processors.mm ├── include_juce_core_CompilationTime.cpp ├── include_juce_data_structures.cpp ├── include_juce_data_structures.mm ├── include_juce_graphics_Harfbuzz.cpp ├── include_juce_audio_processors.cpp ├── include_juce_audio_processors_ara.cpp ├── include_juce_audio_plugin_client_AAX.cpp ├── include_juce_audio_plugin_client_AAX.mm ├── include_juce_audio_plugin_client_ARA.cpp ├── include_juce_audio_plugin_client_AU_1.mm ├── include_juce_audio_plugin_client_AU_2.mm ├── include_juce_audio_plugin_client_AUv3.mm ├── include_juce_audio_plugin_client_LV2.cpp ├── include_juce_audio_plugin_client_LV2.mm ├── include_juce_audio_plugin_client_VST2.mm ├── include_juce_audio_plugin_client_VST3.mm ├── include_juce_audio_processors_lv2_libs.cpp ├── include_juce_audio_plugin_client_Unity.cpp ├── include_juce_audio_plugin_client_VST2.cpp ├── include_juce_audio_plugin_client_VST3.cpp ├── include_juce_audio_plugin_client_AAX_utils.cpp ├── include_juce_audio_plugin_client_Standalone.cpp ├── ReadMe.txt ├── BinaryData.h └── JuceHeader.h ├── .github └── dependabot.yml ├── Temp └── README.md ├── .gitmodules ├── Source ├── DSP │ ├── WidthProcessor.h │ ├── Delay.h │ ├── ModulationRouting.h │ ├── LfoEngine.h │ └── WidthProcessor.cpp ├── GUI │ ├── ValuePopup.h │ ├── ValueEntryPopup.h │ └── ValuePopup.cpp ├── Panels │ ├── ControlPanel │ │ └── Graph Components │ │ │ ├── Oscilloscope.h │ │ │ ├── WidthGraph.h │ │ │ ├── VUPanel.h │ │ │ ├── GraphTemplate.h │ │ │ ├── GraphTemplate.cpp │ │ │ ├── DistortionGraph.h │ │ │ ├── VUMeter.h │ │ │ └── GraphPanel.h │ └── SpectrogramPanel │ │ ├── SoloButton.h │ │ ├── EnableButton.h │ │ ├── CloseButton.h │ │ ├── DraggableButton.h │ │ ├── SpectrumBackground.h │ │ ├── FreqTextLabel.h │ │ ├── CloseButton.cpp │ │ ├── SoloButton.cpp │ │ ├── FFTProcessor.h │ │ ├── VerticalLine.h │ │ ├── DraggableButton.cpp │ │ ├── FreqDividerGroup.h │ │ └── FilterControl.h └── Utility │ ├── AudioHelpers.h │ └── VersionInfo.h ├── .gitignore ├── ART_LICENSE.md ├── .vscode ├── c_cpp_properties.json └── settings.json └── benchmarks └── Catch2Main.cpp /VERSION: -------------------------------------------------------------------------------- 1 | 1.5.0 -------------------------------------------------------------------------------- /modules/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /Fire1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/Fire1.png -------------------------------------------------------------------------------- /Fire2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/Fire2.png -------------------------------------------------------------------------------- /Fire3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/Fire3.png -------------------------------------------------------------------------------- /support.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/support.png -------------------------------------------------------------------------------- /packaging/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/packaging/icon.png -------------------------------------------------------------------------------- /packaging/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/packaging/background.jpg -------------------------------------------------------------------------------- /assets/images/firelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/assets/images/firelogo.png -------------------------------------------------------------------------------- /assets/images/firelogo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/assets/images/firelogo.psd -------------------------------------------------------------------------------- /packaging/pamplejuce.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/packaging/pamplejuce.icns -------------------------------------------------------------------------------- /assets/images/fire_anime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/assets/images/fire_anime.png -------------------------------------------------------------------------------- /assets/images/pamplejuce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/assets/images/pamplejuce.png -------------------------------------------------------------------------------- /packaging/background@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/packaging/background@2x.jpg -------------------------------------------------------------------------------- /assets/images/firewingslogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/assets/images/firewingslogo.png -------------------------------------------------------------------------------- /assets/images/firewingslogo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/assets/images/firewingslogo.psd -------------------------------------------------------------------------------- /modules/melatonin_inspector/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: sudara 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | *.wav filter=lfs diff=lfs merge=lfs -text 4 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/Clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/Clear.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/Logo.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/Search.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/move-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/move-on.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/tab-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/tab-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/tab-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/tab-on.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/dogfood-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/dogfood-on.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/enabled-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/enabled-on.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/expand-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/expand-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/expand-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/expand-on.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/move-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/move-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/timing-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/timing-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/timing-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/timing-on.png -------------------------------------------------------------------------------- /tests/MyTests.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | TEST_CASE("Basic math works", "[math]") { 4 | REQUIRE(1 + 1 == 2); 5 | } 6 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/dogfood-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/dogfood-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/enabled-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/enabled-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/Eyedropper-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/Eyedropper-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/Eyedropper-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/Eyedropper-on.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/speedometer-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/speedometer-off.png -------------------------------------------------------------------------------- /modules/melatonin_inspector/Assets/speedometer-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jerryuhoo/Fire/HEAD/modules/melatonin_inspector/Assets/speedometer-on.png -------------------------------------------------------------------------------- /JuceLibraryCode/JuceLV2Defines.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifndef JucePlugin_LV2URI 4 | #define JucePlugin_LV2URI "https://www.bluewingsmusic.com/fire" 5 | #endif 6 | -------------------------------------------------------------------------------- /tests/TestAudioFiles/drum.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:947779d1105750f1880c614279270131376d2bf967b2ca48ad1d07833209945d 3 | size 576080 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36f4f0465a04d4364114ef589221236533f132e5afd0ceb8f3cb3ef41a1aa963 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/test2_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3c79ff8527ee31e60bbbc7d3cdfa431fe59203a3a4c794e49b149391ab33819a 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/test_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4c1acade4e6b83e983f61b10f1a6b534535e2bc4656399d14cf5849a2ad7e019 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_hq_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:48842d058141da7a523a2ffa138efc4fdacb85115913760e83bec868f5a930aa 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/bias0.18_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e956ef715a3fe39853bec0fab666e29cbbd7c773be3ac405604bdd9022c8aa61 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/bias0.18_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2c29c889a2d2a8a31bfd4c7ca5b3cc7e7778d617d1f2e7d25303cd3afb0629f5 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/bug preset_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e2b4ccad5800b3c80ca961f2fee3e92af3f71115f3a9a3555776e60e955f552 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e6702b79fa49eb021ffbf4cdeadbcf6c993c982f82837e03cc9b979af8987e9 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_mix0_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:686f55f527bf1d984179a121969135e1f15b9ea42faf4b60e81d0570251ff56b 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_all1_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:444b34606328fc7d7e2840440d319453ae260af7085acbd1a162ff0c4a5f651c 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_all1_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0607658a4166f36a257b6abe548bfd2e82534c7819d7193042f3113ac18e4a67 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_sawup_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36f4f0465a04d4364114ef589221236533f132e5afd0ceb8f3cb3ef41a1aa963 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_smooth_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:34183c6beca067f9bc1f89ce5e14bf507d65a74e28ab4f63b0f930f3b04424e4 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_square_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36f4f0465a04d4364114ef589221236533f132e5afd0ceb8f3cb3ef41a1aa963 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/max_drive_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:25d679c5414bbfd5f5e70d9238e76c14b22660768287dd2dc58693e45c598ef5 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/test2_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fd87b10d099ea593adc2f67ab6943660353aeb416d17be3ca33019ee4732221f 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/test_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6986067cb091963ae7a7b5039d71a960f237b92666001e789877e4b690bf7a8a 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/two_bands_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:85e494818ce336316668e99e03364122f2c508f14226f9951ba1cbebd17ae2b1 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/wings test_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:326ef4048eead7d1fb9eee9e1823a965773d8a8d67fec4c0cba80e139f1f9596 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_hq_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2e67f121fd88195bf57cd520f37756b1bf20b171048bdf7e9905374872c59b17 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_mixtype1_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9b2cd1d615e6a2c69901ce16afe9159ef71c1e3f06191bcfb649faf2540af4c4 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_mixtype3_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:958175d3d6e652c8a5534d6be258d1e8bad926ef7c2adc601cf6bde13d24efeb 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_mixtype4_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1eed14b5b36c74b79bc827c1f17ca7f032accea63647794b946485818c2005d4 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_nosafe_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:12af282ae043349717d12926771460fe5d210b727195b1d364f5802c12df6c47 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_nosafe_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:668acdc995f3f32c5c674700e5b51de1702bcc853bb2f0fe686b23d705fc3e7c 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/3bands_nosafe_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:291fd8beb78d9151b946e72a48172afb89dd5f9c7c669c8612aa64efab8f5da7 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/3bands_nosafe_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9c5785c2c5b7adb81aaba409eb561042986644b01c6adddf7928c7353ef8e728 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/4bands_nosafe_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2fbf34f07e73b506ecefe9dc9bdba16e7a059dca3e9b7cdb95d5ca7a4e8ea8fd 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/4bands_nosafe_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:50814a6b6a352f488064878faadf8cfb4d9ae52a2610d13988fda749717a12b5 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/bias0.18rec0.5_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:246bfe381247dc4289b36c71e10cdecf635a891bc3b8cf171506937cfedc93ac 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/bug preset_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bea358047247cda8a027b4759a7546a065374ecaa4d2143260fed1b9ffe1dc20 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_safe_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2769340d2844f437cb19aeaf2f9f3949f847f266a75faa5698309237819c847d 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_mix0_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4b9ec9d2d962cdbff9ab47eab51d419ef47e8cb292804f89a8af2d8d2e6c1a2e 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_no_safe_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e6702b79fa49eb021ffbf4cdeadbcf6c993c982f82837e03cc9b979af8987e9 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_no_safe_hq_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:500dc4f9367274bd4c9804de125f2307e6314b8193cdcc26d9de3e22b28504a8 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_no_safe_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36f4f0465a04d4364114ef589221236533f132e5afd0ceb8f3cb3ef41a1aa963 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_not_enable_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:686f55f527bf1d984179a121969135e1f15b9ea42faf4b60e81d0570251ff56b 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_all1_bypass_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0607658a4166f36a257b6abe548bfd2e82534c7819d7193042f3113ac18e4a67 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_drive_bi_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:37d9e6c48a3a363c918cc4184248bb331eff602cac459edb9419c12182a74527 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_drive_bi_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:66e895b777ccef66f8205f193e5a77e664a56726b7a51537fcd81656fa1a6625 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_drive_uni_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e6702b79fa49eb021ffbf4cdeadbcf6c993c982f82837e03cc9b979af8987e9 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_drive_uni_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36f4f0465a04d4364114ef589221236533f132e5afd0ceb8f3cb3ef41a1aa963 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_lfo1_to_rec1_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36f4f0465a04d4364114ef589221236533f132e5afd0ceb8f3cb3ef41a1aa963 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_sawup_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e6702b79fa49eb021ffbf4cdeadbcf6c993c982f82837e03cc9b979af8987e9 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_smooth_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2372dd9ced4a349d08bc511951324acaa8b9dd057fc76becc4c883eb8ab78690 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_square_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e6702b79fa49eb021ffbf4cdeadbcf6c993c982f82837e03cc9b979af8987e9 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/max_drive_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c3f3d8e9efd1e88f19efc4841a0512a65054a4debaa60d791077660a543f5f3a 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/max_drive_hq_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8d336ef6b45a33fccc666102d5fa9fd01a706c602b66fe3bfe1d82aff7a4be10 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/max_drive_hq_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cd6f1cf9a91492a7e43232030bca14a2cc2ebabe35866fec25f85c1443dc46d4 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/max_drive_safe_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36fda29c035317bc21beaa5e6a10c2061d6f26e337a30f3a27ca793a08a52048 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/test_downsample_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:46d42f748bb397c84741a09a7e2f69c39137bf669c669f6e434874efb3214ded 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/two_bands_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:168c1b2b701f47bc9df08143c809c172bad6f25b2f5319b8b0a1d41cb26a8622 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/wings test_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c83c3a38988e25f9f223513d39877ab7b6cc84416a06470bd923a84d3a627bff 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_hq_mixtype1_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c55c3a4ea456a7dd5a0124368f5566806ea0af5e6d38055a504df48b5b92685b 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_hq_mixtype1_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c797a1e7e95e0aafea6524b2f3169681a75ec947bcab8fd85ac59728ab981603 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_hq_mixtype2_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e9a019afa32bdcfe8352447f8959c81e4c7c8e130520d0f748e8b51f832e2609 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_hq_mixtype2_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ede0849779ab53c2b84d721632a94b260e6bc94d7e8612f7bf040933589980a6 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_mixtype1_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:135db187c4d9dd56b64a4649b8ce2e12260415450078ea50148174fc0dc81c3e 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_mixtype3_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:54b9f482d54a0905f18edd635a19359c72b005c4ebdd9df13c76428e45791d42 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/2bands_mixtype4_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:10bf0b760d5d426291562b256f3f2258a96005f0db941a661fbe9a8cbed08eac 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/bias0.18rec0.5_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f0b912d95e21f8b6a23e20b35defa15830751d27371316eba100b810302d013f 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6fe7daa6fa1a8c5b0e7d8ece8e3872d7bf7b67769879ae63f758bd1c3c35947e 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_hq_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fc590fc1c8e4d40bd6f1d42b43ab2f72241ff8933d830b8d0f2734bb7191c634 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e5515fb476497e21fbb2542444bfbce287a2bba0381a347421509d9b9cc03ccd 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_safe_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:30eb65f50c03673bb0dfd97582e3d3601359bf17e9245568fffcc236e00a26f9 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_no_safe_hq_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5e335d5b85546abf2f9790b1a01e5f763c52f8c1cbe34fbdfc1ea3fb10d3fa20 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/init_not_enable_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4b9ec9d2d962cdbff9ab47eab51d419ef47e8cb292804f89a8af2d8d2e6c1a2e 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_all1_bypass_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:444b34606328fc7d7e2840440d319453ae260af7085acbd1a162ff0c4a5f651c 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/lfo_lfo1_to_rec1_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e6702b79fa49eb021ffbf4cdeadbcf6c993c982f82837e03cc9b979af8987e9 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/max_drive_safe_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d1ecd6741af53f196f9b3482a777262dde432008befb9fec2b00220a5825ced2 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/test_downsample_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:48cdda7393b97b127d33f662865e93148a9b627e37963a654a970f63a1e9ca9c 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_comp_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d585340620629dd6390278d0380df13df5e658ca7d0c1c4676791e9abf998a02 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_comp_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1232c2814920e6feec9c77a8ffd952d00a6482a461992ea1eb8d263e951a3e26 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_extreme_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1af5068a0991368037ad7b8fcf38f31c459d1ed587dfc554aeed9c032d451069 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_hq_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3becda1d244d81f11896eeeeed50a3d250d3b4e07bed28da3a7d700d20910cd3 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_width_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d26ec39c59421bfb54672705d5b38adaf1c676485980c134e3029e3ba19beecc 3 | size 3176 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_extreme_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:03f495940f77de16c0ca56575ab4fb7fd6436b89bc8a5f34154f8e52ef868991 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_width_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fe1de6a9699a765cead0cff7ff1df669fed6ecd224c0b7cc104264864b990e08 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_global_filter_drums_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:37c2ad4ade4006a15d79420316460c99256574ea5e877a4f6c0ea8c19db2523d 3 | size 576104 4 | -------------------------------------------------------------------------------- /tests/GoldenMasters/half_drive_no_safe_global_filter_sine_output.wav: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:07514ec5cab486a911afaf06e131dd13fd2fce0141bc0b999f28429957d2734f 3 | size 3176 4 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | # Check for updates to GitHub Actions every week 7 | interval: "weekly" 8 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_core.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_dsp.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_dsp.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_core.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_events.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_opengl.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_events.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_opengl.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_graphics.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_graphics.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_extra.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_utils.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_basics.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_basics.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_gui_extra.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_basics.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_basics.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_cryptography.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_cryptography.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_devices.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_devices.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_formats.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_formats.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_graphics_Sheenbidi.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_processors.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_core_CompilationTime.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_data_structures.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_data_structures.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_graphics_Harfbuzz.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_processors.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_processors_ara.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AAX.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AAX.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_ARA.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AU_1.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AU_2.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AUv3.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_LV2.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_LV2.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_VST2.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_VST3.mm: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_Unity.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_VST2.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_AAX_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /JuceLibraryCode/include_juce_audio_plugin_client_Standalone.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | */ 7 | 8 | #include 9 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # build directories 4 | [Bb]uilds/ 5 | [Bb]uild/ 6 | 7 | # other directories generated by various tools 8 | Testing/ 9 | [Cc]ache/ 10 | .cache/ 11 | [Dd]eploy/ 12 | 13 | # IDE-specific files and directories 14 | xcuserdata/ 15 | .idea/ 16 | cmake-build-*/ 17 | [Oo]ut/ 18 | .vs/ 19 | .vscode/ 20 | .history/ 21 | *.vim 22 | [._]*.un~ 23 | *.sublime-workspace 24 | 25 | # other files 26 | .[Tt]rash* 27 | .nfs* 28 | *.bak 29 | *.tmp 30 | -------------------------------------------------------------------------------- /Temp/README.md: -------------------------------------------------------------------------------- 1 | # Testing 2 | 3 | This is for testing, make sure each commit has the same result of outputs. 4 | `tests/GoldenMasters` stores the "correct" version of output, while `tests/RegressionOutput` stores the current version's output. 5 | 6 | ## How to use? 7 | 8 | Drag GenerateGoldenMasters.cpp to `tests/` for generating `tests/GoldenMasters` wav files. 9 | `cmake -S . -B Builds -G "Ninja" -DCMAKE_BUILD_TYPE=Debug` 10 | `cmake --build Builds --config Debug` 11 | `cd Builds` 12 | `./Tests` -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "JUCE"] 2 | path = JUCE 3 | url = https://github.com/juce-framework/JUCE/ 4 | branch = develop 5 | [submodule "modules/melatonin_inspector"] 6 | path = modules/melatonin_inspector 7 | url = https://github.com/sudara/melatonin_inspector.git 8 | branch = main 9 | [submodule "modules/clap-juce-extensions"] 10 | path = modules/clap-juce-extensions 11 | url = https://github.com/free-audio/clap-juce-extensions.git 12 | [submodule "cmake"] 13 | path = cmake 14 | url = https://github.com/jerryuhoo/cmake-includes.git 15 | -------------------------------------------------------------------------------- /Source/DSP/WidthProcessor.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | WidthProcessor.h 5 | Created: 21 Dec 2020 6:05:29pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | #include "juce_core/juce_core.h" 13 | 14 | class WidthProcessor 15 | { 16 | public: 17 | WidthProcessor(); 18 | ~WidthProcessor(); 19 | void process(float* channeldataL, float* channeldataR, float width, float pan, int numSamples); 20 | 21 | private: 22 | }; 23 | -------------------------------------------------------------------------------- /JuceLibraryCode/ReadMe.txt: -------------------------------------------------------------------------------- 1 | 2 | Important Note!! 3 | ================ 4 | 5 | The purpose of this folder is to contain files that are auto-generated by the Projucer, 6 | and ALL files in this folder will be mercilessly DELETED and completely re-written whenever 7 | the Projucer saves your project. 8 | 9 | Therefore, it's a bad idea to make any manual changes to the files in here, or to 10 | put any of your own files in here if you don't want to lose them. (Of course you may choose 11 | to add the folder's contents to your version-control system so that you can re-merge your own 12 | modifications after the Projucer has saved its changes). 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | CMakeLists.txt.user 2 | CMakeCache.txt 3 | CMakeFiles 4 | CMakeScripts 5 | Makefile 6 | cmake_install.cmake 7 | install_manifest.txt 8 | compile_commands.json 9 | CTestTestfile.cmake 10 | _deps 11 | **/.DS_Store 12 | 13 | # It's nice to have the Builds folder exist, to remind us where it is 14 | Builds/* 15 | !Builds/.gitkeep 16 | 17 | # This should never exist 18 | Install/* 19 | 20 | # Running CTest makes a bunch o junk 21 | Testing 22 | 23 | # IDE config 24 | .idea 25 | 26 | # clion cmake builds 27 | cmake-build-debug 28 | cmake-build-release 29 | cmake-build-relwithdebinfo 30 | packaging/Output/* 31 | 32 | tests/RegressionOutput 33 | 34 | *.asd -------------------------------------------------------------------------------- /ART_LICENSE.md: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) 2 | 3 | The artwork, images, and design assets in this repository are licensed under 4 | the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. 5 | 6 | ### Permissions: 7 | ✔ You **can** copy, modify, and share these assets. 8 | ❌ You **cannot** use them for commercial purposes. 9 | ✔ You **must** give appropriate credit. 10 | ✔ If you modify these assets, you **must** distribute your modifications under the same license. 11 | 12 | For full license details, see: 13 | 🔗 https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode 14 | -------------------------------------------------------------------------------- /tests/Catch2Main.cpp: -------------------------------------------------------------------------------- 1 | // All test files are included in the executable via the Glob in CMakeLists.txt 2 | 3 | #include "juce_gui_basics/juce_gui_basics.h" 4 | #include 5 | 6 | int main(int argc, char* argv[]) 7 | { 8 | // This lets us use JUCE's MessageManager without leaking. 9 | // PluginProcessor might need this if you use the APVTS for example. 10 | // You'll also need it for tests that rely on juce::Graphics, juce::Timer, etc. 11 | // It's nicer DX when placed here vs. manually in Catch2 SECTIONs 12 | juce::ScopedJuceInitialiser_GUI gui; 13 | 14 | const int result = Catch::Session().run(argc, argv); 15 | 16 | return result; 17 | } 18 | #include -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "JUCE", 5 | "compilerPath": "/usr/bin/clang++", 6 | "cStandard": "c17", 7 | "cppStandard": "c++17", 8 | "intelliSenseMode": "clang-x64", 9 | "includePath": [ 10 | "${workspaceFolder}/Source", 11 | "${workspaceFolder}/JuceLibraryCode/**", 12 | // Edit the path to your JUCE modules and user modules here. 13 | // I added them just in case one wants to include other headers than those initially selected with Projucer 14 | "/Applications/JUCE/modules/**" 15 | ] 16 | } 17 | ], 18 | "version": 4 19 | } -------------------------------------------------------------------------------- /packaging/dmg.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Pamplejuce", 3 | "icon": "pamplejuce.icns", 4 | "background": "background.jpg", 5 | "window": { 6 | "position": { 7 | "x": 100, 8 | "y": 100 9 | }, 10 | "size": { 11 | "width": 730, 12 | "height": 520 13 | } 14 | }, 15 | "format": "UDZO", 16 | "contents": [ 17 | { "x": 250, "y": 200, "type": "file", "path": "dmg/Pamplejuce Demo.app" }, 18 | { "x": 480, "y": 200, "type": "link", "path": "/Applications" }, 19 | { "x": 250, "y": 300, "type": "file", "path": "dmg/Pamplejuce Demo.component" }, 20 | { "x": 480, "y": 300, "type": "file", "path": "dmg/Your Mac's Component Folder" }, 21 | { "x": 250, "y": 400, "type": "file", "path": "dmg/Pamplejuce Demo.vst3" }, 22 | { "x": 480, "y": 400, "type": "file", "path": "dmg/Your Mac's VST3 Folder" } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /benchmarks/Catch2Main.cpp: -------------------------------------------------------------------------------- 1 | // All test files are included in the executable via the Glob in CMakeLists.txt 2 | 3 | #include "juce_gui_basics/juce_gui_basics.h" 4 | #include 5 | 6 | int main(int argc, char* argv[]) 7 | { 8 | // This lets us use JUCE's MessageManager without leaking. 9 | // PluginProcessor might need this if you use the APVTS for example. 10 | // You'll also need it for tests that rely on juce::Graphics, juce::Timer, etc. 11 | // It's nicer DX when placed here vs. manually in Catch2 SECTIONs 12 | juce::ScopedJuceInitialiser_GUI gui; 13 | 14 | const int result = Catch::Session().run(argc, argv); 15 | 16 | return result; 17 | } 18 | #include "PluginEditor.h" 19 | #include "PluginProcessor.h" 20 | #include "catch2/benchmark/catch_benchmark_all.hpp" 21 | #include "catch2/catch_test_macros.hpp" 22 | 23 | #include "Benchmarks.cpp" 24 | -------------------------------------------------------------------------------- /Source/GUI/ValuePopup.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | ValuePopup.h 5 | Created: 4 Oct 2025 7:36:22pm 6 | Author: Yifeng Yu 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "InterfaceDefines.h" 14 | #include "juce_gui_basics/juce_gui_basics.h" 15 | 16 | 17 | // A simple component to display a floating label, typically for slider values. 18 | class ValuePopup : public juce::Component 19 | { 20 | public: 21 | ValuePopup(); 22 | ~ValuePopup() override; 23 | 24 | void paint(juce::Graphics& g) override; 25 | void resized() override; 26 | 27 | // Sets the text to be displayed in the popup. 28 | void setText(const juce::String& text); 29 | 30 | private: 31 | juce::Label valueLabel; 32 | 33 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ValuePopup) 34 | }; -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/Oscilloscope.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Oscilloscope.h 5 | Created: 25 Oct 2020 7:26:35pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../../PluginProcessor.h" 14 | #include "GraphTemplate.h" 15 | 16 | //============================================================================== 17 | /* 18 | */ 19 | class Oscilloscope : public GraphTemplate, juce::Timer 20 | { 21 | public: 22 | Oscilloscope (FireAudioProcessor&); 23 | ~Oscilloscope() override; 24 | 25 | void paint (juce::Graphics&) override; 26 | void timerCallback() override; 27 | 28 | private: 29 | FireAudioProcessor& processor; 30 | 31 | juce::Array historyL; 32 | juce::Array historyR; 33 | juce::Image historyImage; 34 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Oscilloscope) 35 | }; 36 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/SoloButton.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | SoloButton.h 5 | Created: 3 Dec 2020 8:18:19pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "juce_gui_basics/juce_gui_basics.h" 14 | #include "../../GUI/LookAndFeel.h" 15 | 16 | //============================================================================== 17 | /* 18 | */ 19 | class SoloButton : public juce::ToggleButton 20 | { 21 | public: 22 | SoloButton(); 23 | ~SoloButton() override; 24 | 25 | void paint (juce::Graphics&) override; 26 | void resized() override; 27 | 28 | void mouseEnter (const juce::MouseEvent& e) override; 29 | void mouseExit (const juce::MouseEvent& e) override; 30 | 31 | private: 32 | bool isEntered = false; 33 | juce::Colour getColour(); 34 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SoloButton) 35 | }; 36 | -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/WidthGraph.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | WidthGraph.h 5 | Created: 14 Dec 2020 3:40:40pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../../PluginProcessor.h" 14 | #include "GraphTemplate.h" 15 | 16 | //============================================================================== 17 | /* 18 | */ 19 | class WidthGraph : public GraphTemplate, juce::Timer 20 | { 21 | public: 22 | WidthGraph(FireAudioProcessor&); 23 | ~WidthGraph() override; 24 | 25 | void paint(juce::Graphics&) override; 26 | void timerCallback() override; 27 | void resized() override; 28 | 29 | private: 30 | FireAudioProcessor& processor; 31 | juce::Array historyL; 32 | juce::Array historyR; 33 | juce::Image pointCloudCache; 34 | 35 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WidthGraph) 36 | }; 37 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/EnableButton.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | EnableButton.h 5 | Created: 3 Dec 2020 8:18:45pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "juce_gui_basics/juce_gui_basics.h" 14 | #include "../../GUI/LookAndFeel.h" 15 | 16 | //============================================================================== 17 | /* 18 | */ 19 | class EnableButton : public juce::ToggleButton 20 | { 21 | public: 22 | EnableButton(); 23 | ~EnableButton() override; 24 | 25 | void paint (juce::Graphics&) override; 26 | void resized() override; 27 | 28 | void mouseEnter (const juce::MouseEvent& e) override; 29 | void mouseExit (const juce::MouseEvent& e) override; 30 | 31 | private: 32 | bool isEntered = false; 33 | juce::Colour getColour(); 34 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnableButton) 35 | }; 36 | -------------------------------------------------------------------------------- /tests/PluginBasics.cpp: -------------------------------------------------------------------------------- 1 | #include "helpers/test_helpers.h" 2 | #include 3 | #include 4 | #include 5 | 6 | TEST_CASE ("one is equal to one", "[dummy]") 7 | { 8 | REQUIRE (1 == 1); 9 | } 10 | 11 | TEST_CASE ("Plugin instance", "[instance]") 12 | { 13 | FireAudioProcessor testPlugin; 14 | 15 | // This lets us use JUCE's MessageManager without leaking. 16 | // PluginProcessor might need this if you use the APVTS for example. 17 | // You'll also need it for tests that rely on juce::Graphics, juce::Timer, etc. 18 | auto gui = juce::ScopedJuceInitialiser_GUI {}; 19 | 20 | SECTION ("name") 21 | { 22 | CHECK_THAT (testPlugin.getName().toStdString(), 23 | Catch::Matchers::Equals ("Fire")); 24 | } 25 | } 26 | 27 | 28 | #ifdef PAMPLEJUCE_IPP 29 | #include 30 | 31 | TEST_CASE ("IPP version", "[ipp]") 32 | { 33 | CHECK_THAT (ippsGetLibVersion()->Version, Catch::Matchers::Equals ("2021.10.1 (r0x8e799c51)")); 34 | } 35 | #endif 36 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/CloseButton.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | CloseButton.h 5 | Created: 8 Nov 2020 7:57:32pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "VerticalLine.h" 14 | #include "../../GUI/LookAndFeel.h" 15 | 16 | //============================================================================== 17 | /* 18 | */ 19 | class CloseButton : public juce::ToggleButton 20 | { 21 | public: 22 | CloseButton (); 23 | ~CloseButton() override; 24 | 25 | void paint (juce::Graphics&) override; 26 | void resized() override; 27 | 28 | private: 29 | // VerticalLine& verticalLine; 30 | bool isEntered = false; 31 | void mouseDown (const juce::MouseEvent& e) override; 32 | void mouseEnter (const juce::MouseEvent& e) override; 33 | void mouseExit (const juce::MouseEvent& e) override; 34 | 35 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CloseButton) 36 | }; 37 | -------------------------------------------------------------------------------- /Source/GUI/ValueEntryPopup.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | ValueEntryPopup.h 5 | Created: 8 Oct 2025 8:17:48pm 6 | Author: Yifeng Yu 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "juce_gui_basics/juce_gui_basics.h" 12 | #include 13 | 14 | //============================================================================== 15 | class ValueEntryPopup : public juce::Component, 16 | private juce::TextEditor::Listener 17 | { 18 | public: 19 | ValueEntryPopup(); 20 | ~ValueEntryPopup() override; 21 | 22 | void resized() override; 23 | void paint(juce::Graphics& g) override; 24 | 25 | void textEditorReturnKeyPressed(juce::TextEditor&) override; 26 | 27 | std::function onOk; 28 | std::function onCancel; 29 | 30 | private: 31 | juce::TextEditor editor; 32 | juce::TextButton okButton; 33 | juce::TextButton cancelButton; 34 | 35 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ValueEntryPopup) 36 | }; -------------------------------------------------------------------------------- /modules/melatonin_inspector/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Sudara Williams 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/DraggableButton.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | DraggableButton.h 5 | Created: 7 Oct 2021 11:42:21pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "juce_gui_basics/juce_gui_basics.h" 14 | 15 | //============================================================================== 16 | /* 17 | */ 18 | class DraggableButton : public juce::Component 19 | { 20 | public: 21 | DraggableButton(); 22 | ~DraggableButton() override; 23 | 24 | void paint(juce::Graphics&) override; 25 | void resized() override; 26 | 27 | void mouseEnter(const juce::MouseEvent& e) override; 28 | void mouseExit(const juce::MouseEvent& e) override; 29 | void setState(const bool state); 30 | void mouseWheelMove(const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) override; 31 | std::function onQValueChanged; 32 | 33 | private: 34 | bool isEntered = false; 35 | juce::Colour getColour(); 36 | bool mState = true; 37 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DraggableButton) 38 | }; 39 | -------------------------------------------------------------------------------- /tests/helpers/test_helpers.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | /* This is a helper function to run tests within the context of a plugin editor. 5 | * 6 | * Read more here: https://github.com/sudara/pamplejuce/issues/18#issuecomment-1425836807 7 | * 8 | * Example usage (screenshots the plugin) 9 | * 10 | runWithinPluginEditor ([&] (PluginProcessor& plugin) { 11 | auto snapshot = plugin.getActiveEditor()->createComponentSnapshot (plugin.getActiveEditor()->getLocalBounds(), true, 2.0f); 12 | auto file = juce::File::getSpecialLocation (juce::File::SpecialLocationType::userDocumentsDirectory).getChildFile ("snapshot.jpeg"); 13 | file.deleteFile(); 14 | juce::FileOutputStream stream (file); 15 | juce::JPEGImageFormat jpeg; 16 | jpeg.writeImageToStream (snapshot, stream); 17 | 18 | REQUIRE (file.existsAsFile()); 19 | }); 20 | 21 | */ 22 | [[maybe_unused]] void runWithinPluginEditor (const std::function& testCode) 23 | { 24 | FireAudioProcessor plugin; 25 | auto gui = juce::ScopedJuceInitialiser_GUI {}; 26 | auto editor = plugin.createEditorIfNeeded(); 27 | 28 | testCode (plugin); 29 | 30 | plugin.editorBeingDeleted (editor); 31 | delete editor; 32 | } 33 | -------------------------------------------------------------------------------- /Source/Utility/AudioHelpers.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | AudioHelpers.h 5 | Created: 11 Apr 2021 1:07:30pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | #include "../GUI/InterfaceDefines.h" 13 | #include "juce_dsp/juce_dsp.h" 14 | 15 | static inline float dBToNormalizedGain(float inValue) 16 | { 17 | float inValuedB = juce::Decibels::gainToDecibels(inValue + 0.00001f); 18 | inValuedB = (inValuedB + 96.0f) / 96.0f; 19 | return inValuedB; 20 | } 21 | 22 | inline float helper_denormalize(float inValue) 23 | { 24 | float absValue = fabs(inValue); 25 | if (absValue < 1e-15) 26 | { 27 | return 0.0f; 28 | } 29 | else 30 | { 31 | return inValue; 32 | } 33 | } 34 | 35 | static inline float transformToLog(double valueToTransform) 36 | { 37 | auto value = juce::mapFromLog10(valueToTransform, 20.0, 20000.0); 38 | return static_cast(value); 39 | } 40 | 41 | static inline float transformFromLog(double between0and1) 42 | { 43 | auto value = juce::mapToLog10(between0and1, 20.0, 20000.0); 44 | return static_cast(value); 45 | } -------------------------------------------------------------------------------- /modules/melatonin_inspector/melatonin/helpers/inspector_settings.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "juce_gui_basics/juce_gui_basics.h" 3 | namespace melatonin 4 | { 5 | // We have to avoid using ApplicationProperties in a SharedResourcePointer 6 | // as we don't want to screw up the app's properties file 7 | struct InspectorSettings 8 | { 9 | InspectorSettings() 10 | { 11 | juce::PropertiesFile::Options opts; 12 | 13 | opts.applicationName = "melatonin_inspector"; 14 | opts.filenameSuffix = ".xml"; 15 | opts.folderName = "sudara"; 16 | opts.osxLibrarySubFolder = "Application Support"; 17 | opts.commonToAllUsers = false; 18 | opts.ignoreCaseOfKeyNames = false; 19 | opts.doNotSave = false; 20 | opts.millisecondsBeforeSaving = 1; 21 | opts.storageFormat = juce::PropertiesFile::storeAsXML; 22 | props = std::make_unique (opts); 23 | } 24 | 25 | void saveIfNeeded() const 26 | { 27 | props->saveIfNeeded(); 28 | } 29 | 30 | // this is a unique_ptr because our object must be default constructable 31 | std::unique_ptr props; 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/VUPanel.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | VUPanel.h 5 | Created: 29 Aug 2021 6:21:02pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../../PluginProcessor.h" 14 | #include "GraphTemplate.h" 15 | #include "VUMeter.h" 16 | 17 | //============================================================================== 18 | /* 19 | */ 20 | class VUPanel : public GraphTemplate, juce::Timer 21 | { 22 | public: 23 | VUPanel(FireAudioProcessor&); 24 | ~VUPanel() override; 25 | 26 | void paint(juce::Graphics&) override; 27 | void resized() override; 28 | void setFocusBandNum(int num); 29 | void timerCallback() override; 30 | void updateRealtimeThreshold(float newThresholdDb); 31 | 32 | private: 33 | FireAudioProcessor& processor; 34 | int focusBandNum; 35 | const float VU_METER_RANGE = 96.0f; 36 | VUMeter vuMeterIn; 37 | VUMeter vuMeterOut; 38 | 39 | juce::String threshID = ""; 40 | juce::String compBypassID = ""; 41 | float realtimeThresholdDb; 42 | 43 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VUPanel) 44 | }; -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/GraphTemplate.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | GraphTemplate.h 5 | Created: 5 Oct 2021 11:42:57am 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../../GUI/InterfaceDefines.h" 14 | #include "juce_gui_basics/juce_gui_basics.h" 15 | 16 | //============================================================================== 17 | /* 18 | */ 19 | class GraphTemplate : public juce::Component 20 | { 21 | public: 22 | GraphTemplate(); 23 | ~GraphTemplate() override; 24 | 25 | void paint (juce::Graphics&) override; 26 | void resized() override; 27 | void setScale (float scale); 28 | float getScale(); 29 | bool getZoomState(); 30 | void setZoomState (bool zoomState); 31 | void mouseDown (const juce::MouseEvent& e) override; 32 | void mouseEnter (const juce::MouseEvent& e) override; 33 | void mouseExit (const juce::MouseEvent& e) override; 34 | 35 | private: 36 | float scale = 1.0f; 37 | 38 | protected: 39 | bool isMouseOn = false; 40 | bool mZoomState = false; 41 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GraphTemplate) 42 | }; 43 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/SpectrumBackground.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | SpectrumBackground.h 5 | Created: 22 May 2024 3:13:06pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../GUI/LookAndFeel.h" 14 | #include "juce_audio_processors/juce_audio_processors.h" 15 | #include "juce_gui_basics/juce_gui_basics.h" 16 | 17 | //============================================================================== 18 | /* 19 | */ 20 | class SpectrumBackground : public juce::Component 21 | { 22 | public: 23 | SpectrumBackground(); 24 | ~SpectrumBackground(); 25 | 26 | void paint(juce::Graphics& g) override; 27 | void resized() override; 28 | 29 | private: 30 | void createBackgroundImage(); 31 | 32 | int numberOfBins; 33 | 34 | static const int frequenciesForLines[]; 35 | static const int numberOfLines; 36 | static const int frequenciesForTextLabels[]; 37 | float mBinWidth; 38 | float scale = 1.0f; 39 | 40 | // The cached image for our static background. 41 | juce::Image cachedBackground; 42 | float lastDisplayScale = 1.0f; 43 | 44 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SpectrumBackground) 45 | }; 46 | -------------------------------------------------------------------------------- /Source/GUI/ValuePopup.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | ValuePopup.cpp 5 | Created: 4 Oct 2025 7:36:22pm 6 | Author: Yifeng Yu 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "ValuePopup.h" 12 | 13 | ValuePopup::ValuePopup() 14 | { 15 | // Style the label for the popup window 16 | valueLabel.setColour(juce::Label::backgroundColourId, juce::Colours::black.withAlpha(0.85f)); 17 | valueLabel.setColour(juce::Label::textColourId, COLOUR4); 18 | valueLabel.setBorderSize({ 1, 1, 1, 1 }); 19 | valueLabel.setColour(juce::Label::outlineColourId, COLOUR6); 20 | valueLabel.setJustificationType(juce::Justification::centred); 21 | addAndMakeVisible(valueLabel); 22 | 23 | // Make sure it doesn't interfere with mouse events for components underneath it. 24 | setInterceptsMouseClicks(false, false); 25 | } 26 | 27 | ValuePopup::~ValuePopup() 28 | { 29 | } 30 | 31 | void ValuePopup::paint(juce::Graphics& g) 32 | { 33 | // Nothing to paint here, as the child label handles everything. 34 | } 35 | 36 | void ValuePopup::resized() 37 | { 38 | valueLabel.setBounds(getLocalBounds()); 39 | } 40 | 41 | void ValuePopup::setText(const juce::String& text) 42 | { 43 | valueLabel.setText(text, juce::dontSendNotification); 44 | } 45 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/FreqTextLabel.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | FreqTextLabel.h 5 | Created: 2 Dec 2020 7:53:08pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "juce_gui_basics/juce_gui_basics.h" 14 | #include "../../GUI/LookAndFeel.h" 15 | #include "VerticalLine.h" 16 | #include "SpectrumComponent.h" 17 | //============================================================================== 18 | /* 19 | */ 20 | class FreqTextLabel : public juce::Component, juce::Timer 21 | { 22 | public: 23 | FreqTextLabel (VerticalLine& v); 24 | ~FreqTextLabel() override; 25 | 26 | void paint (juce::Graphics&) override; 27 | void resized() override; 28 | void setFreq (int freq); 29 | int getFreq(); 30 | void setScale (float scale); 31 | bool isMouseOverCustom(); 32 | void timerCallback() override; 33 | void setFade (bool update, bool isFadeIn); 34 | 35 | private: 36 | VerticalLine& verticalLine; 37 | int mFrequency; 38 | float mScale = 1.0f; 39 | bool mUpdate = false; 40 | bool mFadeIn = true; 41 | int currentStep = 0; 42 | const int maxStep = 5; 43 | 44 | juce::Label freqLabel; 45 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FreqTextLabel) 46 | }; 47 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/melatonin/helpers/misc.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | //#include "InspectorBinaryData.h" // uncomment when adding assets via CMake 3 | #include "../../LatestCompiledAssets/InspectorBinaryData.h" 4 | #include 5 | 6 | namespace melatonin 7 | { 8 | static inline juce::String dimensionsString (juce::Rectangle bounds) 9 | { 10 | // account for outline border drawing (1 on each side) 11 | return juce::String (bounds.getWidth() - 2) + L" × " + juce::String (bounds.getHeight() - 2); 12 | } 13 | 14 | static inline juce::String distanceString (juce::Line line) 15 | { 16 | // account for outline border drawing (1 on each side) 17 | auto v = line.getLength() + 3; 18 | return juce::String (v); 19 | } 20 | 21 | static inline juce::Image getIcon (const juce::String& iconName) 22 | { 23 | int size = 0; 24 | auto filename = iconName.replace (" ", "") + "_png"; 25 | auto data = InspectorBinaryData::getNamedResource (filename.getCharPointer(), size); 26 | if (size > 0) 27 | { 28 | return juce::ImageCache::getFromMemory (data, size); 29 | } 30 | else 31 | { 32 | // you told me to load an image that doesn't exist 33 | jassertfalse; 34 | return {}; 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/melatonin/helpers/timing.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | namespace melatonin 5 | { 6 | class ComponentTimer 7 | { 8 | public: 9 | explicit ComponentTimer (juce::Component* c) : component (c) 10 | { 11 | startTimeTicks = juce::Time::getHighResolutionTicks(); 12 | } 13 | 14 | ~ComponentTimer() 15 | { 16 | static double scalar = 1.0 / static_cast (juce::Time::getHighResolutionTicksPerSecond()); 17 | result = static_cast (juce::Time::getHighResolutionTicks() - startTimeTicks) * scalar; 18 | 19 | auto& props = component->getProperties(); 20 | 21 | // if this new time is slower, make it the max 22 | if (result > (double) props.getWithDefault ("timing1", 0.0)) 23 | props.set ("timingMax", result); 24 | 25 | // push the 1st and 2nd timings down 26 | props.set ("timing3", props.getWithDefault ("timing2", 0.0)); 27 | props.set ("timing2", props.getWithDefault ("timing1", 0.0)); 28 | props.set ("timing1", result); 29 | } 30 | 31 | private: 32 | juce::Component* component; 33 | juce::int64 startTimeTicks; 34 | double result = 0; 35 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentTimer) 36 | }; 37 | 38 | } 39 | -------------------------------------------------------------------------------- /packaging/EULA: -------------------------------------------------------------------------------- 1 | This is a End User License Agreement ("EULA"). 2 | 3 | Please read it carefully before installing this software. By installing and using this software, you agree you have read this EULA and agree to the terms and conditions. If you disagree, do not install. 4 | 5 | 1. This software is licensed for use solely by the person who paid for the license, referred to as "Licensee". 6 | 7 | 2. Licensee can install this software on multiple computers, but only if they personally own and manage them. 8 | Licensee is allowed to make personal backup copies of the software's materials. 9 | 10 | 3. Licensee is prohibited from copying, altering, translating, selling, distributing, or reverse engineering the software. 11 | Trying to access its source code, unless allowed by law, is also forbidden. 12 | 13 | 4. Licensee must not change or hide any copyright, trademark, or other ownership notices in the software. 14 | 15 | 5. Licensee may not share, publish or distribute the software without prior consent from Pitch Innovations. 16 | 17 | 6. This software is provided "as-is" without any warranties, either expressed or implied, including but not limited to implied warranties of merchantability or fitness for a particular purpose. 18 | 19 | 7. In no event shall the software's creators or distributors be liable for any damages, including but not limited to, direct, indirect, special, incidental, or consequential damages or other losses arising out of the use of or inability to use the software. 20 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/LatestCompiledAssets/BinaryData7.cpp: -------------------------------------------------------------------------------- 1 | /* ==================================== JUCER_BINARY_RESOURCE ==================================== 2 | 3 | This is an auto-generated file: Any edits you make may be overwritten! 4 | 5 | */ 6 | 7 | #include 8 | 9 | namespace InspectorBinaryData 10 | { 11 | 12 | //================== expand-off.png ================== 13 | static const unsigned char temp_binary_data_6[] = 14 | { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,37,1,73,82,36,240,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,194,73,68,65,84, 15 | 120,1,237,151,205,13,2,33,16,133,223,24,11,217,86,208,6,140,13,88,130,225,98,44,193,112,217,181,4,27,176,4,183,20,183,146,69,56,144,16,163,146,101,198,184,137,243,157,128,129,188,199,223,4,104,183,221,123,4,46,215,51,33,35,181,39,190,21,95,64,81,126, 16 | 12,189,187,5,83,57,180,55,255,41,238,236,106,158,183,96,9,33,242,25,30,219,190,25,225,251,80,108,74,227,196,87,32,23,15,142,134,82,127,214,190,151,196,9,100,66,253,30,99,207,103,32,33,182,2,175,196,79,214,12,165,113,34,6,106,197,69,12,112,196,35,172, 17 | 60,192,17,23,201,3,35,176,65,229,204,19,44,3,206,154,14,240,182,86,60,194,78,68,206,174,59,40,10,3,177,247,192,84,102,243,30,80,3,138,66,127,255,59,126,0,137,131,124,120,219,151,63,87,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; 18 | 19 | const char* expandoff_png = (const char*) temp_binary_data_6; 20 | } 21 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/LatestCompiledAssets/BinaryData8.cpp: -------------------------------------------------------------------------------- 1 | /* ==================================== JUCER_BINARY_RESOURCE ==================================== 2 | 3 | This is an auto-generated file: Any edits you make may be overwritten! 4 | 5 | */ 6 | 7 | #include 8 | 9 | namespace InspectorBinaryData 10 | { 11 | 12 | //================== expand-on.png ================== 13 | static const unsigned char temp_binary_data_7[] = 14 | { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,37,1,73,82,36,240,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,196,73,68,65,84, 15 | 120,1,237,151,209,9,131,48,16,64,239,196,65,92,197,118,131,46,208,17,36,63,109,71,40,126,212,118,132,46,80,58,65,179,138,147,52,77,62,14,36,24,105,76,14,5,239,129,32,158,248,238,148,59,19,60,30,26,3,150,231,235,129,48,128,174,19,92,241,2,4,129,153,75, 16 | 167,171,243,77,55,161,56,134,186,32,151,252,11,70,219,211,10,192,168,86,237,239,20,35,111,9,76,12,229,182,178,30,161,120,143,221,151,220,134,167,238,99,220,49,45,199,250,170,234,30,56,18,240,137,145,59,202,156,223,62,70,78,222,108,111,32,182,114,34,91, 17 | 2,115,228,89,19,152,35,119,36,207,1,191,3,124,90,181,27,125,238,106,254,134,201,131,40,84,225,191,200,122,64,88,28,214,245,192,20,171,153,3,146,128,32,224,230,119,199,63,81,194,129,48,227,106,116,154,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; 18 | 19 | const char* expandon_png = (const char*) temp_binary_data_7; 20 | } 21 | -------------------------------------------------------------------------------- /JuceLibraryCode/BinaryData.h: -------------------------------------------------------------------------------- 1 | /* ========================================================================================= 2 | 3 | This is an auto-generated file: Any edits you make may be overwritten! 4 | 5 | */ 6 | 7 | #pragma once 8 | 9 | namespace BinaryData 10 | { 11 | extern const char* fire_anime_png; 12 | const int fire_anime_pngSize = 713474; 13 | 14 | extern const char* firelogo_png; 15 | const int firelogo_pngSize = 9722; 16 | 17 | extern const char* firewingslogo_png; 18 | const int firewingslogo_pngSize = 11396; 19 | 20 | // Number of elements in the namedResourceList and originalFileNames arrays. 21 | const int namedResourceListSize = 3; 22 | 23 | // Points to the start of a list of resource names. 24 | extern const char* namedResourceList[]; 25 | 26 | // Points to the start of a list of resource filenames. 27 | extern const char* originalFilenames[]; 28 | 29 | // If you provide the name of one of the binary resource variables above, this function will 30 | // return the corresponding data and its size (or a null pointer if the name isn't found). 31 | const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes); 32 | 33 | // If you provide the name of one of the binary resource variables above, this function will 34 | // return the corresponding original, non-mangled filename (or a null pointer if the name isn't found). 35 | const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8); 36 | } 37 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/melatonin_inspector.cpp: -------------------------------------------------------------------------------- 1 | // WARNING! This file is automatically written by copy_cmake_assets.rb 2 | 3 | // As recommended by the JUCE MODULE API, these cpp files are included by the main module cpp 4 | // See https://github.com/juce-framework/JUCE/blob/master/docs/JUCE%20Module%20Format.md#module-cpp-files 5 | 6 | #include 7 | JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE("-Wredundant-decls") 8 | // NOLINTBEGIN(bugprone-suspicious-include) 9 | #include "LatestCompiledAssets/BinaryData1.cpp" 10 | #include "LatestCompiledAssets/BinaryData10.cpp" 11 | #include "LatestCompiledAssets/BinaryData11.cpp" 12 | #include "LatestCompiledAssets/BinaryData12.cpp" 13 | #include "LatestCompiledAssets/BinaryData13.cpp" 14 | #include "LatestCompiledAssets/BinaryData14.cpp" 15 | #include "LatestCompiledAssets/BinaryData15.cpp" 16 | #include "LatestCompiledAssets/BinaryData16.cpp" 17 | #include "LatestCompiledAssets/BinaryData17.cpp" 18 | #include "LatestCompiledAssets/BinaryData18.cpp" 19 | #include "LatestCompiledAssets/BinaryData19.cpp" 20 | #include "LatestCompiledAssets/BinaryData2.cpp" 21 | #include "LatestCompiledAssets/BinaryData20.cpp" 22 | #include "LatestCompiledAssets/BinaryData3.cpp" 23 | #include "LatestCompiledAssets/BinaryData4.cpp" 24 | #include "LatestCompiledAssets/BinaryData5.cpp" 25 | #include "LatestCompiledAssets/BinaryData6.cpp" 26 | #include "LatestCompiledAssets/BinaryData7.cpp" 27 | #include "LatestCompiledAssets/BinaryData8.cpp" 28 | #include "LatestCompiledAssets/BinaryData9.cpp" 29 | // NOLINTEND(bugprone-suspicious-include) 30 | JUCE_END_IGNORE_WARNINGS_GCC_LIKE 31 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/CloseButton.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | CloseButton.cpp 5 | Created: 8 Nov 2020 7:57:32pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "CloseButton.h" 12 | 13 | //============================================================================== 14 | CloseButton::CloseButton () 15 | { 16 | } 17 | 18 | CloseButton::~CloseButton() 19 | { 20 | } 21 | 22 | void CloseButton::paint (juce::Graphics& g) 23 | { 24 | if (isEntered) 25 | { 26 | g.setColour (COLOUR1); 27 | g.drawLine (getWidth() / 4.f, getHeight() / 4.f, getWidth() / 4.f * 3.f, getHeight() / 4.f * 3.f, 2.f); 28 | g.drawLine (getWidth() / 4.f, getHeight() / 4.f * 3.f, getWidth() / 4.f * 3.f, getHeight() / 4.f, 2.f); 29 | } 30 | else 31 | { 32 | g.setColour (COLOUR1.withBrightness (0.4f)); 33 | g.drawLine (getWidth() / 4.f, getHeight() / 4.f, getWidth() / 4.f * 3.f, getHeight() / 4.f * 3.f, 2.f); 34 | g.drawLine (getWidth() / 4.f, getHeight() / 4.f * 3.f, getWidth() / 4.f * 3.f, getHeight() / 4.f, 2.f); 35 | } 36 | } 37 | 38 | void CloseButton::resized() 39 | { 40 | } 41 | 42 | void CloseButton::mouseDown (const juce::MouseEvent& e) 43 | { 44 | setToggleState (false, juce::sendNotification); 45 | } 46 | 47 | void CloseButton::mouseEnter (const juce::MouseEvent& e) 48 | { 49 | isEntered = true; 50 | } 51 | 52 | void CloseButton::mouseExit (const juce::MouseEvent& e) 53 | { 54 | isEntered = false; 55 | } 56 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/SoloButton.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | SoloButton.cpp 5 | Created: 3 Dec 2020 8:18:19pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "SoloButton.h" 12 | 13 | //============================================================================== 14 | SoloButton::SoloButton() 15 | { 16 | } 17 | 18 | SoloButton::~SoloButton() 19 | { 20 | } 21 | 22 | void SoloButton::paint (juce::Graphics& g) 23 | { 24 | g.setColour (getColour().darker().darker()); 25 | g.fillEllipse (0, 0, getWidth(), getHeight()); 26 | g.setColour (getColour()); 27 | g.drawText ("S", 0, 0, getWidth(), getHeight(), juce::Justification::centred); 28 | } 29 | 30 | void SoloButton::resized() 31 | { 32 | } 33 | 34 | void SoloButton::mouseEnter (const juce::MouseEvent& e) 35 | { 36 | isEntered = true; 37 | } 38 | 39 | void SoloButton::mouseExit (const juce::MouseEvent& e) 40 | { 41 | isEntered = false; 42 | } 43 | 44 | juce::Colour SoloButton::getColour() 45 | { 46 | if (isEntered) 47 | { 48 | if (! getToggleState()) 49 | { 50 | return juce::Colours::grey.withAlpha (0.8f); 51 | } 52 | else 53 | { 54 | return COLOUR1.withAlpha (0.8f); 55 | } 56 | } 57 | else 58 | { 59 | if (! getToggleState()) 60 | { 61 | return juce::Colours::grey; 62 | } 63 | else 64 | { 65 | return COLOUR1; 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/GraphTemplate.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | GraphTemplate.cpp 5 | Created: 5 Oct 2021 11:42:57am 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "GraphTemplate.h" 12 | 13 | //============================================================================== 14 | GraphTemplate::GraphTemplate() 15 | { 16 | } 17 | 18 | GraphTemplate::~GraphTemplate() 19 | { 20 | } 21 | 22 | void GraphTemplate::paint (juce::Graphics& g) 23 | { 24 | // draw outline 25 | g.setColour (COLOUR6); 26 | g.drawRect (getLocalBounds(), 1); 27 | } 28 | 29 | void GraphTemplate::resized() 30 | { 31 | } 32 | 33 | void GraphTemplate::setScale (float scale) 34 | { 35 | this->scale = scale; 36 | } 37 | 38 | float GraphTemplate::getScale() 39 | { 40 | return scale; 41 | } 42 | 43 | bool GraphTemplate::getZoomState() 44 | { 45 | return mZoomState; 46 | } 47 | 48 | void GraphTemplate::setZoomState (bool zoomState) 49 | { 50 | mZoomState = zoomState; 51 | } 52 | 53 | void GraphTemplate::mouseDown (const juce::MouseEvent& e) 54 | { 55 | if (mZoomState) 56 | { 57 | mZoomState = false; 58 | scale = 1; 59 | } 60 | else 61 | { 62 | mZoomState = true; 63 | scale = 2; 64 | } 65 | } 66 | 67 | void GraphTemplate::mouseEnter (const juce::MouseEvent& e) 68 | { 69 | isMouseOn = true; 70 | } 71 | 72 | void GraphTemplate::mouseExit (const juce::MouseEvent& e) 73 | { 74 | isMouseOn = false; 75 | } 76 | -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/DistortionGraph.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | DistortionGraph.h 5 | Created: 29 Nov 2020 10:31:46am 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../../PluginProcessor.h" 14 | #include "../../../GUI/LookAndFeel.h" 15 | #include "../../../DSP/ClippingFunctions.h" 16 | #include "GraphTemplate.h" 17 | 18 | //============================================================================== 19 | /* 20 | */ 21 | class DistortionGraph : public GraphTemplate, juce::AudioProcessorParameter::Listener, juce::AsyncUpdater 22 | { 23 | public: 24 | DistortionGraph(FireAudioProcessor&); 25 | ~DistortionGraph() override; 26 | 27 | void paint(juce::Graphics&) override; 28 | void setState(int mode, float rec, float mix, float bias, float drive, float rateDivide); 29 | 30 | void handleAsyncUpdate() override; 31 | 32 | void parameterValueChanged(int parameterIndex, float newValue) override; 33 | void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override {} 34 | 35 | private: 36 | FireAudioProcessor& processor; 37 | int mode = -1; 38 | float color = -1.0f; 39 | float rec = -1.0f; 40 | float mix = -1.0f; 41 | float bias = -1.0f; 42 | float rateDivide = -1.0f; 43 | float drive = -1.0f; 44 | float scale = 1.0f; 45 | juce::Path distortionCurve; 46 | void updateDistortionCurve(); 47 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DistortionGraph) 48 | }; 49 | -------------------------------------------------------------------------------- /Source/DSP/Delay.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | Delay.h 5 | Created: 18 Jul 2020 7:51:15pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | class Delay 14 | { 15 | public: 16 | Delay(int delayTime_) : delayTime(delayTime_) 17 | { 18 | delayBuffer.setSize(2, size); 19 | delayBuffer.clear(); 20 | writeIndex = delayTime; 21 | } 22 | 23 | void reset(int newDelayTime) 24 | { 25 | delayBuffer.clear(); 26 | writeIndex = newDelayTime; 27 | readIndex = 0; 28 | } 29 | 30 | void setLatency(int latency) 31 | { 32 | writeIndex = latency; 33 | } 34 | 35 | float process(float insample, int channel, int numSamples) 36 | { 37 | if (state) 38 | { 39 | float output = delayBuffer.getSample(channel, readIndex); 40 | readIndex = (readIndex + 1) % numSamples; 41 | delayBuffer.setSample(channel, writeIndex, insample); 42 | writeIndex = (writeIndex + 1) % numSamples; 43 | 44 | return output; 45 | } 46 | else 47 | { 48 | return insample; 49 | } 50 | } 51 | 52 | void setState(bool currentState) 53 | { 54 | state = currentState; 55 | } 56 | 57 | juce::AudioBuffer delayBuffer; 58 | 59 | private: 60 | int size = 44100; 61 | int readIndex = 0; 62 | int writeIndex = 0; 63 | int delayTime = 0; 64 | bool state = false; 65 | }; 66 | -------------------------------------------------------------------------------- /Source/DSP/ModulationRouting.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | ModulationRouting.h 5 | Created: 13 Sep 2025 7:56:13am 6 | Author: Yifeng Yu 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include 14 | 15 | //============================================================================== 16 | /** 17 | Describes a single connection from a source (LFO) to a target (Parameter). 18 | This struct is now in its own file to prevent circular dependencies. 19 | */ 20 | struct ModulationRouting 21 | { 22 | int sourceLfoIndex = 0; 23 | juce::String targetParameterID = ""; 24 | 25 | // Depth can be bipolar (-1.0 to 1.0), representing -100% to +100% 26 | float depth = 0.5f; 27 | bool isBipolar = true; 28 | bool isBypassed = false; 29 | 30 | // Helper for saving/loading state 31 | void writeToXml(juce::XmlElement& xml) const 32 | { 33 | xml.setAttribute("source", sourceLfoIndex); 34 | xml.setAttribute("target", targetParameterID); 35 | xml.setAttribute("depth", depth); 36 | xml.setAttribute("bipolar", isBipolar); 37 | xml.setAttribute("bypassed", isBypassed); 38 | } 39 | 40 | static ModulationRouting readFromXml(const juce::XmlElement& xml) 41 | { 42 | return { xml.getIntAttribute("source", 0), 43 | xml.getStringAttribute("target"), 44 | (float) xml.getDoubleAttribute("depth", 0.5), 45 | xml.getBoolAttribute("bipolar", true), 46 | xml.getBoolAttribute("bypassed", false) }; 47 | } 48 | }; 49 | -------------------------------------------------------------------------------- /Source/DSP/LfoEngine.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | LfoEngine.h 5 | Created: 4 Aug 2025 6:15:46pm 6 | Author: Yifeng Yu 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../Utility/Parameters.h" // Make sure LfoWaveform enum is here 14 | #include "LfoData.h" 15 | #include "juce_dsp/juce_dsp.h" 16 | #include 17 | 18 | //============================================================================== 19 | /** 20 | LfoEngine 21 | 22 | Generates an LFO signal from either a built-in shape (Sine, Saw, etc.) 23 | or a user-defined shape, using a high-performance wavetable lookup. 24 | */ 25 | class LfoEngine 26 | { 27 | public: 28 | LfoEngine(); 29 | 30 | void reset(); 31 | void prepare(const juce::dsp::ProcessSpec& spec); 32 | 33 | /** Updates the LFO shape from user-drawn points and curvatures. 34 | This automatically sets the waveform type to User. 35 | */ 36 | void updateShape(const LfoData& shapeData); 37 | 38 | /** Processes one sample of the LFO. Returns a unipolar [0, 1] signal. */ 39 | float process(); 40 | 41 | // Directly sets the LFO's current phase. 42 | void setPhase(float newPhase); 43 | 44 | /** Sets the phase increment per sample, controlling the LFO's speed. */ 45 | void setPhaseDelta(float newPhaseDelta); 46 | 47 | float getPhase() const; 48 | float getLastOutput() const; 49 | 50 | private: 51 | double sampleRate = 44100.0; 52 | float phase = 0.0f; 53 | float phaseDelta = 0.0f; 54 | float lastOutput = 0.0f; 55 | 56 | juce::dsp::LookupTable wavetable; 57 | }; 58 | -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/VUMeter.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | VUMeter.h 5 | Created: 25 Jan 2021 2:55:04pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../../PluginProcessor.h" 14 | 15 | //============================================================================== 16 | /* 17 | */ 18 | class VUMeter : public juce::Component 19 | { 20 | public: 21 | VUMeter(FireAudioProcessor* inProcessor); 22 | ~VUMeter() override; 23 | 24 | void paint(juce::Graphics&) override; 25 | void resized() override; 26 | void setParameters(bool isInput, int bandIndex); 27 | 28 | // Getters for RMS and Peak levels 29 | float getRmsLeftChannelLevel(); 30 | float getRmsRightChannelLevel(); 31 | float getPeakLeftChannelLevel(); 32 | float getPeakRightChannelLevel(); 33 | void updateLevels(const MeterValues& latestValues); 34 | 35 | private: 36 | FireAudioProcessor* mProcessor; 37 | bool mIsInput; 38 | int mBandIndex; 39 | 40 | // RMS values for the dark bars 41 | float mRmsCh0Level; 42 | float mRmsCh1Level; 43 | 44 | // Peak values for the light bars 45 | float mPeakCh0Level; 46 | float mPeakCh1Level; 47 | 48 | // Peak-hold values for the thin lines 49 | float mPeakHoldCh0Level; 50 | float mPeakHoldCh1Level; 51 | 52 | int mPeakHoldDecayCounter; 53 | const int PEAK_HOLD_FRAMES = 60; // How many frames to hold the peak line 54 | 55 | juce::Rectangle leftMeterBounds; 56 | juce::Rectangle rightMeterBounds; 57 | 58 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(VUMeter) 59 | }; -------------------------------------------------------------------------------- /Source/DSP/WidthProcessor.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | WidthProcessor.cpp 5 | Created: 21 Dec 2020 6:05:29pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "WidthProcessor.h" 12 | 13 | WidthProcessor::WidthProcessor() 14 | { 15 | } 16 | 17 | WidthProcessor::~WidthProcessor() 18 | { 19 | } 20 | 21 | void WidthProcessor::process(float* channeldataL, float* channeldataR, float width, float pan, int numSamples) 22 | { 23 | // width 24 | for (int i = 0; i < numSamples; ++i) 25 | { 26 | float mid = (channeldataL[i] + channeldataR[i]) / sqrt(2); // obtain mid-signal from left and right 27 | float sides = (channeldataL[i] - channeldataR[i]) / sqrt(2); // obtain side-signal from left and right 28 | 29 | // amplify mid and side signal seperately: 30 | mid *= 2.0f * (1.0f - width); 31 | sides *= 2.0f * width; 32 | 33 | channeldataL[i] = (mid + sides) / sqrt(2); // obtain left signal from mid and side 34 | channeldataR[i] = (mid - sides) / sqrt(2); // obtain right signal from mid and side 35 | 36 | float panLeftGain = 1.0f; 37 | float panRightGain = 1.0f; 38 | 39 | if (pan > 0.0f) // Panning to the right 40 | { 41 | // As pan goes from 0 to 1, left gain goes from 1 to 0. 42 | panLeftGain = 1.0f - pan; 43 | } 44 | else // Panning to the left (pan is 0 or negative) 45 | { 46 | // As pan goes from 0 to -1, right gain goes from 1 to 0. 47 | panRightGain = 1.0f + pan; 48 | } 49 | 50 | channeldataL[i] *= panLeftGain; 51 | channeldataR[i] *= panRightGain; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/FFTProcessor.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | FFTProcessor.h 5 | Created: 12 Nov 2018 2:16:02pm 6 | Author: lenovo 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | #include "juce_dsp/juce_dsp.h" 13 | 14 | class SpectrumProcessor 15 | { 16 | public: 17 | SpectrumProcessor() : forwardFFT (fftOrder), window (fftSize, juce::dsp::WindowingFunction::hamming) 18 | { 19 | window.fillWindowingTables (fftSize, juce::dsp::WindowingFunction::blackman); 20 | } 21 | 22 | enum 23 | { 24 | fftOrder = 11, 25 | fftSize = 1 << fftOrder, // 2048 26 | numBins = fftSize / 2 // 1024 27 | }; 28 | 29 | float fftData[2 * fftSize] = { 0 }; 30 | bool nextFFTBlockReady = false; 31 | 32 | void pushNextSampleIntoFifo (float sample) noexcept 33 | { 34 | if (fifoIndex == fftSize) 35 | { 36 | if (! nextFFTBlockReady) 37 | { 38 | juce::zeromem (fftData, sizeof (fftData)); 39 | memmove (fftData, fifo, sizeof (fifo)); // memmove is safer, but memcpy is faster 40 | nextFFTBlockReady = true; 41 | } 42 | 43 | fifoIndex = 0; 44 | } 45 | 46 | fifo[fifoIndex++] = sample; 47 | } 48 | 49 | void doProcessing (float* tempFFTData) 50 | { 51 | window.multiplyWithWindowingTable (tempFFTData, fftSize); 52 | forwardFFT.performFrequencyOnlyForwardTransform (tempFFTData); 53 | } 54 | 55 | private: 56 | float fifo[fftSize]; 57 | juce::dsp::FFT forwardFFT; 58 | juce::dsp::WindowingFunction window; 59 | int fifoIndex = 0; 60 | }; 61 | -------------------------------------------------------------------------------- /Source/Panels/ControlPanel/Graph Components/GraphPanel.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | GraphPanel.h 5 | Created: 30 Aug 2021 11:52:16pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../../PluginProcessor.h" 14 | #include "DistortionGraph.h" 15 | #include "Oscilloscope.h" 16 | #include "VUPanel.h" 17 | #include "WidthGraph.h" 18 | 19 | //============================================================================== 20 | /* 21 | */ 22 | class GraphTemplate; 23 | 24 | class GraphPanel : public juce::Component 25 | { 26 | public: 27 | enum class LayoutMode 28 | { 29 | Band, 30 | Global 31 | }; 32 | 33 | GraphPanel(FireAudioProcessor&); 34 | ~GraphPanel() override; 35 | 36 | void paint(juce::Graphics&) override; 37 | void resized() override; 38 | void setFocusBandNum(int num); 39 | 40 | void setLayoutMode(LayoutMode newMode); 41 | void toggleZoom(GraphTemplate* viewToToggle); 42 | 43 | Oscilloscope* getOscilloscope(); 44 | VUPanel* getVuPanel(); 45 | DistortionGraph* getDistortionGraph(); 46 | WidthGraph* getWidthGraph(); 47 | 48 | private: 49 | FireAudioProcessor& processor; 50 | 51 | // Oscilloscope 52 | Oscilloscope oscilloscope { processor }; 53 | 54 | // VU Meters 55 | VUPanel vuPanel { processor }; 56 | 57 | // Distortion Graph 58 | DistortionGraph distortionGraph { processor }; 59 | 60 | // Width Graph 61 | WidthGraph widthGraph { processor }; 62 | 63 | LayoutMode currentLayoutMode = LayoutMode::Band; 64 | GraphTemplate* zoomedView = nullptr; 65 | 66 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(GraphPanel) 67 | }; 68 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/tests/member_disabled.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | //============================================================================== 4 | class DummyApp : public juce::JUCEApplication 5 | { 6 | public: 7 | void initialise (const juce::String&) override 8 | { 9 | mainWindow.reset (new MainWindow (getApplicationName())); 10 | // on CI, we start this as a background process 11 | juce::Process::makeForegroundProcess(); 12 | mainWindow->toFront(true); 13 | } 14 | 15 | void shutdown() override 16 | { 17 | mainWindow = nullptr; 18 | } 19 | 20 | const juce::String getApplicationName() override { return "dummy"; } 21 | const juce::String getApplicationVersion() override { return "v1"; } 22 | bool moreThanOneInstanceAllowed() override { return true; } 23 | void systemRequestedQuit() override { quit(); } 24 | 25 | void anotherInstanceStarted (const juce::String&) override {} 26 | 27 | class MainWindow : public juce::DocumentWindow 28 | { 29 | public: 30 | MainWindow (juce::String name) : DocumentWindow (name, 31 | juce::Colours::lightgrey, 32 | DocumentWindow::allButtons) 33 | { 34 | centreWithSize (300, 200); 35 | setVisible (true); 36 | inspector.setVisible(true); 37 | } 38 | 39 | void closeButtonPressed() override 40 | { 41 | juce::JUCEApplication::getInstance()->systemRequestedQuit(); 42 | } 43 | 44 | private: 45 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) 46 | melatonin::Inspector inspector { *this, false }; 47 | }; 48 | 49 | private: 50 | std::unique_ptr mainWindow; 51 | }; 52 | 53 | START_JUCE_APPLICATION (DummyApp) 54 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/tests/member_enabled.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | //============================================================================== 4 | class DummyApp : public juce::JUCEApplication 5 | { 6 | public: 7 | void initialise (const juce::String&) override 8 | { 9 | mainWindow.reset (new MainWindow (getApplicationName())); 10 | // on CI, we start this as a background process 11 | juce::Process::makeForegroundProcess(); 12 | mainWindow->toFront(true); 13 | } 14 | 15 | void shutdown() override 16 | { 17 | mainWindow = nullptr; 18 | } 19 | 20 | const juce::String getApplicationName() override { return "dummy"; } 21 | const juce::String getApplicationVersion() override { return "v1"; } 22 | bool moreThanOneInstanceAllowed() override { return true; } 23 | void systemRequestedQuit() override { quit(); } 24 | 25 | void anotherInstanceStarted (const juce::String&) override {} 26 | 27 | class MainWindow : public juce::DocumentWindow 28 | { 29 | public: 30 | MainWindow (juce::String name) : DocumentWindow (name, 31 | juce::Colours::lightgrey, 32 | DocumentWindow::allButtons) 33 | { 34 | centreWithSize (300, 200); 35 | setVisible (true); 36 | inspector.setVisible(true); 37 | } 38 | 39 | void closeButtonPressed() override 40 | { 41 | juce::JUCEApplication::getInstance()->systemRequestedQuit(); 42 | } 43 | 44 | private: 45 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) 46 | melatonin::Inspector inspector { *this, true }; 47 | 48 | }; 49 | 50 | private: 51 | std::unique_ptr mainWindow; 52 | }; 53 | 54 | START_JUCE_APPLICATION (DummyApp) 55 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/VerticalLine.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | VerticalLine.h 5 | Created: 25 Oct 2020 7:54:46am 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "juce_gui_basics/juce_gui_basics.h" 14 | #include "../../GUI/LookAndFeel.h" 15 | 16 | //============================================================================== 17 | /* 18 | */ 19 | class VerticalLine : public juce::Slider 20 | { 21 | public: 22 | VerticalLine(); 23 | ~VerticalLine() override; 24 | 25 | void paint (juce::Graphics&) override; 26 | void resized() override; 27 | 28 | bool getState(); 29 | void setState (bool state); 30 | void setDeleteState (bool deleteState); 31 | void setXPercent (float x); 32 | float getXPercent(); 33 | void setIndex (int index); 34 | int getIndex(); 35 | int getLeft(); 36 | int getRight(); 37 | void moveToX (int lineNum, float newXPercent, float margin, std::unique_ptr verticalLines[]); 38 | 39 | private: 40 | bool isEntered = false; 41 | 42 | void mouseUp (const juce::MouseEvent& e) override; 43 | void mouseEnter (const juce::MouseEvent& e) override; 44 | void mouseExit (const juce::MouseEvent& e) override; 45 | void mouseDown (const juce::MouseEvent& e) override; 46 | void mouseDoubleClick (const juce::MouseEvent& e) override; 47 | void mouseDrag (const juce::MouseEvent& e) override; 48 | 49 | bool mDeleteState = false; 50 | float xPercent = 0.0f; 51 | int leftIndex = -1; // left index 52 | int rightIndex = -1; // right index 53 | int index = -1; 54 | 55 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VerticalLine) 56 | }; 57 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/tests/unique_ptr_enabled.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | //============================================================================== 4 | class DummyApp : public juce::JUCEApplication 5 | { 6 | public: 7 | void initialise (const juce::String&) override 8 | { 9 | mainWindow.reset (new MainWindow (getApplicationName())); 10 | inspector = std::make_unique (*mainWindow); 11 | inspector->setVisible (true); 12 | 13 | // on CI, we start this as a background process 14 | juce::Process::makeForegroundProcess(); 15 | mainWindow->toFront(true); 16 | } 17 | 18 | void shutdown() override 19 | { 20 | mainWindow = nullptr; 21 | } 22 | 23 | const juce::String getApplicationName() override { return "dummy"; } 24 | const juce::String getApplicationVersion() override { return "v1"; } 25 | bool moreThanOneInstanceAllowed() override { return true; } 26 | void systemRequestedQuit() override { quit(); } 27 | 28 | void anotherInstanceStarted (const juce::String&) override {} 29 | 30 | class MainWindow : public juce::DocumentWindow 31 | { 32 | public: 33 | MainWindow (juce::String name) : DocumentWindow (name, 34 | juce::Colours::lightgrey, 35 | DocumentWindow::allButtons) 36 | { 37 | centreWithSize (300, 200); 38 | setVisible (true); 39 | } 40 | 41 | void closeButtonPressed() override 42 | { 43 | juce::JUCEApplication::getInstance()->systemRequestedQuit(); 44 | } 45 | 46 | private: 47 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) 48 | }; 49 | 50 | private: 51 | std::unique_ptr mainWindow; 52 | std::unique_ptr inspector; 53 | }; 54 | 55 | START_JUCE_APPLICATION (DummyApp) 56 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/tests/unique_ptr_disabled.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | //============================================================================== 4 | class DummyApp : public juce::JUCEApplication 5 | { 6 | public: 7 | void initialise (const juce::String&) override 8 | { 9 | mainWindow.reset (new MainWindow (getApplicationName())); 10 | inspector = std::make_unique (*mainWindow, false); 11 | inspector->setVisible (true); 12 | 13 | // on CI, we start this as a background process 14 | juce::Process::makeForegroundProcess(); 15 | mainWindow->toFront(true); 16 | } 17 | 18 | void shutdown() override 19 | { 20 | mainWindow = nullptr; 21 | } 22 | 23 | const juce::String getApplicationName() override { return "dummy"; } 24 | const juce::String getApplicationVersion() override { return "v1"; } 25 | bool moreThanOneInstanceAllowed() override { return true; } 26 | void systemRequestedQuit() override { quit(); } 27 | 28 | void anotherInstanceStarted (const juce::String&) override {} 29 | 30 | class MainWindow : public juce::DocumentWindow 31 | { 32 | public: 33 | MainWindow (juce::String name) : DocumentWindow (name, 34 | juce::Colours::lightgrey, 35 | DocumentWindow::allButtons) 36 | { 37 | centreWithSize (300, 200); 38 | setVisible (true); 39 | } 40 | 41 | void closeButtonPressed() override 42 | { 43 | juce::JUCEApplication::getInstance()->systemRequestedQuit(); 44 | } 45 | 46 | private: 47 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow) 48 | }; 49 | 50 | private: 51 | std::unique_ptr mainWindow; 52 | std::unique_ptr inspector; 53 | }; 54 | 55 | START_JUCE_APPLICATION (DummyApp) 56 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/DraggableButton.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | DraggableButton.cpp 5 | Created: 7 Oct 2021 11:42:21pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #include "DraggableButton.h" 12 | 13 | //============================================================================== 14 | DraggableButton::DraggableButton() 15 | { 16 | } 17 | 18 | DraggableButton::~DraggableButton() 19 | { 20 | } 21 | 22 | void DraggableButton::paint(juce::Graphics& g) 23 | { 24 | g.setColour(getColour().darker().darker()); 25 | g.fillEllipse(0, 0, getWidth(), getHeight()); 26 | 27 | g.setColour(getColour()); 28 | g.fillEllipse(getWidth() / 5.0f, getHeight() / 5.0f, getWidth() / 5.0f * 3, getHeight() / 5.0f * 3); 29 | } 30 | 31 | void DraggableButton::resized() 32 | { 33 | } 34 | 35 | void DraggableButton::mouseEnter(const juce::MouseEvent& e) 36 | { 37 | isEntered = true; 38 | } 39 | 40 | void DraggableButton::mouseExit(const juce::MouseEvent& e) 41 | { 42 | isEntered = false; 43 | } 44 | 45 | juce::Colour DraggableButton::getColour() 46 | { 47 | if (mState && isEntered) 48 | return juce::Colours::hotpink.brighter(); 49 | else if (mState && ! isEntered) 50 | return juce::Colours::hotpink; 51 | 52 | return juce::Colours::dimgrey; 53 | } 54 | 55 | void DraggableButton::setState(const bool state) 56 | { 57 | mState = state; 58 | } 59 | 60 | void DraggableButton::mouseWheelMove(const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) 61 | { 62 | if (onQValueChanged) 63 | { 64 | // The wheel.deltaY value can be used to control the Q value. 65 | // A positive value means scrolling up, and a negative value means scrolling down. 66 | // You can adjust the sensitivity by multiplying by a factor. 67 | onQValueChanged(wheel.deltaY); 68 | } 69 | } -------------------------------------------------------------------------------- /modules/melatonin_inspector/update_juce_colours.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require 'find' 4 | require 'fileutils' 5 | 6 | path = '../../JUCE/modules/juce_gui_basics/' 7 | output_path = 'melatonin/helpers/colour_ids.h' 8 | FileUtils.mkdir_p('melatonin/helpers') 9 | output_file = File.open(output_path, 'w') 10 | 11 | script_name = File.basename($0) 12 | current_date = Time.now.strftime("%Y-%m-%d") 13 | 14 | output_file.write("// Generated by #{script_name} on #{current_date}\n") 15 | output_file.write("// This file collects ColourIds from the JUCE GUI module by parsing the C++ files.\n") 16 | output_file.write("#pragma once\n") 17 | output_file.write("#include \n\n") 18 | output_file.write("namespace melatonin::colors\n{\n\n") 19 | 20 | output_file.write(" struct ColourIdMapping\n {\n int value;\n const char* name;\n };\n\n") 21 | 22 | output_file.write(" constexpr ColourIdMapping colourIdNames[] =\n {\n") 23 | 24 | Find.find(path) do |file| 25 | if File.file?(file) 26 | inside_enum = false 27 | file_name = File.basename(file) 28 | File.readlines(file).each_with_index do |line, line_number| 29 | if line.include?('enum ColourIds') 30 | inside_enum = true 31 | elsif inside_enum && line.strip.start_with?('}') 32 | inside_enum = false 33 | elsif inside_enum && line.include?('=') 34 | name, rest = line.strip.split('=') 35 | value, comment_part = rest.split(' ', 2) 36 | value.strip! 37 | value.chomp!(',') # Remove trailing comma if present 38 | comment = comment_part.to_s.split('*/').first.to_s.gsub('/**< ', '').strip 39 | cpp_map = " { #{value}, \"#{name.strip}\" }, // #{file_name}:#{line_number + 1} #{comment}\n" 40 | output_file.write(cpp_map) 41 | end 42 | end 43 | end 44 | end 45 | 46 | output_file.write(" };\n\n} // namespace melatonin::colors\n") 47 | output_file.close 48 | 49 | puts "File written to #{output_path}" 50 | -------------------------------------------------------------------------------- /Source/Utility/VersionInfo.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | This file is part of the JUCE library. 5 | Copyright (c) 2020 - Raw Material Software Limited 6 | 7 | JUCE is an open source library subject to commercial or open-source 8 | licensing. 9 | 10 | By using JUCE, you agree to the terms of both the JUCE 6 End-User License 11 | Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). 12 | 13 | End User License Agreement: www.juce.com/juce-6-licence 14 | Privacy Policy: www.juce.com/juce-privacy-policy 15 | 16 | Or: You may also use this code under the terms of the GPL v3 (see 17 | www.gnu.org/licenses). 18 | 19 | JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER 20 | EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE 21 | DISCLAIMED. 22 | 23 | ============================================================================== 24 | */ 25 | 26 | #pragma once 27 | #include "juce_core/juce_core.h" 28 | #include "../GUI/InterfaceDefines.h" 29 | 30 | //============================================================================== 31 | class VersionInfo 32 | { 33 | public: 34 | struct Asset 35 | { 36 | const juce::String name; 37 | const juce::String url; 38 | }; 39 | 40 | static std::unique_ptr fetchFromUpdateServer (const juce::String& versionString); 41 | static std::unique_ptr fetchLatestFromUpdateServer(); 42 | static std::unique_ptr createInputStreamForAsset (const Asset& asset, int& statusCode); 43 | 44 | bool isNewerVersionThanCurrent(); 45 | 46 | const juce::String versionString; 47 | const juce::String releaseNotes; 48 | const std::vector assets; 49 | 50 | private: 51 | VersionInfo (juce::String version, juce::String releaseNotes, std::vector assets); 52 | 53 | static std::unique_ptr fetch (const juce::String&); 54 | }; 55 | -------------------------------------------------------------------------------- /tests/Presets/init.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/init_mix0.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/max_drive.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/init_no_safe.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/max_drive_hq.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/bias0.18.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/half_drive_safe.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/init_no_safe_hq.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/init_not_enable.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/max_drive_safe.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/half_drive_no_safe.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/bias0.18rec0.5.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/half_drive_no_safe_hq.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/melatonin/components/accesibility.h: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | #include "melatonin_inspector/melatonin/component_model.h" 4 | 5 | namespace melatonin 6 | { 7 | class Accessibility : public juce::Component, private ComponentModel::Listener 8 | { 9 | public: 10 | explicit Accessibility (ComponentModel& m) : model (m) 11 | { 12 | addAndMakeVisible (&panel); 13 | model.addListener (*this); 14 | } 15 | 16 | ~Accessibility() override 17 | { 18 | model.removeListener (*this); 19 | } 20 | 21 | void updateProperties() 22 | { 23 | panel.clear(); 24 | 25 | if (!model.getSelectedComponent()) 26 | return; 27 | 28 | auto& ad = model.accessiblityDetail; 29 | auto aprops = juce::Array { 30 | new juce::TextPropertyComponent (ad.title, "Title", 200, false, false), 31 | new juce::TextPropertyComponent (ad.value, "Value", 200, false, false), 32 | new juce::TextPropertyComponent (ad.role, "Role", 200, false, false), 33 | new juce::TextPropertyComponent (ad.handlerType, "Handler", 200, false, false), 34 | }; 35 | for (auto* p : aprops) 36 | { 37 | p->setLookAndFeel (&getLookAndFeel()); 38 | } 39 | panel.addProperties (aprops, 0); 40 | resized(); 41 | } 42 | 43 | protected: 44 | ComponentModel& model; 45 | 46 | void componentModelChanged (ComponentModel&) override 47 | { 48 | updateProperties(); 49 | } 50 | 51 | void resized() override 52 | { 53 | TRACE_COMPONENT(); 54 | // let the property panel know what total height we need to be 55 | panel.setBounds (getLocalBounds().withTrimmedTop (padding)); 56 | } 57 | 58 | int padding { 3 }; 59 | 60 | juce::PropertyPanel panel { "Accessibility" }; 61 | }; 62 | } 63 | -------------------------------------------------------------------------------- /tests/Presets/bug preset.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/2bands_nosafe.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/half_drive_no_safe_extreme.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/2bands_mixtype3.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/test_downsample.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/half_drive_no_safe_comp.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/half_drive_no_safe_width.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/2bands_mixtype4.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "clang-format.fallbackStyle": "LLVM", 3 | "files.associations": { 4 | "*.mm": "cpp", 5 | "iostream": "cpp", 6 | "array": "cpp", 7 | "vector": "cpp", 8 | "queue": "cpp", 9 | "stack": "cpp", 10 | "__bit_reference": "cpp", 11 | "__hash_table": "cpp", 12 | "__locale": "cpp", 13 | "__node_handle": "cpp", 14 | "__split_buffer": "cpp", 15 | "__tree": "cpp", 16 | "__verbose_abort": "cpp", 17 | "bitset": "cpp", 18 | "cctype": "cpp", 19 | "charconv": "cpp", 20 | "clocale": "cpp", 21 | "cmath": "cpp", 22 | "codecvt": "cpp", 23 | "complex": "cpp", 24 | "condition_variable": "cpp", 25 | "csignal": "cpp", 26 | "cstdarg": "cpp", 27 | "cstdint": "cpp", 28 | "cstdio": "cpp", 29 | "cstdlib": "cpp", 30 | "cstring": "cpp", 31 | "ctime": "cpp", 32 | "cwchar": "cpp", 33 | "cwctype": "cpp", 34 | "deque": "cpp", 35 | "execution": "cpp", 36 | "memory": "cpp", 37 | "forward_list": "cpp", 38 | "fstream": "cpp", 39 | "future": "cpp", 40 | "initializer_list": "cpp", 41 | "iomanip": "cpp", 42 | "ios": "cpp", 43 | "iosfwd": "cpp", 44 | "istream": "cpp", 45 | "limits": "cpp", 46 | "list": "cpp", 47 | "locale": "cpp", 48 | "map": "cpp", 49 | "mutex": "cpp", 50 | "new": "cpp", 51 | "optional": "cpp", 52 | "print": "cpp", 53 | "ratio": "cpp", 54 | "regex": "cpp", 55 | "set": "cpp", 56 | "shared_mutex": "cpp", 57 | "sstream": "cpp", 58 | "stdexcept": "cpp", 59 | "streambuf": "cpp", 60 | "string": "cpp", 61 | "string_view": "cpp", 62 | "typeindex": "cpp", 63 | "typeinfo": "cpp", 64 | "unordered_map": "cpp", 65 | "unordered_set": "cpp", 66 | "variant": "cpp", 67 | "algorithm": "cpp", 68 | "cstddef": "cpp" 69 | } 70 | } -------------------------------------------------------------------------------- /tests/Presets/two_bands.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/3bands_nosafe.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/4bands_nosafe.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/2bands_hq.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/test.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | -------------------------------------------------------------------------------- /tests/Presets/2bands_mixtype1.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/2bands_hq_mixtype1.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/2bands_hq_mixtype2.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/melatonin/components/inspector_image_button.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../helpers/misc.h" 3 | #include 4 | 5 | namespace melatonin 6 | { 7 | class InspectorImageButton : public juce::Component 8 | { 9 | public: 10 | bool on = false; 11 | std::function onClick; 12 | std::function onDoubleClick; 13 | 14 | explicit InspectorImageButton (const juce::String& filename, juce::Point o = { 0, 0 }, bool toggleable = false) : offset (o) 15 | { 16 | setInterceptsMouseClicks (true, false); 17 | setName (filename); 18 | if (!toggleable) 19 | imageOn = getIcon (filename); 20 | else 21 | { 22 | // this is by convention 23 | // the filenames should look like: icon-on.png / icon-off.png 24 | imageOn = getIcon (filename + "on"); 25 | imageOff = getIcon (filename + "off"); 26 | } 27 | } 28 | 29 | void paint (juce::Graphics& g) override 30 | { 31 | // Assumes exported at 2x 32 | if (on || imageOff.isNull()) 33 | g.drawImageTransformed (imageOn, juce::AffineTransform::scale (0.5f).translated (offset).translated ((float) offset.getX(), (float) offset.getY())); 34 | else 35 | g.drawImageTransformed (imageOff, juce::AffineTransform::scale (0.5f).translated (offset).translated ((float) offset.getX(), (float) offset.getY())); 36 | } 37 | 38 | void mouseDown (const juce::MouseEvent& /*event*/) override 39 | { 40 | on = !on; 41 | if (onClick != nullptr) 42 | onClick(); 43 | repaint(); 44 | } 45 | 46 | void mouseDoubleClick (const juce::MouseEvent& /*event*/) override 47 | { 48 | if (onDoubleClick != nullptr) 49 | onDoubleClick(); 50 | } 51 | 52 | private: 53 | juce::Image imageOn; 54 | juce::Image imageOff; 55 | juce::Point offset; 56 | }; 57 | } 58 | -------------------------------------------------------------------------------- /tests/Presets/wings test.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /tests/Presets/half_drive_no_safe_global_filter.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/melatonin/components/tree_component.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "component_tree_view_item.h" 4 | #include "melatonin_inspector/melatonin/component_model.h" 5 | 6 | namespace melatonin 7 | { 8 | class TreeComponent : public juce::Component, private ComponentModel::Listener, private juce::FocusChangeListener 9 | { 10 | public: 11 | 12 | TreeComponent (ComponentModel& _model): model(_model) 13 | { 14 | juce::Desktop::getInstance ().addFocusListener (this); 15 | model.addListener (*this); 16 | } 17 | 18 | ~TreeComponent() override 19 | { 20 | juce::Desktop::getInstance ().removeFocusListener (this); 21 | model.removeListener (*this); 22 | } 23 | 24 | void globalFocusChanged (juce::Component*) override 25 | { 26 | repaint(); 27 | } 28 | 29 | void resized() override 30 | { 31 | auto area = getLocalBounds(); 32 | 33 | //using btn toggle state (better to switch to using class variable 34 | //or inspectors prop) 35 | 36 | if (tree.isVisible()) 37 | { 38 | auto searchRow = area.removeFromTop (30).reduced (4, 4); 39 | clearBtn.setBounds (searchRow.removeFromRight (56)); 40 | searchRow.removeFromRight (8); 41 | searchBox.setBounds (searchRow); 42 | 43 | tree.setBounds (area); // padding in these default components are a mess 44 | emptySearchLabel.setBounds (area.reduced (4)); 45 | } 46 | else 47 | emptySelectionPrompt.setBounds (area); 48 | } 49 | 50 | private: 51 | ComponentModel& model; 52 | 53 | juce::TreeView tree; 54 | juce::Label emptySelectionPrompt { "SelectionPrompt", "Select any component to see components tree" }; 55 | juce::Label emptySearchLabel { "EmptySearchResultsPrompt", "No component found" }; 56 | juce::TextEditor searchBox { "Search box" }; 57 | juce::TextButton clearBtn { "clear" }; 58 | std::unique_ptr rootItem; 59 | 60 | }; 61 | } 62 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/LatestCompiledAssets/BinaryData18.cpp: -------------------------------------------------------------------------------- 1 | /* ==================================== JUCER_BINARY_RESOURCE ==================================== 2 | 3 | This is an auto-generated file: Any edits you make may be overwritten! 4 | 5 | */ 6 | 7 | #include 8 | 9 | namespace InspectorBinaryData 10 | { 11 | 12 | //================== tab-on.png ================== 13 | static const unsigned char temp_binary_data_17[] = 14 | { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,48,0,0,0,48,8,6,0,0,0,87,2,249,135,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,37,1,73,82,36,240,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,1,140,73,68,65,84,120, 15 | 1,237,216,79,78,194,64,20,6,240,239,53,192,154,45,10,9,222,160,220,64,111,224,17,240,6,237,162,18,119,176,84,76,208,19,128,55,208,19,232,13,228,8,44,4,150,118,229,66,106,159,111,192,16,241,79,226,164,117,202,132,249,45,128,161,155,247,165,111,218,153, 16 | 1,28,199,113,28,199,41,14,169,15,158,15,154,224,100,8,134,47,163,42,182,29,225,22,84,14,169,22,78,104,89,124,154,60,90,81,248,166,24,94,185,85,66,186,24,200,192,182,226,149,170,234,26,79,126,28,195,86,204,126,233,235,127,180,127,74,216,98,60,189,224, 17 | 79,195,170,7,203,185,0,69,43,193,0,126,58,15,176,168,140,232,32,140,191,93,219,236,105,237,57,104,234,14,248,168,44,238,241,15,76,182,144,207,211,203,33,114,102,120,14,164,237,188,67,104,207,1,158,245,245,91,97,181,198,250,24,72,136,89,63,166,189,40, 18 | 68,14,244,39,49,243,33,178,98,14,120,46,33,106,81,15,25,25,121,10,253,40,229,174,132,80,223,200,162,216,247,64,146,102,94,182,20,23,32,229,30,53,58,93,100,164,223,66,68,15,208,198,178,97,66,115,61,76,113,157,71,241,138,118,0,121,122,28,65,147,188,137, 19 | 71,18,188,185,26,208,13,53,162,0,57,49,219,66,170,248,122,212,70,142,76,6,24,231,93,188,98,42,192,24,175,47,218,173,247,23,70,222,3,84,239,92,253,122,45,227,14,208,109,104,138,102,125,0,226,105,255,217,194,67,173,53,79,142,233,198,176,215,157,4,72,78, 20 | 228,70,196,176,142,212,236,189,5,30,213,206,38,240,146,214,242,192,212,10,82,184,90,143,73,205,203,218,29,199,113,156,157,246,14,130,136,121,153,169,217,8,58,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; 21 | 22 | const char* tabon_png = (const char*) temp_binary_data_17; 23 | } 24 | -------------------------------------------------------------------------------- /JuceLibraryCode/JuceHeader.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | IMPORTANT! This file is auto-generated each time you save your 4 | project - if you alter its contents, your changes may be overwritten! 5 | 6 | This is the header file that your files should include in order to get all the 7 | JUCE library headers. You should avoid including the JUCE headers directly in 8 | your own source files, because that wouldn't pick up the correct configuration 9 | options for your app. 10 | 11 | */ 12 | 13 | #pragma once 14 | 15 | 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | #include "BinaryData.h" 33 | 34 | #if defined (JUCE_PROJUCER_VERSION) && JUCE_PROJUCER_VERSION < JUCE_VERSION 35 | /** If you've hit this error then the version of the Projucer that was used to generate this project is 36 | older than the version of the JUCE modules being included. To fix this error, re-save your project 37 | using the latest version of the Projucer or, if you aren't using the Projucer to manage your project, 38 | remove the JUCE_PROJUCER_VERSION define. 39 | */ 40 | #error "This project was last saved using an outdated version of the Projucer! Re-save this project with the latest version to fix this error." 41 | #endif 42 | 43 | 44 | #if ! JUCE_DONT_DECLARE_PROJECTINFO 45 | namespace ProjectInfo 46 | { 47 | const char* const projectName = "Fire"; 48 | const char* const companyName = "Blue Wings Music"; 49 | const char* const versionString = "1.5.0"; 50 | const int versionNumber = 0x10500; 51 | } 52 | #endif 53 | -------------------------------------------------------------------------------- /packaging/installer.iss: -------------------------------------------------------------------------------- 1 | #define Version Trim(FileRead(FileOpen("..\VERSION"))) 2 | #define ProjectName GetEnv('PROJECT_NAME') 3 | #define ProductName GetEnv('PRODUCT_NAME') 4 | #define Publisher GetEnv('COMPANY_NAME') 5 | #define Year GetDateTimeString("yyyy","","") 6 | 7 | ; 'Types': What get displayed during the setup 8 | [Types] 9 | Name: "full"; Description: "Full installation" 10 | Name: "custom"; Description: "Custom installation"; Flags: iscustom 11 | 12 | ; Components are used inside the script and can be composed of a set of 'Types' 13 | [Components] 14 | Name: "standalone"; Description: "Standalone application"; Types: full custom 15 | Name: "vst3"; Description: "VST3 plugin"; Types: full custom 16 | 17 | [Setup] 18 | ArchitecturesInstallIn64BitMode=x64 19 | ArchitecturesAllowed=x64 20 | AppName={#ProductName} 21 | OutputBaseFilename={#ProductName}-{#Version}-Windows 22 | AppCopyright=Copyright (C) {#Year} {#Publisher} 23 | AppPublisher={#Publisher} 24 | AppVersion={#Version} 25 | DefaultDirName="{commoncf64}\VST3\{#ProductName}.vst3" 26 | DisableDirPage=yes 27 | 28 | ; MAKE SURE YOU READ THE FOLLOWING! 29 | LicenseFile="EULA" 30 | UninstallFilesDir="{commonappdata}\{#ProductName}\uninstall" 31 | 32 | [UninstallDelete] 33 | Type: filesandordirs; Name: "{commoncf64}\VST3\{#ProductName}Data" 34 | 35 | ; MSVC adds a .ilk when building the plugin. Let's not include that. 36 | [Files] 37 | Source: "..\Builds\{#ProjectName}_artefacts\Release\VST3\{#ProductName}.vst3\*"; DestDir: "{commoncf64}\VST3\{#ProductName}.vst3\"; Excludes: *.ilk; Flags: ignoreversion recursesubdirs; Components: vst3 38 | Source: "..\Builds\{#ProjectName}_artefacts\Release\Standalone\{#ProductName}.exe"; DestDir: "{commonpf64}\{#Publisher}\{#ProductName}"; Flags: ignoreversion; Components: standalone 39 | 40 | [Icons] 41 | Name: "{autoprograms}\{#ProductName}"; Filename: "{commonpf64}\{#Publisher}\{#ProductName}\{#ProductName}.exe"; Components: standalone 42 | Name: "{autoprograms}\Uninstall {#ProductName}"; Filename: "{uninstallexe}" 43 | 44 | [Run] 45 | Filename: "{cmd}"; \ 46 | WorkingDir: "{commoncf64}\VST3"; \ 47 | Parameters: "/C mklink /D ""{commoncf64}\VST3\{#ProductName}Data"" ""{commonappdata}\{#ProductName}"""; \ 48 | Flags: runascurrentuser; Components: vst3 49 | -------------------------------------------------------------------------------- /modules/melatonin_inspector/LatestCompiledAssets/BinaryData17.cpp: -------------------------------------------------------------------------------- 1 | /* ==================================== JUCER_BINARY_RESOURCE ==================================== 2 | 3 | This is an auto-generated file: Any edits you make may be overwritten! 4 | 5 | */ 6 | 7 | #include 8 | 9 | namespace InspectorBinaryData 10 | { 11 | 12 | //================== tab-off.png ================== 13 | static const unsigned char temp_binary_data_16[] = 14 | { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,48,0,0,0,48,8,6,0,0,0,87,2,249,135,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,37,1,73,82,36,240,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,1,168,73,68,65,84,120, 15 | 1,237,216,63,75,195,64,24,6,240,231,174,197,185,56,232,170,238,130,126,131,254,25,220,138,171,163,159,160,77,161,70,113,150,182,86,72,179,11,142,93,107,247,54,245,19,40,184,171,223,192,44,157,66,243,122,87,84,74,208,33,228,188,244,240,126,67,201,53,16, 16 | 222,135,188,119,92,14,176,44,203,178,44,43,63,76,254,156,123,193,14,129,238,8,56,16,195,18,214,28,3,141,24,184,211,117,42,111,76,22,31,131,30,97,64,225,9,33,7,59,228,49,224,193,188,226,165,146,236,26,14,208,49,12,37,91,190,152,252,243,218,169,50,172, 17 | 177,51,111,74,43,195,18,135,225,108,128,188,21,161,193,197,96,90,143,162,104,114,211,62,154,39,239,185,94,48,94,29,247,156,74,29,41,104,121,3,49,43,236,22,138,27,87,248,3,58,91,104,207,245,131,6,20,211,59,7,98,212,84,135,72,61,7,220,193,44,125,43,80, 18 | 188,247,125,45,66,180,253,96,222,111,84,110,161,64,250,73,76,180,143,140,196,254,165,222,246,102,243,190,83,30,34,35,45,171,208,79,56,232,68,132,192,114,67,144,233,57,57,42,96,129,172,114,11,192,16,15,187,78,77,127,11,113,198,158,145,18,49,108,81,76, 19 | 219,95,99,81,252,88,69,241,82,234,0,157,102,249,18,41,185,254,131,88,58,63,3,16,38,221,86,77,201,10,36,233,109,33,81,124,175,85,241,161,144,190,85,136,227,165,215,80,91,188,164,37,0,167,197,107,180,25,41,107,155,85,90,2,116,154,213,241,111,247,210,238, 20 | 62,147,236,7,77,222,140,15,192,196,87,254,59,204,60,23,90,226,226,12,229,9,134,18,181,223,139,0,236,84,92,135,48,79,40,106,111,114,121,64,42,207,24,193,104,4,51,132,140,97,38,107,150,181,195,178,44,203,250,215,62,0,55,170,120,209,82,24,187,200,0,0,0, 21 | 0,73,69,78,68,174,66,96,130,0,0 }; 22 | 23 | const char* taboff_png = (const char*) temp_binary_data_16; 24 | } 25 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/FreqDividerGroup.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | FreqDividerGroup.h 5 | Created: 4 Sep 2021 1:14:37pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "FreqTextLabel.h" 14 | #include "VerticalLine.h" 15 | #include "../../PluginProcessor.h" 16 | //============================================================================== 17 | /* 18 | */ 19 | class FreqDividerGroup : public juce::ToggleButton, juce::Slider::Listener, juce::Button::Listener 20 | { 21 | public: 22 | FreqDividerGroup (FireAudioProcessor&, int index); 23 | ~FreqDividerGroup() override; 24 | 25 | void paint (juce::Graphics&) override; 26 | void resized() override; 27 | 28 | void moveToX (int lineNum, float newXPercent, float margin, std::unique_ptr freqDividerGroup[]); 29 | 30 | void setDeleteState (bool deleteState); 31 | 32 | VerticalLine& getVerticalLine(); 33 | 34 | void setFreq (float f); 35 | int getFreq (); 36 | 37 | void clicked(const juce::ModifierKeys& modifiers) override; 38 | 39 | private: 40 | FireAudioProcessor& processor; 41 | VerticalLine verticalLine; 42 | float margin = 7.5f; 43 | float size = 15.0f; 44 | float width = 5.0f; 45 | juce::String lineStatelId = ""; 46 | juce::String sliderFreqId = ""; 47 | 48 | void mouseUp (const juce::MouseEvent& e) override; 49 | void mouseEnter (const juce::MouseEvent& e) override; 50 | void mouseExit (const juce::MouseEvent& e) override; 51 | void mouseDown (const juce::MouseEvent& e) override; 52 | void mouseDrag (const juce::MouseEvent& e) override; 53 | 54 | void mouseDoubleClick (const juce::MouseEvent& e) override; 55 | void sliderValueChanged (juce::Slider* slider) override; 56 | void buttonClicked (juce::Button* button) override; 57 | 58 | std::unique_ptr multiFreqAttachment; 59 | 60 | FreqTextLabel freqTextLabel; 61 | 62 | // juce::ComponentDragger dragger; 63 | // juce::ComponentBoundsConstrainer boundsConstrainer; 64 | 65 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FreqDividerGroup) 66 | }; 67 | -------------------------------------------------------------------------------- /tests/Presets/test2.fire: -------------------------------------------------------------------------------- 1 | 2 | 3 | 30 | -------------------------------------------------------------------------------- /Source/Panels/SpectrogramPanel/FilterControl.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | 4 | FilterControl.h 5 | Created: 18 Sep 2021 9:54:04pm 6 | Author: 羽翼深蓝Wings 7 | 8 | ============================================================================== 9 | */ 10 | 11 | #pragma once 12 | 13 | #include "../../PluginProcessor.h" 14 | #include "../../Utility/Parameters.h" 15 | #include "../ControlPanel/GlobalPanel.h" 16 | #include "DraggableButton.h" 17 | //============================================================================== 18 | /* 19 | */ 20 | class FilterControl : public juce::Component, 21 | public juce::AudioProcessorParameter::Listener, 22 | public juce::AsyncUpdater, 23 | public juce::Timer, 24 | public juce::ChangeListener 25 | { 26 | public: 27 | FilterControl(FireAudioProcessor&, GlobalPanel&); 28 | ~FilterControl() override; 29 | 30 | void paint(juce::Graphics&) override; 31 | void resized() override; 32 | void timerCallback() override; 33 | void handleAsyncUpdate() override; 34 | void parameterValueChanged(int parameterIndex, float newValue) override; 35 | void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override {} 36 | void changeListenerCallback(juce::ChangeBroadcaster* source) override; 37 | 38 | private: 39 | FireAudioProcessor& processor; 40 | GlobalPanel& globalPanel; 41 | juce::Path responseCurve; 42 | juce::Path lfoResponseCurve; 43 | 44 | using Filter = juce::dsp::IIR::Filter; 45 | using CutFilter = juce::dsp::ProcessorChain; 46 | using MonoChain = juce::dsp::ProcessorChain; 47 | // lowcut, peak, highcut, lowcut Q, highcut Q 48 | MonoChain monoChain; 49 | MonoChain lfoMonoChain; 50 | 51 | void updateResponseCurve(); 52 | void updateChain(); 53 | void setDraggableButtonBounds(); 54 | void updateLfoChain(const ModulatedFilterValues& modulatedValues); 55 | void updateLfoResponseCurve(); 56 | void checkAnimationStatus(); 57 | 58 | bool isAnimationActive = false; 59 | 60 | DraggableButton draggableLowButton, draggablePeakButton, draggableHighButton; 61 | 62 | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(FilterControl) 63 | }; 64 | --------------------------------------------------------------------------------