diff --git a/cwFlow.cpp b/cwFlow.cpp index 4f8a0a0..8ce5c62 100644 --- a/cwFlow.cpp +++ b/cwFlow.cpp @@ -1871,9 +1871,10 @@ cw::rc_t cw::flow::apply_preset( handle_t h, const multi_preset_selector_t& mps bool secProbFl = cwIsFlag(mps.flags, kSecPresetProbFl ); bool interpFl = cwIsFlag(mps.flags, kInterpPresetFl ); bool allFl = cwIsFlag(mps.flags, kAllowAllPresetFl); - bool dryFl = cwIsFlag(mps.flags, kDryPriorityPresetFl); + bool dryPrioFl = cwIsFlag(mps.flags, kDryPriorityPresetFl); + bool drySelFl = cwIsFlag(mps.flags, kDrySelectedPresetFl); - printf("preset flags: pri:%i sec:%i interp:%i all:%i dry:%i\n",priProbFl,secProbFl,interpFl,allFl,dryFl); + printf("preset flags: pri:%i sec:%i interp:%i all:%i dry-(prio:%i sel:%i) n:%i\n",priProbFl,secProbFl,interpFl,allFl,dryPrioFl,drySelFl,mps.presetN); // verify that the set of candidate presets is not empty if( mps.presetN == 0 ) diff --git a/cwFlowDecl.h b/cwFlowDecl.h index 5f73166..ee503fa 100644 --- a/cwFlowDecl.h +++ b/cwFlowDecl.h @@ -10,7 +10,8 @@ namespace cw kSecPresetProbFl = 0x02, kInterpPresetFl = 0x04, kAllowAllPresetFl = 0x08, - kDryPriorityPresetFl = 0x10 + kDryPriorityPresetFl = 0x10, + kDrySelectedPresetFl = 0x20, }; typedef struct preset_order_str diff --git a/cwIoPresetSelApp.cpp b/cwIoPresetSelApp.cpp index b1e67f4..39e479d 100644 --- a/cwIoPresetSelApp.cpp +++ b/cwIoPresetSelApp.cpp @@ -90,6 +90,7 @@ namespace cw kPresetInterpCheckId, kPresetAllowAllCheckId, kPresetDryPriorityCheckId, + kPresetDrySelectedCheckId, kEnaRecordCheckId, @@ -202,6 +203,7 @@ namespace cw { kPanelDivId, kPresetInterpCheckId, "presetInterpCheckId" }, { kPanelDivId, kPresetAllowAllCheckId, "presetAllowAllCheckId" }, { kPanelDivId, kPresetDryPriorityCheckId, "presetDryPriorityCheckId" }, + { kPanelDivId, kPresetDrySelectedCheckId, "presetDrySelectedCheckId" }, @@ -938,14 +940,16 @@ namespace cw { unsigned multiPresetN = 0; - // allow-any-fl = pri-prob-fl && allow-any-flag - bool allowAnyFl = cwIsFlag(app->multiPresetFlags,flow::kAllowAllPresetFl) && cwIsFlag(app->multiPresetFlags,flow::kPriPresetProbFl); + // allow-any,dry-priority,dry-selected may only be set when pri-prob is set + bool allowAnyFl = cwIsFlag(app->multiPresetFlags,flow::kAllowAllPresetFl) && cwIsFlag(app->multiPresetFlags,flow::kPriPresetProbFl); bool dryPriorityFl = cwIsFlag(app->multiPresetFlags,flow::kDryPriorityPresetFl) && cwIsFlag(app->multiPresetFlags,flow::kPriPresetProbFl); + bool drySelectedFl = cwIsFlag(app->multiPresetFlags,flow::kDrySelectedPresetFl) && cwIsFlag(app->multiPresetFlags,flow::kPriPresetProbFl); unsigned activePresetFlags = 0; activePresetFlags = cwEnaFlag(activePresetFlags, preset_sel::kAllActiveFl, allowAnyFl); activePresetFlags = cwEnaFlag(activePresetFlags, preset_sel::kDryPriorityFl, dryPriorityFl); + activePresetFlags = cwEnaFlag(activePresetFlags, preset_sel::kDrySelectedFl, drySelectedFl); flow::multi_preset_selector_t mp_sel = { .flags = app->multiPresetFlags, @@ -3053,6 +3057,12 @@ rc_t _on_ui_play_loc(app_t* app, unsigned appId, unsigned loc); if((rc = _fragment_load_data(app)) != kOkRC ) rc = cwLogError(rc,"Preset data restore failed."); + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetInterpCheckId ), false ); + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetAllowAllCheckId ), false ); + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetDryPriorityCheckId ), false ); + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetDrySelectedCheckId ), false ); + + _on_live_midi_checkbox(app,app->useLiveMidiFl); return rc; @@ -3122,10 +3132,17 @@ rc_t _on_ui_play_loc(app_t* app, unsigned appId, unsigned loc); case kPriPresetProbCheckId: app->multiPresetFlags = cwEnaFlag(app->multiPresetFlags,flow::kPriPresetProbFl,m.value->u.b); + + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetAllowAllCheckId ), m.value->u.b ); + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetDrySelectedCheckId ), m.value->u.b ); + break; case kSecPresetProbCheckId: app->multiPresetFlags = cwEnaFlag(app->multiPresetFlags,flow::kSecPresetProbFl,m.value->u.b); + + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetInterpCheckId ), m.value->u.b ); + break; case kPresetInterpCheckId: @@ -3134,12 +3151,16 @@ rc_t _on_ui_play_loc(app_t* app, unsigned appId, unsigned loc); case kPresetAllowAllCheckId: app->multiPresetFlags = cwEnaFlag(app->multiPresetFlags,flow::kAllowAllPresetFl,m.value->u.b); + io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kPresetDryPriorityCheckId ), m.value->u.b ); break; case kPresetDryPriorityCheckId: app->multiPresetFlags = cwEnaFlag(app->multiPresetFlags,flow::kDryPriorityPresetFl,m.value->u.b); break; + case kPresetDrySelectedCheckId: + app->multiPresetFlags = cwEnaFlag(app->multiPresetFlags,flow::kDrySelectedPresetFl,m.value->u.b); + break; case kMidiThruCheckId: cwLogInfo("MIDI thru:%i",m.value->u.b); @@ -3404,6 +3425,10 @@ rc_t _on_ui_play_loc(app_t* app, unsigned appId, unsigned loc); case kPresetDryPriorityCheckId: io::uiSendValue( app->ioH, m.uuId, preset_cfg_flags(app->ioFlowH) & flow::kDryPriorityPresetFl ); break; + + case kPresetDrySelectedCheckId: + io::uiSendValue( app->ioH, m.uuId, preset_cfg_flags(app->ioFlowH) & flow::kDrySelectedPresetFl ); + break; case kWetInGainId: _on_echo_master_value( app, preset_sel::kMasterWetInGainVarId, m.uuId ); diff --git a/cwPresetSel.cpp b/cwPresetSel.cpp index 121a223..2a3d98f 100644 --- a/cwPresetSel.cpp +++ b/cwPresetSel.cpp @@ -41,6 +41,7 @@ namespace cw flow::preset_order_t* presetOrderA; // presetOrderA[ presetLabelN ] flow::preset_order_t* multiPresetA; // activePresetA[ presetLabelN ] + flow::preset_order_t* dryPresetOrder; // pointer to the dry preset in presetOrderA[] alt_label_t* altLabelA; unsigned altLabelN; @@ -928,6 +929,9 @@ cw::rc_t cw::preset_sel::create( handle_t& hRef, const object_t* cfg ) p->presetLabelA[i].label = mem::duplStr(label); p->presetOrderA[i].preset_label = p->presetLabelA[i].label; p->presetOrderA[i].order = 1; + + if( textIsEqual(p->presetOrderA[i].preset_label,"dry") ) + p->dryPresetOrder = p->presetOrderA + i; } @@ -964,6 +968,8 @@ cw::rc_t cw::preset_sel::create( handle_t& hRef, const object_t* cfg ) if( p->defaultPresetIdx == kInvalidIdx ) cwLogError(kInvalidStateRC,"No default preset was set."); + if( p->dryPresetOrder == nullptr ) + rc = cwLogError(kInvalidStateRC,"The 'dry' preset was not found."); hRef.set(p); @@ -1536,13 +1542,28 @@ const cw::flow::preset_order_t* cw::preset_sel::fragment_active_presets( handle count_ref = 0; - // if this is a dry-only fragment and dryOnlFy is set or if all active flag is not set - if( (cwIsFlag(flags,kDryPriorityFl) && f->dryOnlyFl) || cwIsNotFlag(flags,kAllActiveFl) ) - preset_order = _load_active_multi_preset_array(p,f,flags,count_ref); + // Note that kAllActiveFl,kDryPriorityFl,kDrySelectedFl will only be set + // when the preset is being selected probabilistically + + // if this fragment is dry-selected or dry-only and the associated flags are set + // then select then return the 'dry' preset + if( (cwIsFlag(flags,kDrySelectedFl) && f->drySelectedFl) || (cwIsFlag(flags,kDryPriorityFl) && f->dryOnlyFl) ) + { + preset_order = p->dryPresetOrder; + count_ref = 1; + } else { - preset_order = p->presetOrderA; - count_ref = p->presetLabelN; + // if all active is set then return all presets ... + if( cwIsFlag(flags,kAllActiveFl) ) + { + preset_order = p->presetOrderA; + count_ref = p->presetLabelN; + } + else // ... otherwise return the active presets only + { + preset_order = _load_active_multi_preset_array(p,f,flags,count_ref); + } } return preset_order; @@ -1762,12 +1783,18 @@ cw::rc_t cw::preset_sel::read( handle_t h, const char* fn ) _set_alt_str( p, f, i, alt_str ); if( playFl ) + { f->altPresetIdxA[0] = preset_idx; + + // if the dry preset is selected + if( preset_idx == dryPresetIdx ) + f->drySelectedFl = true; + } } // if only one preset is active and the dry preset is active - f->dryOnlyFl = activePresetN==1 && (f->presetA[dryPresetIdx].order>0 || f->presetA[dryPresetIdx].playFl); + f->dryOnlyFl = activePresetN==1 && (f->presetA[dryPresetIdx].order>0 || f->presetA[dryPresetIdx].playFl); } @@ -1795,7 +1822,7 @@ cw::rc_t cw::preset_sel::report( handle_t h ) unsigned elapsedMs = time::elapsedMs(t0,f->endTimestamp); double mins = elapsedMs / 60000.0; - cwLogInfo("%3i id:%3i end loc:%3i end min:%f dry-only:%i",i,f->fragId,f->endLoc, mins, f->dryOnlyFl); + cwLogInfo("%3i id:%3i end loc:%3i end min:%f dry-only:%i dry-sel:%i",i,f->fragId,f->endLoc, mins, f->dryOnlyFl, f->drySelectedFl); } return rc; @@ -1810,8 +1837,9 @@ cw::rc_t cw::preset_sel::report_presets( handle_t h ) for(; f!=nullptr; f=f->link) { - const char* dry_label = f->dryOnlyFl ? "dry" : ""; - cwLogPrint("%5i %5i %3s ",beg_loc,f->endLoc,dry_label); + const char* dry_only_label = f->dryOnlyFl ? "only" : ""; + const char* dry_sel_label = f->drySelectedFl ? "sel" : ""; + cwLogPrint("%5i %5i dry-(%4s %3s)",beg_loc,f->endLoc,dry_only_label,dry_sel_label); for(unsigned i=0; ipresetN; ++i) if( f->presetA[i].playFl || f->presetA[i].order!=0 ) cwLogPrint("(%s-%i) ", p->presetLabelA[ f->presetA[i].preset_idx ].label, f->presetA[i].order); diff --git a/cwPresetSel.h b/cwPresetSel.h index b395cf4..a18c6ec 100644 --- a/cwPresetSel.h +++ b/cwPresetSel.h @@ -32,7 +32,9 @@ namespace cw unsigned endPlayLoc; char* note; - bool dryOnlyFl; + bool dryOnlyFl; // there is one active preset and it is dry + bool drySelectedFl; // the dry preset was selected ('playFl' is set) + preset_t* presetA; // presetA[ presetN ] - status of each preset unsigned presetN; @@ -140,8 +142,9 @@ namespace cw unsigned fragment_seq_count( handle_t h, unsigned fragId ); enum { - kAllActiveFl = 0x01, - kDryPriorityFl = 0x02 + kAllActiveFl = 0x01, + kDryPriorityFl = 0x02, + kDrySelectedFl = 0x04 }; const flow::preset_order_t* fragment_active_presets( handle_t h, const frag_t* f, unsigned flags, unsigned& count_ref ); diff --git a/html/preset_sel/ui.cfg b/html/preset_sel/ui.cfg index d2096d5..9aa162a 100644 --- a/html/preset_sel/ui.cfg +++ b/html/preset_sel/ui.cfg @@ -29,6 +29,7 @@ check: { name: presetInterpCheckId, title: "Interp:"}, check: { name: presetAllowAllCheckId, title: "Allow All:" }, check: { name: presetDryPriorityCheckId,title: "Dry Priority:" }, + check: { name: presetDrySelectedCheckId,title: "Dry Selected:" }, }, row: {