MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ transform_crossfade_regions() [2/2]

template<OperationReadyData DataType>
DataType MayaFlux::Yantra::transform_crossfade_regions ( DataType &  input,
const std::vector< std::pair< Kakshya::Region, Kakshya::Region > > &  fade_regions,
uint32_t  fade_duration,
std::vector< std::vector< double > > &  working_buffer 
)

Cross-fade between regions with smooth transitions (OUT-OF-PLACE)

Template Parameters
DataTypeOperationReadyData type
Parameters
inputInput data - will NOT be modified
fade_regionsPairs of regions to crossfade
fade_durationDuration of fade in samples
working_bufferBuffer for operations (will be resized if needed)
Returns
Crossfaded data

Definition at line 364 of file MatrixHelper.hpp.

368{
369 // OLD: auto [target_data, structure_info] = OperationHelper::setup_operation_buffer(input, working_buffer);
370 auto setup_result = OperationHelper::setup_operation_buffer(input, working_buffer);
371 auto& target_data = std::get<0>(setup_result);
372 auto& structure_info = std::get<1>(setup_result);
373
374 std::ranges::for_each(fade_regions, [&target_data, fade_duration](const auto& fade_pair) {
375 const auto& [region_a, region_b] = fade_pair;
376
377 auto start_a = static_cast<uint64_t>(region_a.start_coordinates[0]);
378 auto end_a = static_cast<uint64_t>(region_a.end_coordinates[0]);
379 auto start_b = static_cast<uint64_t>(region_b.start_coordinates[0]);
380
381 uint64_t fade_start = (end_a > fade_duration) ? end_a - fade_duration : 0;
382 uint64_t fade_end = std::min(start_b + fade_duration, static_cast<uint64_t>(target_data[0].size()));
383
384 for (auto& channel_span : target_data) {
385 if (fade_start < fade_end && fade_start < channel_span.size()) {
386 auto fade_span = channel_span.subspan(fade_start, fade_end - fade_start);
387
388 auto fade_indices = std::views::iota(size_t { 0 }, fade_span.size());
389 std::ranges::for_each(fade_indices, [&fade_span](size_t i) {
390 double ratio = static_cast<double>(i) / (fade_span.size() - 1);
391 double smooth_ratio = 0.5 * (1.0 - std::cos(ratio * M_PI));
392 fade_span[i] *= (1.0 - smooth_ratio);
393 });
394 }
395 }
396 });
397
398 return OperationHelper::reconstruct_from_double<DataType>(working_buffer, structure_info);
399}

References MayaFlux::Yantra::OperationHelper::setup_operation_buffer().

+ Here is the call graph for this function: