PresetManager.cpp (14138B)
1 #include "PresetManager.h" 2 #include "../MixGroups/MixGroupsController.h" 3 4 namespace 5 { 6 const String userPresetPath = "ChowdhuryDSP/ChowTape/UserPresets.txt"; 7 } 8 9 PresetManager::PresetManager (AudioProcessorValueTreeState& vts) : chowdsp::PresetManager (vts) 10 { 11 loadFactoryPresets(); 12 setUserPresetConfigFile (userPresetPath); 13 14 #if JUCE_IOS 15 File appDataDir = File::getSpecialLocation (File::userApplicationDataDirectory); 16 auto userPresetFolder = appDataDir.getChildFile (userPresetPath).getSiblingFile ("Presets"); 17 if (! userPresetFolder.isDirectory()) 18 { 19 userPresetFolder.deleteFile(); 20 userPresetFolder.createDirectory(); 21 } 22 23 setUserPresetPath (userPresetFolder); 24 #endif // JUCE_IOS 25 } 26 27 void PresetManager::loadFactoryPresets() 28 { 29 setDefaultPreset (chowdsp::Preset { BinaryData::Default_chowpreset, BinaryData::Default_chowpresetSize }); 30 31 std::vector<chowdsp::Preset> factoryPresets; 32 33 // CHOW 34 factoryPresets.emplace_back (BinaryData::TC260_chowpreset, BinaryData::TC260_chowpresetSize); 35 factoryPresets.emplace_back (BinaryData::LoFi_chowpreset, BinaryData::LoFi_chowpresetSize); 36 factoryPresets.emplace_back (BinaryData::WoozyChorus_chowpreset, BinaryData::WoozyChorus_chowpresetSize); 37 factoryPresets.emplace_back (BinaryData::OldTape_chowpreset, BinaryData::OldTape_chowpresetSize); 38 factoryPresets.emplace_back (BinaryData::Underbiased_chowpreset, BinaryData::Underbiased_chowpresetSize); 39 40 // SINK 41 factoryPresets.emplace_back (BinaryData::SNK_BassPusher_chowpreset, BinaryData::SNK_BassPusher_chowpresetSize); 42 factoryPresets.emplace_back (BinaryData::SNK_Chorus2_chowpreset, BinaryData::SNK_Chorus2_chowpresetSize); 43 factoryPresets.emplace_back (BinaryData::SNK_Chorus3_chowpreset, BinaryData::SNK_Chorus3_chowpresetSize); 44 factoryPresets.emplace_back (BinaryData::SNK_Chorus4_chowpreset, BinaryData::SNK_Chorus4_chowpresetSize); 45 factoryPresets.emplace_back (BinaryData::SNK_CleanFat_chowpreset, BinaryData::SNK_CleanFat_chowpresetSize); 46 factoryPresets.emplace_back (BinaryData::SNK_Fat2_chowpreset, BinaryData::SNK_Fat2_chowpresetSize); 47 factoryPresets.emplace_back (BinaryData::SNK_Gritty_chowpreset, BinaryData::SNK_Gritty_chowpresetSize); 48 factoryPresets.emplace_back (BinaryData::SNK_Gritty2_chowpreset, BinaryData::SNK_Gritty2_chowpresetSize); 49 factoryPresets.emplace_back (BinaryData::SNK_lofi_chowpreset, BinaryData::SNK_lofi_chowpresetSize); 50 factoryPresets.emplace_back (BinaryData::SNK_SlightlyWobbly_chowpreset, BinaryData::SNK_SlightlyWobbly_chowpresetSize); 51 52 // AEIOU 53 factoryPresets.emplace_back (BinaryData::AEIOU_DisintegratedMemories_chowpreset, BinaryData::AEIOU_DisintegratedMemories_chowpresetSize); 54 factoryPresets.emplace_back (BinaryData::AEIOU_FunkThat1987_chowpreset, BinaryData::AEIOU_FunkThat1987_chowpresetSize); 55 factoryPresets.emplace_back (BinaryData::AEIOU_HelloHangover_chowpreset, BinaryData::AEIOU_HelloHangover_chowpresetSize); 56 factoryPresets.emplace_back (BinaryData::AEIOU_IHaveARadio_chowpreset, BinaryData::AEIOU_IHaveARadio_chowpresetSize); 57 factoryPresets.emplace_back (BinaryData::AEIOU_Warehouse1997_chowpreset, BinaryData::AEIOU_Warehouse1997_chowpresetSize); 58 59 // Carter 60 factoryPresets.emplace_back (BinaryData::Bad_Tape_Good_Player_chowpreset, BinaryData::Bad_Tape_Good_Player_chowpresetSize); 61 factoryPresets.emplace_back (BinaryData::Cozy_Unstable_chowpreset, BinaryData::Cozy_Unstable_chowpresetSize); 62 factoryPresets.emplace_back (BinaryData::Fast_Wobble_chowpreset, BinaryData::Fast_Wobble_chowpresetSize); 63 factoryPresets.emplace_back (BinaryData::Found_Tape_Player_chowpreset, BinaryData::Found_Tape_Player_chowpresetSize); 64 factoryPresets.emplace_back (BinaryData::Good_Tape_Bad_Player_chowpreset, BinaryData::Good_Tape_Bad_Player_chowpresetSize); 65 factoryPresets.emplace_back (BinaryData::INIT_chowpreset, BinaryData::INIT_chowpresetSize); 66 factoryPresets.emplace_back (BinaryData::Just_Warmth_chowpreset, BinaryData::Just_Warmth_chowpresetSize); 67 factoryPresets.emplace_back (BinaryData::Low_Cut_High_Cut_chowpreset, BinaryData::Low_Cut_High_Cut_chowpresetSize); 68 factoryPresets.emplace_back (BinaryData::Old_Telephone_chowpreset, BinaryData::Old_Telephone_chowpresetSize); 69 factoryPresets.emplace_back (BinaryData::Punchy_Lofi_Drums_chowpreset, BinaryData::Punchy_Lofi_Drums_chowpresetSize); 70 factoryPresets.emplace_back (BinaryData::That_Dirty_LoFi_chowpreset, BinaryData::That_Dirty_LoFi_chowpresetSize); 71 factoryPresets.emplace_back (BinaryData::ThatDirtyLofi_Less_Noise_chowpreset, BinaryData::ThatDirtyLofi_Less_Noise_chowpresetSize); 72 factoryPresets.emplace_back (BinaryData::Underwater_chowpreset, BinaryData::Underwater_chowpresetSize); 73 factoryPresets.emplace_back (BinaryData::Perc__Noise_After_Hit_chowpreset, BinaryData::Perc__Noise_After_Hit_chowpresetSize); 74 75 factoryPresets.emplace_back (BinaryData::Bass__Sub_Beef_chowpreset, BinaryData::Bass__Sub_Beef_chowpresetSize); 76 factoryPresets.emplace_back (BinaryData::Bass__Warm_Tape_chowpreset, BinaryData::Bass__Warm_Tape_chowpresetSize); 77 factoryPresets.emplace_back (BinaryData::Bass__808_Comp_and_Tone_chowpreset, BinaryData::Bass__808_Comp_and_Tone_chowpresetSize); 78 factoryPresets.emplace_back (BinaryData::Bass__808_Maker_chowpreset, BinaryData::Bass__808_Maker_chowpresetSize); 79 80 factoryPresets.emplace_back (BinaryData::Guitar__Phaser_Like_chowpreset, BinaryData::Guitar__Phaser_Like_chowpresetSize); 81 factoryPresets.emplace_back (BinaryData::Guitar__Short_Plucked_chowpreset, BinaryData::Guitar__Short_Plucked_chowpresetSize); 82 factoryPresets.emplace_back (BinaryData::Guitar__Slower_Chorus_chowpreset, BinaryData::Guitar__Slower_Chorus_chowpresetSize); 83 factoryPresets.emplace_back (BinaryData::Guitar__Vintage_Chorus_chowpreset, BinaryData::Guitar__Vintage_Chorus_chowpresetSize); 84 factoryPresets.emplace_back (BinaryData::Guitar__Breaking_Up_chowpreset, BinaryData::Guitar__Breaking_Up_chowpresetSize); 85 86 factoryPresets.emplace_back (BinaryData::High_Hats__Hats_Shorter_chowpreset, BinaryData::High_Hats__Hats_Shorter_chowpresetSize); 87 factoryPresets.emplace_back (BinaryData::High_Hats__Lofi_Vibe_chowpreset, BinaryData::High_Hats__Lofi_Vibe_chowpresetSize); 88 factoryPresets.emplace_back (BinaryData::High_Hats__Old_MPC_chowpreset, BinaryData::High_Hats__Old_MPC_chowpresetSize); 89 90 factoryPresets.emplace_back (BinaryData::Kick__A_Little_Punch_chowpreset, BinaryData::Kick__A_Little_Punch_chowpresetSize); 91 factoryPresets.emplace_back (BinaryData::Kick__Broken_Kick_chowpreset, BinaryData::Kick__Broken_Kick_chowpresetSize); 92 factoryPresets.emplace_back (BinaryData::Kick__In_the_Cut_chowpreset, BinaryData::Kick__In_the_Cut_chowpresetSize); 93 factoryPresets.emplace_back (BinaryData::Kick__LoFi_Kick_chowpreset, BinaryData::Kick__LoFi_Kick_chowpresetSize); 94 factoryPresets.emplace_back (BinaryData::Kick__LoFi_Kick_Short_chowpreset, BinaryData::Kick__LoFi_Kick_Short_chowpresetSize); 95 factoryPresets.emplace_back (BinaryData::Kick__Punch_Hi_Cut_chowpreset, BinaryData::Kick__Punch_Hi_Cut_chowpresetSize); 96 97 factoryPresets.emplace_back (BinaryData::Mix__Cassette_Like_chowpreset, BinaryData::Mix__Cassette_Like_chowpresetSize); 98 factoryPresets.emplace_back (BinaryData::Mix__Super_LoFi_chowpreset, BinaryData::Mix__Super_LoFi_chowpresetSize); 99 factoryPresets.emplace_back (BinaryData::Mix__30ips_Glue_chowpreset, BinaryData::Mix__30ips_Glue_chowpresetSize); 100 101 factoryPresets.emplace_back (BinaryData::Just_Tape_Noise_chowpreset, BinaryData::Just_Tape_Noise_chowpresetSize); 102 factoryPresets.emplace_back (BinaryData::Subtle_Tape_Noise_chowpreset, BinaryData::Subtle_Tape_Noise_chowpresetSize); 103 factoryPresets.emplace_back (BinaryData::Tape_Noise_Hard_Rain_chowpreset, BinaryData::Tape_Noise_Hard_Rain_chowpresetSize); 104 factoryPresets.emplace_back (BinaryData::Tape_Noise_Rain_chowpreset, BinaryData::Tape_Noise_Rain_chowpresetSize); 105 106 factoryPresets.emplace_back (BinaryData::Almost_LoFi_Piano_chowpreset, BinaryData::Almost_LoFi_Piano_chowpresetSize); 107 factoryPresets.emplace_back (BinaryData::Piano__Clean_Cassette_chowpreset, BinaryData::Piano__Clean_Cassette_chowpresetSize); 108 factoryPresets.emplace_back (BinaryData::Piano__Dirtier_Cassette_chowpreset, BinaryData::Piano__Dirtier_Cassette_chowpresetSize); 109 110 factoryPresets.emplace_back (BinaryData::Snare__Almost_Bitcrushed_chowpreset, BinaryData::Snare__Almost_Bitcrushed_chowpresetSize); 111 factoryPresets.emplace_back (BinaryData::Snare__Cut_the_Lows_chowpreset, BinaryData::Snare__Cut_the_Lows_chowpresetSize); 112 factoryPresets.emplace_back (BinaryData::Snare__LoFi_Vibe_chowpreset, BinaryData::Snare__LoFi_Vibe_chowpresetSize); 113 factoryPresets.emplace_back (BinaryData::Snare__Shorter_LoFi_chowpreset, BinaryData::Snare__Shorter_LoFi_chowpresetSize); 114 factoryPresets.emplace_back (BinaryData::Snare__Shorter_Snare_chowpreset, BinaryData::Snare__Shorter_Snare_chowpresetSize); 115 116 // Cool WAV 117 factoryPresets.emplace_back (BinaryData::CoolWAV_ChewLoss_chowpreset, BinaryData::CoolWAV_ChewLoss_chowpresetSize); 118 factoryPresets.emplace_back (BinaryData::CoolWAV_DriftwithMe_chowpreset, BinaryData::CoolWAV_DriftwithMe_chowpresetSize); 119 factoryPresets.emplace_back (BinaryData::CoolWAV_GoodbyeHighs_chowpreset, BinaryData::CoolWAV_GoodbyeHighs_chowpresetSize); 120 factoryPresets.emplace_back (BinaryData::CoolWAV_HeavyDrumloop_chowpreset, BinaryData::CoolWAV_HeavyDrumloop_chowpresetSize); 121 factoryPresets.emplace_back (BinaryData::CoolWAV_StudioTime_chowpreset, BinaryData::CoolWAV_StudioTime_chowpresetSize); 122 factoryPresets.emplace_back (BinaryData::CoolWAV_TapeWide_chowpreset, BinaryData::CoolWAV_TapeWide_chowpresetSize); 123 factoryPresets.emplace_back (BinaryData::CoolWAV_ThatsCool_chowpreset, BinaryData::CoolWAV_ThatsCool_chowpresetSize); 124 factoryPresets.emplace_back (BinaryData::CoolWAV_VibeDrive_chowpreset, BinaryData::CoolWAV_VibeDrive_chowpresetSize); 125 factoryPresets.emplace_back (BinaryData::CoolWAV_Wack_chowpreset, BinaryData::CoolWAV_Wack_chowpresetSize); 126 factoryPresets.emplace_back (BinaryData::CoolWAV_WowDude_chowpreset, BinaryData::CoolWAV_WowDude_chowpresetSize); 127 128 // RK 129 factoryPresets.emplace_back (BinaryData::Bleak_chowpreset, BinaryData::Bleak_chowpresetSize); 130 factoryPresets.emplace_back (BinaryData::Crane_I_chowpreset, BinaryData::Crane_I_chowpresetSize); 131 factoryPresets.emplace_back (BinaryData::Crane_II_chowpreset, BinaryData::Crane_II_chowpresetSize); 132 factoryPresets.emplace_back (BinaryData::Flavor_I_chowpreset, BinaryData::Flavor_I_chowpresetSize); 133 factoryPresets.emplace_back (BinaryData::Flavor_II_chowpreset, BinaryData::Flavor_II_chowpresetSize); 134 factoryPresets.emplace_back (BinaryData::Flow_I_chowpreset, BinaryData::Flow_I_chowpresetSize); 135 factoryPresets.emplace_back (BinaryData::Flow_II_chowpreset, BinaryData::Flow_II_chowpresetSize); 136 factoryPresets.emplace_back (BinaryData::High_Sauce_I_chowpreset, BinaryData::High_Sauce_I_chowpresetSize); 137 factoryPresets.emplace_back (BinaryData::High_Sauce_II_chowpreset, BinaryData::High_Sauce_II_chowpresetSize); 138 factoryPresets.emplace_back (BinaryData::Low_Grinder_chowpreset, BinaryData::Low_Grinder_chowpresetSize); 139 factoryPresets.emplace_back (BinaryData::Low_Rider_chowpreset, BinaryData::Low_Rider_chowpresetSize); 140 factoryPresets.emplace_back (BinaryData::Low_Smasher_chowpreset, BinaryData::Low_Smasher_chowpresetSize); 141 factoryPresets.emplace_back (BinaryData::Solid_Tape_I_chowpreset, BinaryData::Solid_Tape_I_chowpresetSize); 142 factoryPresets.emplace_back (BinaryData::Solid_Tape_II_chowpreset, BinaryData::Solid_Tape_II_chowpresetSize); 143 factoryPresets.emplace_back (BinaryData::Spice_I_chowpreset, BinaryData::Spice_I_chowpresetSize); 144 factoryPresets.emplace_back (BinaryData::Spice_II_chowpreset, BinaryData::Spice_II_chowpresetSize); 145 factoryPresets.emplace_back (BinaryData::String_Mojo_chowpreset, BinaryData::String_Mojo_chowpresetSize); 146 147 addPresets (factoryPresets); 148 loadDefaultPreset(); 149 } 150 151 chowdsp::Preset PresetManager::loadUserPresetFromFile (const File& file) 152 { 153 chowdsp::Preset compatiblePreset { file }; 154 if (compatiblePreset.isValid()) 155 return std::move (compatiblePreset); 156 157 auto xml = XmlDocument::parse (file); 158 if (xml == nullptr) 159 return compatiblePreset; 160 161 if (xml->getTagName() != chowdsp::Preset::presetTag.toString()) 162 return compatiblePreset; 163 164 auto name = xml->getStringAttribute (chowdsp::Preset::nameTag); 165 if (name.isEmpty()) 166 return compatiblePreset; 167 168 auto vendor = xml->getStringAttribute (chowdsp::Preset::vendorTag); 169 if (vendor.isEmpty()) 170 { 171 vendor = name.upToFirstOccurrenceOf ("_", false, false); 172 name = name.fromLastOccurrenceOf ("_", false, false); 173 } 174 175 auto category = xml->getStringAttribute (chowdsp::Preset::categoryTag); 176 177 auto* xmlState = xml->getChildElement (0); 178 if (xmlState == nullptr) 179 return compatiblePreset; 180 181 return { name, vendor, *xmlState, category, file }; 182 } 183 184 void PresetManager::loadPresetState (const XmlElement* xml) 185 { 186 StringArray presetAgnosticParams { "os_factor", 187 "os_mode", 188 "os_render_factor", 189 "os_render_mode", 190 "os_render_like_realtime", 191 MixGroupsConstants::mixGroupParamID }; 192 193 auto newState = juce::ValueTree::fromXml (*xml); 194 for (auto& param : presetAgnosticParams) 195 { 196 auto curParamTree = vts.state.getChildWithProperty ("id", param); 197 jassert (curParamTree.isValid()); 198 199 auto presetParamTree = newState.getChildWithProperty ("id", param); 200 if (presetParamTree.isValid()) 201 presetParamTree.copyPropertiesFrom (curParamTree, nullptr); 202 else 203 newState.appendChild (curParamTree.createCopy(), nullptr); 204 } 205 206 vts.replaceState (newState); 207 }