AnalogTapeModel

Physical modelling signal processing for analog tape recording
Log | Files | Refs | Submodules | README | LICENSE

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 }